标签:这一 赋值 服务 关于 大于等于 nested 做了 开关 外部
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255
本章节为大家讲解STM32F407的中断优先级配置。此章节非常重要,初学者经常在这里犯迷糊,因此很有必要整明白。
21.1 NVIC基础知识
21.2 常用的NVIC API
21.3 MDK中查看实际优先级配置
21.4 开关中断
21.5 总结
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,也就是没有抢占式优先级,只有子优先级。关于这个抢占优先级和子优先级有几点一定要说清楚。
掌握了这些基础知识基本就够用了。另外特别注意一点,配置抢占优先级和子优先级,它们合并成的4bit数字的数值越小,优先级越高,这一点千万不要搞错了。
下面将外设配置中经常用到的两个函数做个说明。
函数原型:
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
函数描述:
此函数主要用于设置中断的抢占优先级和子优先级。
函数参数:
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;
使用举例:
此函数的调用比较简单,比如设置ADC中断的抢占优先级是1,子优先级是0,那么此函数的设置就是:HAL_NVIC_SetPriority(ADC_IRQn, 1, 0)。
函数原型:
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
函数描述:
此函数主要用于使能中断。
函数参数:
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, )。
如果想查看配置的外设优先级是否正确设置了,MDK进入调试状态后,先点击全速运行,然后查看如下调试组件:
弹出如下窗口,在这个窗口里面就可以查看实际优先级了,比如滴答定时器Systick的优先级就是240,即240>>4 = 15。
V6开发板的BSP驱动包在bsp.h文件里面对开关中断做了一个宏定义:
/* 开关全局中断的宏 */ #define ENABLE_INT() __set_PRIMASK(0) /* 使能全局中断 */ #define DISABLE_INT() __set_PRIMASK(1) /* 禁止全局中断 */
__set_PRIMASK就是对寄存器primask做的开关设置,如下表所示:
对于寄存器basepri我们举一个例子,帮助大家理解。比我们配置寄存器basepri(对于STM32F407,范围0-255)的数值为16,所有优先级数值大于等于16的中断都会被关闭,优先级数值小于16的中断不会被关闭。但0比较特殊,对寄存器basepri寄存器赋值0,那么被关闭的中断会被打开。
最后,我们再强调一下,在NVIC分组为4的情况下,抢占优先级可配置范围是0-15,那么数值越小,抢占优先级的级别越高,即0代表最高优先级,15代表最低优先级。
【STM32F407开发板用户手册】第21章 STM32F407的NVIC中断分组和配置(重要)
标签:这一 赋值 服务 关于 大于等于 nested 做了 开关 外部
原文地址:https://www.cnblogs.com/armfly/p/13338047.html