S3C2440中断体系结构:外部中断实验

发布者:美梦小狮子最新更新时间:2020-06-19 来源: eefocus关键字:S3C2440  中断体系结构  外部中断 手机看文章 扫描二维码
随时随地手机看文章

1 SUBSRCPND和SRCPND表明有哪些中断被触发了

    INTSUMMSK和INTMSK寄存器用于屏蔽某些中断

2 中断触发→SUBSRCPND相应位置1→INTSUBMSK未屏蔽→SRCPND相应位置1→

                                                          ↑ 

                                                      中断触发

→若是FIQ中断:INTMOD相应位置1(同一时间,只能有一位置1)

→INTMSK未屏蔽→INTPND相应位置1(同一时间,只能有一位置1)

3 读取INTPND或INTOFFSET可以确定中断源

4 清除中断的顺序:SUBSRCPND(相应位写1)→SRCPND(相应位写1)→INTPND

5 自己觉得重要的几步:将相应引脚的功能设置为“外部中断”,设置中断触发条件,开启外设自己的屏蔽寄存器(若有)→INTSUBMSK中相应位设为0→FIQ:INTMOD相应位设为1

                                                     →IRQ:PRIORITY设置优先级

→IRQ:INTMSK相应位设为0→CPSR中的I和F位设为0,使能IRQ或FIQ

6 中断控制寄存器

(1)SUBSRCPND中几位若有一位置位,且未被INTSUBMSK屏蔽,则SRCPND中相应有一位置1(多对1的关系)

(2)INTMOD中设为1的为快速中断,设为0的为普通中断

(3)PRIORITY:中断优先级仲裁器6个输入引脚;PRIORITY中三位控制一个中断优先级仲裁器(总共7个),一位为ARB_MODE(仲裁器工作模式位),两位用于控制输入信号的优先级

具体哪位对应哪位:请查看S3C2440官方手册,上面写的很详细

(4)INTOFFSET:INTPND寄存器位[x]置1时,INTOFFSET寄存器的值为x,在清除SRCPND、INTPND时,INTOFFSET自动清除

7 外部中断实验:(实验用板:mini2440,是S3C2440的处理器,再参照原理图即可作相应调整)

(1)head.S

@******************************************************************************

@ File:head.S

@ 功能:初始化,设置中断模式、系统模式的栈,设置好中断处理函数

@******************************************************************************      

  

.extern     main  @引用其它文件中的mian标号

.text

.global _start

_start:

@******************************************************************************      

@ 中断向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用

@******************************************************************************      

    b   Reset

 

@ 0x04: 未定义指令中止模式的向量地址

HandleUndef:

    b   HandleUndef

 

@ 0x08: 管理模式的向量地址,通过SWI指令进入此模式

HandleSWI:

    b   HandleSWI

 

@ 0x0c: 指令预取终止导致的异常的向量地址

HandlePrefetchAbort:

    b   HandlePrefetchAbort

 

@ 0x10: 数据访问终止导致的异常的向量地址

HandleDataAbort:

    b   HandleDataAbort

 

@ 0x14: 保留

HandleNotUsed:

    b   HandleNotUsed

 

@ 0x18: 中断模式的向量地址

    b   HandleIRQ

 

@ 0x1c: 快中断模式的向量地址

HandleFIQ:

    b   HandleFIQ

 

Reset:                 

    ldr sp, =4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈

    bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启

   

    msr cpsr_c, #0xd2       @ 进入中断模式

    ldr sp, =3072           @ 设置中断模式栈指针

 

    msr cpsr_c, #0xdf       @ 进入系统模式

    ldr sp, =4096           @ 设置系统模式栈指针,

                            @ 其实复位之后,CPU就处于系统模式,

                            @ 前面的“ldr sp, =4096”完成同样的功能,此句可省略

 

    bl  init_led            @ 初始化LED的GPIO管脚

    bl  init_irq            @ 调用中断初始化函数,在init.c中

    msr cpsr_c, #0x5f       @ 设置I-bit=0,开IRQ中断

   

    ldr lr, =halt_loop      @ 设置返回地址

    ldr pc, =main           @ 调用main函数

halt_loop:

    b   halt_loop

 

