本帖最后由 Sy1vester 于 2021-4-25 18:22 编辑
AC781x和AC7801x芯片有0-15级抢占优先级,没有响应优先级,这里通过设置各中断的抢占优先级的方式,来演示如何使用AC78xx系列芯片的中断优先级设置。
例程里面设置了三个外部中断:TIMER、RTC、GPIO,和一个内部NMI中断。
优先级为NMI>GPIO>RTC>TIMER。
NMI为内部中断,优先级仅次于RESET,不可以通过软件映射的方式设置优先级。
GPIO中断优先级设置为1
RTC中断优先级设置为2
TIMER中断优先级设置为3
所有外部中断在没有调用NVIC_SetPriority()函数的情况下,优先级默认为0
将PB2引脚设置为NMI中断引脚,并设置NMI唤醒功能(该函数使能NMI中断),然后通过SPM_EnableModuleSPMIRQ(SPM_MODULE_NMI, 0),设置NMI触发NMI中断而不是SPM中断,这个地方不理解的可参照AC781x参考手册的6.4章节的“外设触发 SPM 中断或 外设中断配置寄存器”为什么这样设置。
然后在对应的TIMER、RTC、GPIO及NMI中断设置需要的现象,用来表明MCU此时正在运行的函数。
例程功能是TIMER翻转LED2,RTC翻转LED2,GPIO关闭LED显示,NMI打开LED显示,并在对应的中断回调函数中通过串口打印正在执行的中断函数。在对应的高优先级中断函数执行完毕后,继续执行低优先级的函数,高优先级的中断可以打断低优先级的中断,低优先级的中断不可以打断高优先级的中断。具体现象可以仿真例程。
在较大的工程中使用多级中断的时候,记得将栈空间设置大一点,不然在栈空间不足的时候会触发hardfault中断。同时因为例程为了使中断被打断的现象明显,在各个中断函数中使用了mdelay函数,该函数使用了滴答定时器,滴答定时器在退出中断函数的时候会自行关闭,这就会导致程序可能会因为程序卡死在滴答定时器里面,具体原因可以参考CSDN的这个帖子https://blog.csdn.net/ima_xu/article/details/103595720,这里就不赘述了。处理办法如下图:
最后附上例程,互相学习
|