arm学习过程中中断嵌套问题

上传人:第*** 文档编号:37069136 上传时间:2018-04-06 格式:DOCX 页数:5 大小:15.46KB
返回 下载 相关 举报
arm学习过程中中断嵌套问题_第1页
第1页 / 共5页
arm学习过程中中断嵌套问题_第2页
第2页 / 共5页
arm学习过程中中断嵌套问题_第3页
第3页 / 共5页
arm学习过程中中断嵌套问题_第4页
第4页 / 共5页
arm学习过程中中断嵌套问题_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《arm学习过程中中断嵌套问题》由会员分享,可在线阅读,更多相关《arm学习过程中中断嵌套问题(5页珍藏版)》请在金锄头文库上搜索。

1、ARMARM 学习过程中中断嵌套问题学习过程中中断嵌套问题ARM 的中断管理体系和 51 系列微控制器的中断管理体系不太一样。熟悉 51 体系结构的用户需要特别注意这一点。ARM 的中断不会自动嵌套,实现 ARM 微控制器的中断嵌套比较烦琐,我们不提倡中断嵌套。但不排除需要嵌套的应用,因而在启动代码中,有对中断嵌套的处理。模板中的文件 IRQ.S 用于处理中断嵌套,是以下中断处理方法的依据。用户要根据自己的应用更改此文件,只需要在文件末尾添加中断处理程序的句柄即可。中断嵌套的原则:低优先级的中断嵌套高优先级的中断。可嵌套中断服务程序编写方法:1、保存当前中断使能寄存器 VICIntEnable

2、 的值;2、禁止当前中断和低优先级中断;3、清除中断逻辑,使 VIC 能够响应更高优先级的中断;4、中断处理服务程序;5、恢复保存的中断使能寄存器的值。声明需要嵌套的中断服务程序时,不能使用_irq关键字,而需要通过句柄的方式进行。请注意 IRQ.S 中宏$IRQ_Label HANDLER $IRQ_Exception_Function 的用法。例子如下:/* 文 件 名:VIC_Nesting.c* 功 能:本实验演示中断嵌套现象。程序开启了两个中断:定时器 0 和外部中断 0。定时器 0 使LED8LED1* 闪烁,而外部中断 0 取反蜂鸣器控制口。分配定时器 0 中断优先级高于外部中断

3、 0 的优先级。设置* KEY1 连接外部中断 0。按住 KEY1 键后全速运行程序,看 LED8LED1 能否闪烁,若闪烁,则说明中* 断嵌套成功。需要在文件 IRQ.S 末尾添加句柄:* Timer0_Handler HANDLER IRQ_Timer0* Eint0_Handler HANDLER IRQ_Eint0* 说 明:用跳线帽短接 KEY1,BEEP,74HC595_2 相关跳线。*在产生 IRQ 中断,进入服务程序之前,IRQ 中断将自动禁止,而 Fiq 中断依然使能,故在 IRQ 中断下依然要响应 Fiq 中断。*/#include config.h#define BEEP

4、CON (uint32)0x017) / P0.7 引脚控制蜂鸣器,低电平蜂鸣#define BEEP_ON() IO0CLR=BEEPCON / P0.7 引脚输出低电平,蜂鸣器蜂鸣#define BEEP_OFF() IO0SET=BEEPCON / P0.7 引脚输出高电平,蜂鸣器不蜂鸣#define SPI_CS (uint32)0x0120) / P1.20 引脚模拟 SPI 的片选信号#define SPI_DATA (uint32)0x0122) / P0.22 引脚模拟 SPI 的数据信号#define SPI_CLK (uint32)0x0125) / P1.25 引脚模拟

5、SPI 的时钟信号#define H_SPI_CS() IO1SET=SPI_CS / SPI 的片选信号置高 #define L_SPI_CS() IO1CLR=SPI_CS / SPI 的片选信号置低#define H_SPI_DATA() IO0SET=SPI_DATA / SPI 的数据信号置高#define L_SPI_DATA() IO0CLR=SPI_DATA / SPI 的数据信号置低#define H_SPI_CLK() IO1SET=SPI_CLK / SPI 的时钟信号置高#define L_SPI_CLK() IO1CLR=SPI_CLK / SPI 的时钟信号置低vo

6、id Timer0_Handler(void);void Eint0_Handler(void);uint8 data;/* 函数名称:SendDataTo74HC595()* 功 能:向 74HC595 发送一字节数据* 入口参数:data 要发送的数据* 出口参数:无* 注 意:发送数据时,高位先发送*/void SendDataTo74HC595(uint8 data)uint8 i;L_SPI_CS(); / SPI_CS=0for(i=0;i8;i+) / 发送 8 位数据(1 个字节)L_SPI_CLK(); / SPI_CLK=0/* 设置 SPI_DATA 输出值 */if(d

7、ata / SPI_DATA=1elseL_SPI_DATA(); / SPI_DATA=0data=1; / 将要发送的 1 字节数据左移一位H_SPI_CLK(); / SPI_CLK=1H_SPI_CS(); / SPI_CS=1 /* 函数名称:IRQ_Timer0()* 功 能:Timer0 中断服务函数,LED8LED1 闪烁* 入口参数:无* 出口参数:无*/void IRQ_Timer0(void)uint32 bak;bak=VICIntEnable; / 备份当前 VICIntEnable 的值VICIntEnClr=(14)|(114); / 禁止当前优先级中断及低优先级

8、中断VICVectAddr=0x00; / 清除中断逻辑,以便 VIC 可以响应更高优先级IRQ 中断/* LED8LED1 闪烁 */if(data=0x00) data=0xff;elsedata=0x00;SendDataTo74HC595(data);T0IR=0x01; / 清除 Timer0 中断标志VICIntEnable=bak;/* 函数名称:IRQ_Eint0()* 功 能:外部中断 0 中断服务函数,取反蜂鸣器控制口,允许中断嵌套* 入口参数:无* 出口参数:无*/void IRQ_Eint0(void)uint32 bak;bak=VICIntEnable; / 备份当

9、前 VICIntEnable 的值VICIntEnClr=114; / 禁止当前中断VICVectAddr=0x00; / 清除中断逻辑,以便 VIC 可以响应更高优先级IRQ 中断IRQEnable(); / 使能 IRQ 中断 /* 取反蜂鸣器控制口 */if(IO0PIN elseBEEP_ON();/* 等待外部中断信号恢复为高电平,清除 EINT0 中断标志*/while(EXTINT VICIntEnable=bak;/* 函数名称:main()* 功 能:初始化定时器 0,设置定时器 0 中断和外部中断 0*/int main(void)PINSEL0 / 将 P0.7 引脚选择

10、为 GPIO 功能IO0DIR|=BEEPCON; / 设置 P0.7 为输出BEEP_OFF(); / 蜂鸣器禁止蜂鸣PINSEL1 / 将 P0.16 引脚选择为 EINT0 功能PINSEL1|=0x00000001;PINSEL1 / 设置 P0.22 引脚为 GPIOPINSEL2 / 设置 P1.20 和 P1.25 引脚为 GPIOIO0DIR|=SPI_DATA; / 设置 P0.22,P1.20,P1.25 引脚为输出IO1DIR|=(SPI_CS | SPI_CLK); /* Timer0 初始化*/T0TC=0; / 定时器设置为 0 T0PR=0; / 时钟不分频T0MCR=0x03; / 设置 T0MR0 匹配后复位 T0TC,并产生中断标志T0MR0=Fpclk/10; / 0,1 秒定时T0TCR=0x01; / 启动定时器IRQEnable();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号