STM32F1笔记(四)NVIC中断优先级管理

STM32将中断分为5个组,组0~4。配置代码如下:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

在标准库里,分组的定义如下: 

/** @defgroup Preemption_Priority_Group 
  * @{
  */

#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 */

翻译过来就是:

分组0为0位抢占优先级,4位响应优先级;

分组1为1位抢占优先级,3位响应优先级;

分组2为2位抢占优先级,2位响应优先级;

分组3为3位抢占优先级,1位响应优先级;

分组4为4位抢占优先级,0位响应优先级;

 

假设使用分组3,可以使用的抢占优先级为2^3=8,即0~7,代码可配置如下:

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;

可以使用的响应优先级为2^1=2,即0~1,代码可配置如下:

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

优先级逻辑:

1、抢占优先级的级别高于响应优先级。即抢占优先级高的中断可以打断正在执行的优先级低的中断。

2、数值越小所代表的优先级就越高,即0为最高优先级。

3、当抢占优先级相同时,响应优先级高的不可以打断优先级低的。

4、如果两个中断的抢占优先级和响应优先级都一样,哪个中断先发生就先执行。

 

NVIC配置示例:

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dr_Haven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值