21.1 NVIC基础知识
NVIC的全称是Nested vectored interrupt controller,即嵌套向量中断控制器。
对于M3/M4/M7内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的。8位的话就可以设置2^8 = 256级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。比如ST的STM32F1xx,F4xx和H7只使用了这个8位中的高四位[7:4],低四位取零,这样2^4=16,只能表示16级中断嵌套。
对于这个NVIC,有个重要的知识点就是优先级分组、抢占优先级和子优先级。STM32F1xx,F4xx和H7都是只使用了这个8位寄存器的高四位[7:4]。
从上面的表格可以看出,STM32支持5种优先级分组。系统上电复位后,默认使用的是优先级分组0,也就是没有抢占式优先级,只有子优先级。关于这个抢占优先级和子优先级有几点一定要说清楚。
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以抢占低抢占式优先级的中断的执行。
在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来,那么高子优先级的中断优先被响应。
在抢占式优先级相同的情况下,如果有低子优先级中断正在执行,高子优先级的中断要等待已被响应的低子优先级中断执行结束后才能得到响应,即子优先级不支持中断嵌套。
Reset、NMI、Hard Fault 优先级为负数,高于普通中断优先级,且优先级不可配置。
初学者还有一个比较纠结的问题,就是系统中断(比如:PendSV,SVC,SysTick)是不是一定比外部中断(比如SPI,USART)要高。答案:不是的,它们是在同一个NVIC下面设置的。
掌握了这些基础知识基本就够用了。另外特别注意一点,配置抢占优先级和子优先级,它们合并成的4bit数字的数值越小,优先级越高,这一点千万不要搞错了。
21.2 常用的NVIC API
下面将外设配置中经常用到的两个函数做个说明。
HAL_NVIC_SetPriority
HAL_NVIC_EnableIRQ
21.2.1 函数HAL_NVIC_SetPriority
函数原型:
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
函数描述:
此函数主要用于设置中断的抢占优先级和子优先级。
函数参数:
1、 第1个参数IRQn是中断号,由IRQn_Type定义的枚举类型,原始定义在stm32h743x.h。
typedef enum
{
/* 部分定义,其它省略未写 */
PendSV_IRQn = -2,
SysTick_IRQn = -1,
DMA1_Stream3_IRQn = 14,
DMA1_Stream4_IRQn = 15,
DMA1_Stream5_IRQn = 16,
DMA1_Stream6_IRQn = 17,
ADC_IRQn = 18,
} IRQn_Type;
2、 第2个参数PreemptPriority用于设置抢占优先级,范围0 - 15。
3、 第3个参数SubPriority用于设置子优先级,范围0 -15。
使用举例:
此函数的调用比较简单,比如设置ADC中断的抢占优先级是1,子优先级是0,那么此函数的设置就是:HAL_NVIC_SetPriority(ADC_IRQn, 1, 0)。
21.2.2 函数HAL_NVIC_EnableIRQ
函数原型:
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
函数描述:
此函数主要用于使能中断。
函数参数:
1、第1个参数IRQn是中断号,由IRQn_Type定义的枚举类型,原始定义在stm32h743x.h。
typedef enum
{
/* 部分定义,其它省略未写 */
PendSV_IRQn = -2,
SysTick_IRQn = -1,
DMA1_Stream3_IRQn = 14,
DMA1_Stream4_IRQn = 15,
DMA1_Stream5_IRQn = 16,
DMA1_Stream6_IRQn = 17,
ADC_IRQn = 18,
} IRQn_Type;
注意事项:
调用此函数前要先调用优先级分组设置函数NVIC_PriorityGroupConfig,而这个函数会在HAL_Init里面被调用。函数基本都会在main函数里面优先被调用,所以保证HAL_Init优先被调用即可。
使用举例:
此函数的调用比较省事,比如使能ADC中断,那么此函数的设置就是:
HAL_NVIC_EnableIRQ (ADC_IRQn, )。
21.3 MDK中查看实际优先级配置
如果想查看配置的外设优先级是否正确设置了,MDK进入调试状态后,先点击全速运行,然后查看如下调试组件:
弹出如下窗口,在这个窗口里面就可以查看实际优先级了,比如滴答定时器Systick的优先级就是240,即240>>4 = 15。
21.4 开关中断
V7开发板的BSP驱动包在bsp.h文件里面对开关中断做了一个宏定义:
/* 开关全局中断的宏 */
#define ENABLE_INT() __set_PRIMASK(0) /* 使能全局中断 */
#define DISABLE_INT() __set_PRIMASK(1) /* 禁止全局中断 */
__set_PRIMASK就是对寄存器primask做的开关设置,如下表所示:
对于寄存器basepri我们举一个例子,帮助大家理解。比我们配置寄存器basepri(对于STM32H7,范围0-255)的数值为16,所有优先级数值大于等于16的中断都会被关闭,优先级数值小于16的中断不会被关闭。但0比较特殊,对寄存器basepri寄存器赋值0,那么被关闭的中断会被打开。
21.5 总结
最后,我们再强调一下,在NVIC分组为4的情况下,抢占优先级可配置范围是0-15,那么数值越小,抢占优先级的级别越高,即0代表最高优先级,15代表最低优先级。
上一篇:【STM32H7教程】第22章 STM32H7的SysTick实现多组软件定时器
下一篇:【STM32H7教程】第20章 STM32H7的GPIO应用之无源蜂鸣器
推荐阅读
史海拾趣
为了进一步扩大规模和提升竞争力,意华先后成立了多家子公司,包括苏州意华电工有限公司、东莞意兆电子科技有限公司等。这些子公司的成立,不仅实现了公司在不同地域的资源整合和优势互补,也加速了公司的集团化发展进程。通过集团化管理,意华能够更好地协调各子公司之间的业务和资源,提高整体运营效率。
在追求业务发展的同时,Holy Stone始终注重品质提升和环境管理。公司陆续通过了ISO9001、ISO14001、QS9000、ISO/TS16949等国际认证,确保了产品的高品质和环保性。这些认证不仅提升了公司的品牌形象和市场竞争力,还为客户提供了更加可靠的产品和服务。此外,公司还积极履行社会责任,在环境治理、社会参与等方面做出了具体贡献。
ESTEK公司自创立之初,就专注于电子产品的技术创新。在早期的市场竞争中,公司研发团队通过不懈努力,成功研发出一款具有革命性意义的电子元件。这款元件不仅性能卓越,而且成本远低于同类产品,使得ESTEK公司迅速在市场上脱颖而出。随着这款元件的广泛应用,ESTEK公司的知名度逐渐提升,为公司的后续发展奠定了坚实基础。
APX Technologies在成立初期就专注于研发高性能的半导体芯片。经过数年的努力,公司成功开发出一种具有革命性的低功耗芯片技术,这一技术极大地提高了电子设备的能效比。随着这一技术的广泛应用,APX Technologies迅速在电子行业中崭露头角,赢得了众多客户的青睐。
在市场竞争日益激烈的情况下,AVA电子意识到单打独斗已经难以应对市场的挑战。于是,公司开始寻求与上下游企业的合作,通过产业链整合实现协同发展。AVA电子与供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和质量保障;同时,公司还与多家销售渠道商建立了战略合作关系,共同开拓市场。这种产业链整合的模式不仅降低了公司的运营成本,也提高了公司的市场竞争力。
Emmoco一直将品质管理作为公司发展的核心。公司建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,Emmoco还注重持续改进,通过引入先进的生产设备和工艺、优化生产流程等方式,不断提高产品质量和生产效率。这些举措使得Emmoco的产品在市场上赢得了良好的口碑和声誉。
引言 近年来,从手持消费电子到工业控制系统,嵌入式处理器的应用已经深入到人们工作和生活的方方面面,在某些应用领域,系统需要提供如1280×1024这类高分辨率的显示界面,而多数嵌入式处理器不能支持,或者在高分辨率下提供的显示效果不好。 ...… 查看全部问答∨ |
2007年全国大学生电子设计竞赛 题目推测汇总(不断更新中8.30) 本帖最后由 paulhyde 于 2014-9-15 04:19 编辑 2007年全国大学生电子设计竞赛 题目一: 一、 设计任务 设计一多功数字自适应电参数测试仪 二、设计要求 1、 基本要求 系统功能具体要求如下: (1)基本输入信号: 电 阻:电阻0~1MΩ。 输 ...… 查看全部问答∨ |
本帖最后由 paulhyde 于 2014-9-15 09:50 编辑 毕业设计要求找一个20000字符的英文文献 翻译过来 急求!!!!!!! … 查看全部问答∨ |
|
请教各位硬件实验PlatForm Builder 平台有关的问题 最近老师让交个硬件实验设计 ,要求在PlatForm Builder平台下实现,请教各位PlatForm Builder平台怎么装,有些同学装上这个平台不是系统崩溃,就是电脑运行速度速减,请教各位了,谢谢… 查看全部问答∨ |
关键词:LED、WLED、白光 LED、CCFL、便携式 MFF 显示器、TPS61195、德州仪器、TI 为便携式 MFF 显示器选择最佳的 LED 背光驱动器 作者:Jeff Falin,德州仪器 (TI) 工厂应用工程师 摘要 白光 LED 将迅速取代冷阴极灯 ...… 查看全部问答∨ |
新手写了一个用1602液晶在第二行第一位显示字母A的程序,程序可以通过编译,但是液晶上部显示,不知道什么原因?求助解答,谢谢 LIST P=16F873a ; 告诉编译程序使用何种PIC单 ...… 查看全部问答∨ |
本帖最后由 gaon 于 2014-1-24 14:49 编辑 TI推广又一年。参加活动送了些开发板, 340,最早拿到的一块板子。 2000 参加研讨会送的。 电源评估板。 ...… 查看全部问答∨ |