HandleIRQ:

    sub lr, lr, #4                  @ 计算返回地址

    stmdb   sp!,    { r0-r12,lr }   @ 保存使用到的寄存器

                                    @ 注意,此时的sp是中断模式的sp

                                    @ 初始值是上面设置的3072

   

    ldr lr, =int_return             @ 设置调用ISR即EINT_Handle函数后的返回地址 

    ldr pc, =EINT_Handle            @ 调用中断服务函数,在interrupt.c中

int_return:

    ldmia   sp!,    { r0-r12,pc }^  @ 中断返回, ^表示将spsr的值复制到cpsr

   

(2)init.c

/*

 * init.c: 进行一些初始化

 */

 

#include "s3c24xx.h"

 

/*

 * LED1-4对应GPB5、GPB6、GPB7、GPB8

 */

#define GPB5_out        (1<<(5*2))      // LED1

#define GPB6_out        (1<<(6*2))      // LED2

#define GPB7_out        (1<<(7*2))      // LED3

#define GPB8_out        (1<<(8*2))      // LED4

 

/*

 * K1-K4对应GPG0、GPG3、GPG5、GPG6

 */

#define GPG0_eint      (2<<0)     // K1,EINT8

#define GPG3_eint       (2<<(3*2))      // K2,EINT11

#define GPG5_eint       (2<<(5*2))      // K3,EINT13

#define GPG6_eint       (2<<(6*2))      // K4,EINT14

 

 

/*

 * 关闭WATCHDOG,否则CPU会不断重启

 */

void disable_watch_dog(void)

{

    WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可

}

 

void init_led(void)

{

    GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out ;

}

 

/*

 * 初始化GPIO引脚为外部中断

 * GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD)

 */

void init_irq( )

{

 

    GPGCON  = GPG0_eint | GPG3_eint |GPG5_eint | GPG6_eint;

 

   //使能EINT8 EINT11 EINT13 EINT14

    EINTMASK&=(~(1<<8)) & (~(1<<11)) & (~(1<<13)) & (~(1<<14));

 

   //EINT8 EINT11 EINT13 EINT14中断优先级一样,无需设置

 

    // EINT8、EINT11、EINT13、EINT14使能

    INTMSK   &=(~(1<<5));

}

(3)interrupt.c

#include "s3c24xx.h"

 

void EINT_Handle()

