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应用之无源蜂鸣器
推荐阅读
史海拾趣
Baton Lock公司最初是一家小型电子元件制造商,面临着激烈的市场竞争。然而,公司凭借其研发团队对新型半导体技术的深入研究,成功开发出了一种高效能、低成本的芯片。这一技术创新迅速吸引了市场的关注,Baton Lock的订单量激增,公司规模迅速扩大。
在电子行业中,EWC Controls公司选择了工业自动化控制这一细分领域作为切入点。通过深入了解行业需求和痛点,公司专注于研发和生产符合市场需求的高品质产品。例如,在食品加工行业,EWC Controls公司针对温度、湿度等关键参数的控制需求,开发出了一套高效稳定的控制系统,帮助食品加工企业提高了生产效率和产品质量。这种深耕行业、专注细分领域的策略使得EWC Controls公司在市场中逐渐崭露头角。
EWC Controls公司自成立以来,一直专注于工业自动化控制技术的研发与应用。在早期,公司凭借其独特的PID控制算法,成功开发了一系列高性能的控制器产品,赢得了市场的初步认可。随着技术的不断进步,EWC Controls公司不断投入研发资源,推出了基于物联网和大数据的智能控制系统,实现了从单一控制到智能化管理的跨越。这一创新技术不仅提升了公司的核心竞争力,也为工业自动化控制领域带来了革命性的变化。
随着电子行业的不断发展,B&K Precision始终保持着创新的步伐。公司不断推出具有创新性和竞争力的新产品,如数字电流表、三路输出直流清洁电源等,满足了市场对于高精度、高可靠性测试仪器的需求。这些产品的推出不仅提升了公司的市场份额,也进一步巩固了公司在电子行业中的地位。
在追求经济效益的同时,Capar Components Corp也注重环保和可持续发展。公司积极采用环保材料和生产工艺,减少生产过程中的污染排放。同时,公司还推出了一系列绿色电子产品,满足消费者对环保产品的需求。这些举措不仅提升了公司的社会形象,还为公司赢得了更多客户的青睐。
作为一家有社会责任感的企业,Capar Components Corp积极参与公益事业,回馈社会。公司定期组织员工参与社区服务活动,帮助困难群体解决实际问题。此外,公司还设立了奖学金和助学金,支持教育事业的发展。这些举措不仅彰显了公司的社会责任感,也为公司树立了良好的企业形象。
这些故事是基于一个虚构的电子行业公司背景编写的,您可以根据Capar Components Corp的实际情况进行调整和修改,以使其更符合该公司的历史和发展轨迹。请注意,由于我无法获取Capar Components Corp的具体信息,这些故事仅为示例性质,并非真实事件。
随着能源紧张、油价攀升,环境污染严重,节能环保成为人类不懈努力的方向。燃料电池以其效率高、零污染、使用方便等特点进入人类的视野,在诸多领域的应用也应运而生,成为人们关注的热点。 工作原理 1839年英国的Grove发明了燃料电池,并 ...… 查看全部问答∨ |
|
打算开发嵌入式操作系统,召集有志同道合者,现在已经做好了semaphore部分,其它部分正在开发中,论坛:http://dawn.tech.topzj.com/index.php, 欢迎大家光临指导! … 查看全部问答∨ |
|
说实话,从来没有用过TI的ARM产品, 但是玩过早期的ARM7,工作中用过TI的dsp,另外对FPGA最熟悉。 觉得这块板子挺超值的,不光是价格,而且可扩展性比较强。 为了买这块板子,也为了督促自己学习,先在这里写一篇凑数。 ...… 查看全部问答∨ |
大侠们帮忙看看这个程序24c64读写程序 在keilc上运行时提示target not created,电脑是win7系统,跟这个有关系吗?#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define writedeviceadd ...… 查看全部问答∨ |
如题,让P10输出PWM波,然后直接接在直流电机一级,另一级接地,这样为什么直流电机不转?一定需要外接电路吗?看网上的列子都接了外接电路谢谢… 查看全部问答∨ |