历史上的今天
今天是:2025年04月22日(星期二)
2019年04月22日 | STM32的中断优先级详解
2019-04-22 来源:eefocus
中断优先级设置步骤:
系统运行后先设置中断优先级分组。在主函数调用函数:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
整个系统执行过程中,只设置一次中断分组。
针对每个中断,设置对应的抢占优先级和响应优先级:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//配置过程
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断,此处可改为任何有中断功能的模块定时器,外部中断等,后面有例子参考
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器
如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。
优先级分组只是给抢占优先级与响应优先级在中断优先级寄存器中高四位分配各个优先级数字所占的位数,在程序中只能设定一次。
每写一个关于中断优先级的程序必须包含下列两个函数: (1)void NVIC_PriorityGroup();//写在主程序中;
(2)NVIC_Init(); //写在初始化配置中
默认情况下,如何不设置中断优先级分组,则中断优先级分组默认为0,即0位抢占优先级,4位响应优先级,则无任何抢占优先级,所以无论中断的优先级设多少,都没有抢占中断的功能,所以,如果想要一个中断打断另一个中断,必须设置中断优先级分组为1,2,3,4.
如设置优先级分组为2
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:
NVIC_PriorityGroup_0=> 选择第0组
NVIC_PriorityGroup_1=> 选择第1组
NVIC_PriorityGroup_2=> 选择第2组
NVIC_PriorityGroup_3=> 选择第3组
NVIC_PriorityGroup_4=> 选择第4组
如 选择使用优先级分组第1组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//高一位就有0,1,四个抢占优先;低三位就是0,1,2,3,4,5,6,7,八个响应优先级
具体例子如下
{
假设NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1)
则
// 使能EXTI0中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 使能EXTI9_5中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//TIM3中断
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
在上例子中,优先抢占优先级,其数字越低,优先级越高。相同下比较响应优先级,其数字越低,优先级越高。
要注意的几点是:
1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;
2)抢占式优先级别相同的中断源之间没有嵌套关系;
3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。
下一篇:STM32 NVIC基本理解
史海拾趣
|
很早以前就知道led行业,但一直未做深入了解 , 今天去爬山碰到一个哥们, 向我吹嘘: 1.单多的做不完,要经常性加班. 2.很难在市场上招到合适的人 ,也就是有点led水平的人很难找 3.tcl和创维,不做led研发 ,而将研发生产全外包 4.利润好,银行 ...… 查看全部问答> |
|
无线数传模块 无线数传模块 液晶模块 一. 功率:20mW - 1W 串行接口 TTL 、232、485可选,波特率1200----115200 电源:DC3.3V--5.5V 距离:500m-5Km ...… 查看全部问答> |
|
windows CE重启之后 怎样才能让自己对系统的修改设定保存下来呀? 1.我自己开发的程序,烤的到windows CE系统里面,重启就没有了,还有触摸屏的设定,usb conection的设定都没有了 2.usb conection的波特率对应注册表的哪个键值?… 查看全部问答> |
|
我使用的平台是2410 ,系统为CE5.0 ,在做电源管理的时候遇到了如下的问题 1、能够休眠。 经过fw.s中的CPUPOWEROFF后系统可以确定是休眠了,理由是:PWREN 脚为低,CLK0,CLK1,SCK也都为低,虽然我没有把内核的1.8V分开,但是系统的 ...… 查看全部问答> |
|
WIN CE 系统声音大小要如何改变? 我改了注册表里的 [HKEY_CURRENT_USER\\ControlPanel\\Volume]下面\"Volume\"这一项 但是改完了声音好像并没有改变。是不是还要做什么动作? 我看WIN CE 自带的Volurne&Sounds里声音一改变[HKEY_CURRENT_USER\ ...… 查看全部问答> |
|
正在写一个SIP的程序。 遇到了这样一个困难。 首先在生成SIP软面板的时候,创建了一个窗口,得到句柄hwndsip。 我可以在这个面板上直接TextOut就输出了文本,直接InvalidateRect就可以将文本清除掉,在同一窗口下做这样的一系列操作都没什么问题 ...… 查看全部问答> |
|
由于刚学,可能提的问题不是太有价值,但突然想到,困惑很长时间。我们现在做单片机实验,流程是这样:先在IDE里用汇编写出了源程序,然后编译成*.HEX,然后调试状态全速运行,如果对的话就能看结果了。我有点晕,这源文件变成1 0后怎样变成高低电 ...… 查看全部问答> |
|
主要是如何初始化那个微端口驱动程序,具体操作是什么?我的PC安装了EVC 4SP4和PB 5.0,还需要怎么做才能开发NDIS网络驱动? 这个驱动程序最后是要写入S3C2440开发板上运行的… 查看全部问答> |
|
本应用指南首先介绍了通过动态重配置端口 (DRP) 对Spartan-6 FPGA 锁相环(PLL) 的时钟输出频率、相移及占空比进行动态修改的方法。在阐述了内部DRP 控制寄存器的功能后,提供了一个通过状 ...… 查看全部问答> |