{

    unsigned long oft = INTOFFSET;

    unsigned long val;

   

    if( oft==5)

        {  

            GPBDAT |= (0x0f<<5);   // 所有LED熄灭

           

            // 需要进一步判断是K1还是K2,或是K1、K2被同时按下

            val = EINTPEND;

            if (val & (1<<8))

                GPBDAT &= ~(1<<5);      // K1被按下,LED1点亮

            if (val & (1<<11))

                GPBDAT &= ~(1<<6);      // K2被按下,LED2点亮

         if (val & (1<<13))

                GPBDAT &= ~(1<<7);      // K3被按下,LED3点亮

            if (val & (1<<14))

                GPBDAT &= ~(1<<8);      // K4被按下,LED4点亮

        }       

 

    //清中断

[1] [2]
关键字:S3C2440  中断体系结构  外部中断 引用地址:S3C2440中断体系结构:外部中断实验

上一篇:mini2440上一步步实现将ADS工程移植到keilMDK
下一篇:S3C2440定时器4中断测试程序

推荐阅读最新更新时间:2024-10-28 17:06

S3C2440-DMA
[单片机]
uboot-2011.12移植到S3C2440(三)——硬件初始化:看门狗、中断、时钟
/* * turn off dog, see C18P3 */ ldr r0, =pWTCON mov r1, #0x0 str r1, /* * C14 * mask all IRQs by setting all bits in the INTMR - default */ mov r1, #0xffffffff ldr r0, =INTMSK str r1, ldr r1, =0x7fff ldr r0, =INTSUBMSK str r1, /* * FCLK:HCLK:P
[单片机]
s3c2440实验---定时器
 时钟是同步工作系统的同步节拍。  一、时钟的获得有很多种方式   1、外部直接输入时钟信号   2、外部晶振+内部时钟发生器(低频单片机)   3、外部晶振+内部时钟发生器+PLL+内部分频器 二、定时器内部结构   1、总时钟系统        详细说明:在2440刚刚开机的时候,由于PLL尚未开启,FCLK即等于外部输入时钟(12MHz),如果想提供时钟频率,则要开启PLL。PLL分为 MPLL和UPLL。其中UPLL是控制USB的,这与本实验无关。MPLL分为三种时钟FCLK(CPU核时钟)、HCLK(AHB总线设备时钟)、PCLK(APK总线设备时钟)。        2、实验内容:用定时器0实现led灯
[单片机]
<font color='red'>s3c2440</font>实验---定时器
ARM汇编外部中断
主要是中断向量表的设置和现场保护。 调试比较久的原因:使用main: b main时调试发现,不能死循环,可能是main标签是保留的 1)在主程序中的步骤一般是: 1.关中断,并设置各主要模式的堆栈指针和容量 2写1清SRCPND,INTPND寄存器 3.配置INTMSK使能相应中断 4.开全局中断 3)中断服务程序中的流程是: 1.屏蔽中断(硬件自动关irq中断) 2.执行任务 3.写1清相应SRPND,INTPND等寄存器(可以利用SRPND=SRPND,INTPND来清零,防止出错) 4.把屏蔽的中断使能回来 5.返回 参考u-boot的start.S自己写了一个外部中断程序,mini2440的按键K1
[单片机]
51单片机之——外部中断0(INT0)
寄存器是干什么的?怎么配置它?配置完寄存器后,有什么作用呢? 寄存器是中央处理器内的组成部分。它是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。寄存器可以用来暂存指令、暂存数据、暂存地址。换而言之,我们配置寄存器,便是给寄存器中赋予一定的值,而这些值又要与我们的目的想对应,这样它便会有相应的作用。 例如,芯片的资料规定,当给芯片的 A 寄存器赋“0x11”时,它会出现 B 现象;赋“0x77”时,它会出现 C 现象。那么当我们目的是完成 B 现象时,我们就只需要配置 A 寄存器为“0x11”即可。 虽说看起来很简单,并且去完成目的时的流程并非这么容易。但是,实实在在而言,这些就是控制寄存器的根本! 这里以外部中断0(
[单片机]
S3C2440串口通讯实现
一、目的 由于项目需求,要实现S3C2440串口与PC机的通讯。通过实验手册上的串口通讯示例了解串口的工作原理,实现简单的串口通讯实验。为进一步利用串口编程实现更加复杂的功能做准备。 实验效果:PC机上按下任意键,通过串口将字符传送至2440,2440又通过串口返回至PC机,并在DNW终端或超级终端显示该字符。 二、实验原理 PC机 ------- S3C2440开发板 S3C2440的UART提供了三个独立的异步串行I/O端口,每个都可以在中断和DMA两种模式下进行,他们支持的最高波特率是115.2Kbps。每个UART通道包含两个64字节的FIFO,分别提供数据接收和发送。 每个UART包含波特率发生
[单片机]
基于NRF9E5射频无线遥控系统的设计
   摘 要 介绍了一种基于8051内核的无线射频传输芯片nRF9E5,采用该芯片制作了扑翼微型飞行器的遥控系统,对遥控系统的收发装置进行了硬件设计,并对设计出的硬件系统进行了软件编程和系统的调试,实验表明,该系统具有成本少、功耗低、尺寸小的特点,能以较高质量在100~150米范围内进行信号的无线传输。    关键词 扑翼微型飞行器 遥控系统 射频 nRF9E5    1 引 言   现在和未来的飞行机器人 设计方向是期望机器人是小巧的、手提的、随身携带,可以像昆虫一样超低空飞行,能够灵活地完成侦察和搜索任务。多年来以军事用途为背景的无人飞行器(UAV—Unmanned Aerial Vehicle)研究一直十分活跃
[模拟电子]
S3C2440的裸机点亮led(直接修改机器代码)
程序开发流程 1.了解硬件原理 2.了解主芯片驱动硬件 3.写代码 4.跑代码 5.修改原有代码的机器码,达到我想要的功能 1.电路和原理图 由上图可知: led需要点亮,要给管脚一个低电平 2.芯片手册里它的详细描述 3.原有的代码编程与硬件实现图 5.修改原有代码的机器码,达到我想要的功能 在原有的机器码上修改其数据 为什么要这样修改机器码呐: 10101是配制的三个引脚为输出模式,11位跟10位的数据代表的意思是:10101向右移动 (8+4)*2 = 24位 那么就等于0x00001500,而前面的位数代码的是一些操作。如有不明白请发表评论。 下载代码: 硬件图的实现:
[单片机]
<font color='red'>S3C2440</font>的裸机点亮led(直接修改机器代码)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved