[学习笔记] NVIC中断优先级例程

[复制链接]
3656|5
 楼主| Sy1vester 发表于 2021-4-25 18:17 | 显示全部楼层 |阅读模式
本帖最后由 Sy1vester 于 2021-4-25 18:22 编辑

AC781x和AC7801x芯片有0-15级抢占优先级,没有响应优先级,这里通过设置各中断的抢占优先级的方式,来演示如何使用AC78xx系列芯片的中断优先级设置。
例程里面设置了三个外部中断:TIMER、RTC、GPIO,和一个内部NMI中断。
优先级为NMI>GPIO>RTC>TIMER。
435160853bf2b5c8e.png
NMI为内部中断,优先级仅次于RESET,不可以通过软件映射的方式设置优先级。
7676660853c602e076.png
GPIO中断优先级设置为1
6749260853c8d41488.png
RTC中断优先级设置为2
5167460853cb190ac4.png
TIMER中断优先级设置为3
所有外部中断在没有调用NVIC_SetPriority()函数的情况下,优先级默认为0
9621460853d484c02d.png
将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显示,并在对应的中断回调函数中通过串口打印正在执行的中断函数。在对应的高优先级中断函数执行完毕后,继续执行低优先级的函数,高优先级的中断可以打断低优先级的中断,低优先级的中断不可以打断高优先级的中断。具体现象可以仿真例程。
334160853fd99b15a.png
在较大的工程中使用多级中断的时候,记得将栈空间设置大一点,不然在栈空间不足的时候会触发hardfault中断。同时因为例程为了使中断被打断的现象明显,在各个中断函数中使用了mdelay函数,该函数使用了滴答定时器,滴答定时器在退出中断函数的时候会自行关闭,这就会导致程序可能会因为程序卡死在滴答定时器里面,具体原因可以参考CSDN的这个帖子https://blog.csdn.net/ima_xu/article/details/103595720,这里就不赘述了。处理办法如下图:
15726608541794f664.png
最后附上例程,互相学习

NVIC_Interrupt.rar

948.73 KB, 下载次数: 164

XS128 发表于 2021-5-22 15:34 | 显示全部楼层
谢谢,分享
两只袜子 发表于 2021-6-9 10:41 来自手机 | 显示全部楼层
相互学习,相互支持
自己造声卡 发表于 2021-6-9 12:14 | 显示全部楼层
这个资料确实不错,很棒的,感谢楼主的分享。很棒的。
lidi911 发表于 2021-6-9 20:39 来自手机 | 显示全部楼层
学习学习,谢谢讲解。
sparrow054 发表于 2021-6-11 12:41 | 显示全部楼层
中断是让初学者头疼的一个点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:合肥杰发科技有限公司
简介:四维图新全资子公司 全球多地布局;专注于汽车电子芯片及相关系统的研发与设计 车规级芯片覆盖整车;客户遍及海内外 全球超过8000万辆车搭载杰发科技芯片。

10

主题

111

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部