ARM7(sc44b0)外部中断笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM7(sc44b0)外部中断笔记
对于sc44b0它也是一种单片机,一种比较高级的单片机而已,所以他也跟51单片机一样有外部中断,不同51单片机的是,他有8个外部中断源,对应的是8个管脚,(51只有两个,int0和int1,P3.3和P3.4),分别是Port G八个管脚。
而对于外部中断4 \5\6\7很多都是共用寄存器,他们是通过或逻辑公用一个中断请求线。
下面就具体来说说使用外部中断的一些必要的配置。
一,对管脚的配置,因为Port G有三种功能用法,要通过对rPCONG(端口G
配置寄存器)的配置来选用Port G
的外部中断的功能。
其配置表如下
所以应该将其配置为11(设置为中断功能状态);
二,中断模式的选择,中断模式有两种,FIQ(快速中断模式)和 IRQ(中断模式)两种,一般没有特殊要求都用IRQ模式即可。
可以通过对中断模式寄存器rINTMOD配置获得。
如表下
三,是否允许中断,即中断使能位。
通过对中断控制寄存器INTCON的配置即可,如表下通过对中断控制寄存器的配置即可,
可以看出只要让intcon的【1】位置零即可使中断使能。
四,外部中断方式的选择,低电平或上升沿触发呢,还是别的,这就要对外部中断方式寄存器(EXTINT)的配置,其表如下
由上表可知,如果要用下降沿触发,就可将EXTINT 的值给0x22222222;
将所有的外部中断都设置为下降沿触发。
五,当中断捕抓到以后,要引起什么变化呢?或者说用什么来捕抓呢?在sc44b0中用了两个寄存器来捕抓,一个中断挂起寄存器(INTPND),和外部中断挂起寄存器(EXINTPND),一开始不明白挂起是什么意思,后来才懂,差不多就相当与51单片机的标志位一样,当中断发生后,就将挂起寄存器的对应的某一位置一或置零,外部中断挂起寄存器如表下
中断挂起寄存器:当中断产生后,是将INTPND的【21】位置一的;
所以,判断有无外部中断,就可以通过读取挂起寄存器对应的为,即可知道是否有无中断。
六,当中断发生后,挂起寄存器的对应位(即中断标志位)也发生了置位,那如果要检测下一个中断,就得将挂起寄存器的对应为复原,那怎么复原呢?在51单片机中是将中断标志位软件置零就可,在44b0中也是同样的道理,它是通过将对应的中断挂起寄存器的位置一就行了,对于EXTINTPND,他是直接将对应的位置一,对于EXTINTPND是通过将rI_ISPC的对应位置一(EXTINTPND和I_ISP的位数是一样的,两个是相互对应的)
附上程序;
#define EXTINT4 0
#define EXTINT5 1
#define EXTINT6 2
#define EXTINT7 3
#define EXTINT4567 21
#define INTTRIG_LOW 0x00
#define INTTRIG_HIGH 0x01
#define INTTRIG_FALLING 0x02
#define INTTRIG_RISING 0x04
#define INTTRIG_BOTHEDGE 0x05
void KeyLedTest (void)
{
U32 dwVal;
//设置IO 口PORT G
rPCONG |= 0xff00;//设置GP4--GP7为中断输入脚配置11的时候为中断输入脚
//设置中断
rINTMOD &= ~MASK_BIT(21);//中断模式寄存器即设置为快速中断或普通中断mo
//rINTMOD &= ~MASK_BIT(21)作用是让rINTCON的21位置零
//0是IRQ是指中断模式,1是FIR是指快速中断模式 rINTCON &= ~MASK_BIT(1);//INTCON第一位为0表示允许所有中断
//设置EXTINT4,5,6,7中断模式,我们这里使用低电平触发
// rEXTINT &= 0xffff; //先清除EXTINT4,5,6,7的相应设置bit位
// 外部中断寄存器,设置为双边沿触发
for (;;)
{
dwVal = rINTPND;
if ((dwVal & MASK_BIT(21)) == 0)
{
continue;
}
//EXTINTPND 寄存器,判断是哪个外部中断触发
dwVal = rEXTINTPND;//仿真的时候实际上是到这里的时候读取
// rEXTINTPND外部中断挂起寄存器
if ((dwVal & MASK_BIT(EXTINT4)) != 0)//判断rINTPND对应的挂起中断 //寄存器是否为0或1
{
rEXTINTPND |= MASK_BIT(EXTINT4);//絩EXTINTPND 的EXTINT4位置一清 除EXTINTPND 是通过对EXTINTPND 对应的位写1来清除的
//外部中断4 产生了,点亮LED1
sysUtilsLightLed (LED1, TRUE);
printf("LED1 is on;\n");
}
if ((dwVal & MASK_BIT(EXTINT5)) != 0)
{
rEXTINTPND |= MASK_BIT(EXTINT5);
//外部中断4 产生了,点亮LED2
sysUtilsLightLed (LED2, TRUE);
printf("LED2 is on;\n");
}
if ((dwVal & MASK_BIT(EXTINT6)) != 0)
{
rEXTINTPND |= MASK_BIT(EXTINT6);
//外部中断4 产生了,点亮LED3
sysUtilsLightLed (LED3, TRUE);
printf("LED3 is on;\n");
}
if ((dwVal & MASK_BIT(EXTINT7)) != 0)
{
rEXTINTPND |= MASK_BIT(EXTINT7);
//外部中断4 产生了,点亮LED1,2,3
sysUtilsLightLed (LED_ALL, FALSE);
printf("all leds灯 is off;\n");
}
//最后清除中断位
//rI_ISPC |= MASK_BIT(21);
rI_ISPC = dwVal;//对I_ISPC/ F_ISPC写入1,INTPND 将被自动清除 }
}。