由一次对arm7的中断选择寄存器(VICIntSelect)赋值而引发的思考

芯片型号为lpc2138,编译环境为keil4,采用j-link下载
由于程序中运用到了多个向量IRQ中断,于是为了方便便采用了如下写法

VICIntSelect = VICIntSelect&((~(1<<14))|(~(1<<17)));
 //EINT0,3中断分配为向量IRQ中断

观察赋值结果,发现原本想要赋值为0的位全部变成了1,

由于一开始并没有发现什么异常,于是继续往下写,往下需要加入一个RTC秒增量中断,由于RTC对应的通道号为13,于是进行如下赋值:

VICIntSelect |= (~(1<<13));

编译运行后,发现,程序莫名其妙的进入了FIQ服务子程序,但是我却没有对相关的寄存器进行操作,这个FIQ的服务子程序是老师给的ucos 2源代码中有的,只在startup.s中有相关的汇编代码,由于本人不懂汇编,所以只能猜测是由于对VICIntSelect 的赋值导致莫一位赋值为1,选择了FIQ中断,
于是我把上面两句全删了,直接来了个简单粗暴的方法,

VICIntSelect==0x0;

没想到,程序却能正常的进入RTC秒增量中断,
于是上网试着百度了下VICIntSelect的写法,没找到相关关于这个赋值写法问题的讨论,
(可能是我的搜索的关键字不对)于是斗胆在此猜测是由于以上赋值引起的,
关于这种多个中断该如何赋值的问题,若有大神有好的见解,忘不吝赐教!
先写在这里,待以后弄明白再来修改!

猜你喜欢

转载自blog.csdn.net/moluoyu/article/details/46575575