历史上的今天
今天是:2024年10月21日(星期一)
2018年10月21日 | STM32学习之:NVIC的初步理解
2018-10-21 来源:eefocus
1 对NVIC的理解
CM3支持硬件中断嵌套,分为抢占式优先级和亚优先级,使用规则主要有,抢占优先级高级别的可以打断低级别的,同一级别的抢占优先级同时发生时,亚当优先级高的先发生中断,若是相同,则按硬件排列顺序发生。若是有一个亚优先级正在执行中断,同一级别的其它亚优先级发生时,则先挂起,等此中断执行完再执行!
从库函数中找到优先级分组模式:
#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /* 0 bits for pre-emption priority
4 bits for subpriority */
#define NVIC_PriorityGroup_1 ((uint32_t)0x600) /* 1 bits for pre-emption priority
3 bits for subpriority */
#define NVIC_PriorityGroup_2 ((uint32_t)0x500) /* 2 bits for pre-emption priority
2 bits for subpriority */
#define NVIC_PriorityGroup_3 ((uint32_t)0x400) /* 3 bits for pre-emption priority
1 bits for subpriority */
#define NVIC_PriorityGroup_4 ((uint32_t)0x300) /* 4 bits for pre-emption priority
0 bits for subpriority */
从中可以看出第一组只有一个级别,16个亚优先级,我可以这样理解,若是分配成这个组里,不能发生嵌套中断,同时发生中断时,亚优先级高的先发生,若有中断执行时,必须等中断执行完才能执行下一个中断。最后一组正好相反,有15个级别,若是执行一个中断,可以最多嵌套15个中断执行一个中断。看下面的例子:
NVIC_InitTypeDef NVIC_InitStructure; //定义中断初始化类型结构体变量
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //配置优先级分组1 2个两个抢占优先级 8个亚优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //开口外部中断0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置0号抢占式优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//亚优先级配置为0号
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
NVIC_Init(&NVIC_InitStructure); //对外部中断0进行初始化配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //开口外部中断5到9
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亚优先级配置为1号
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
NVIC_Init(&NVIC_InitStructure); //对外部中断0进行初始化配置
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; //ADC1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亚优先级配置为1号
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
NVIC_Init(&NVIC_InitStructure); //对外部中断0进行初始化配置
从上面的配置来看,外部中断0的优先级最高,可以打断ADC和外部5到9的中断,也就说可以嵌套发生,当ADC中断和外部5到9中断同时发生时,它们的抢占优先级别相同,亚优先级别也相同,因为ADC1硬件排在更靠前,则先发生ADC中断,若是两者任何一个中断正在执行,则等此中断执行完,再去执行另一个中断。
下一篇:STM32学习之:事件标志组
史海拾趣
|
我在网上查,最便宜的 RTL8019AS也要12RMB/个 我现在做的一个小东西需要一个以太网控制器加RJ45口,订货量可以非常大,10K - 100K,但是成本非常关键,如果太贵,项目肯定被踢掉了 另外也问了dm9000, 比realtek得还要贵 我的要求很简单,就是支 ...… 查看全部问答> |
|
大家好:我的protel99se的鼠标增强器出现了点小问题 同样的增强器版本(第三版),同样的设置(开机自动运行),在别人的机子上都是好好的 在我的笔记本就是开机时会自动弹出一个类似于记事本的 protel99seMex.ini文件里面的内容显示如下: [All ...… 查看全部问答> |
|
问题是这样的: 我写的一个文件系统驱动,需要存储系统中所有硬盘设备的对象指针(PDEVICE_OBJECT),正常情况下,我使用这些指针是没有问题的。 但是,当系统移除某个硬盘设备(如usb设备或san的硬盘)后,我驱动中对应的PDEVICE_OBJECT指针所指 ...… 查看全部问答> |
|
) 初始化函数定义: void TIM_Configuration(void); //定义TIM初始化函数 d) 初始化函数调用: TIM_Configuration(); //TIM初始化函数调用 e) 初始化函数,不同于前面模块,TIM的初始化分为两部分——基本初始 ...… 查看全部问答> |
|
modelsim 仿真verilog时,报Missing instance name,什么原因? 用modelsim仿真verilog时,建2个.v文件nand_2.v和test_for_nand.v,编译通过,对test_for_nand.v仿真时,报错:# ** Error: F:/Modelsim/Nand/test_for_nand.v(16): Missing instance name in instantiation of \'nand_2\'.# Optimization failed# ...… 查看全部问答> |
|
一、cadence原理图设计中的端口有什么作用?端口号相同是否表示这两个端互连?端口与端口互连是否可以用网络标号? 二、网络标号有什么作用?总线上加网络标号有什么意义?总线和总线相连是否可以用网络标号? 三、上图中的TP6是什么符号?代表什 ...… 查看全部问答> |




