关于NVIC中断设置

NVIC是stm32内核的中断,下面给出在cm3权威指南中关于nvic的描述:

8.2 中断配置基础 每个外部中断都在 NVIC 的下列寄存器中“挂号”:

 使能与除能寄存器

 悬起与“解悬”寄存器

 优先级寄存器

 活动状态寄存器

另外,下列寄存器也对中断处理有重大影响

 异常掩蔽寄存器(PRIMASK, FAULTMASK 以及 BASEPRI)

 向量表偏移量寄存器

 软件触发中断寄存器

 优先级分组位段

说明在nvic中有一张表(一连串的地址),记录了每一个中断的使能位,优先位

下面再来看看中断初始化的函数nvic的初始化结构体nvic_inittypedef和初始化函数nvic_init

typedef struct {
    u8 NVIC_IRQChannel;//中断号
    u8 NVIC_IRQChannelPreemptionPriority;//抢占优先级
    u8 NVIC_IRQChannelSubPriority;//响应优先级
    FunctionalState NVIC_IRQChannelCmd;//使能与否
} NVIC_InitTypeDef;
void NVIC_Init(NVIC_InitTypeDef* init_struct)
{
    if (init_struct->NVIC_IRQChannelCmd != DISABLE) {
        u32 pri = (SCB_AIRCR_PRIGROUP & ~(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk)) >> SCB_AIRCR_PRIGROUP_Pos;

        pri = (((u32)init_struct->NVIC_IRQChannelPreemptionPriority << (0x4 - pri)) |
               (init_struct->NVIC_IRQChannelSubPriority & (0x0F >> pri)))
              << 0x04;

        NVIC->IP[init_struct->NVIC_IRQChannel]           = pri;
        NVIC->ISER[init_struct->NVIC_IRQChannel >> 0x05] = 0x01 << (init_struct->NVIC_IRQChannel & 0x1F);
    }
    else {
        NVIC->ICER[init_struct->NVIC_IRQChannel >> 0x05] = 0x01 << (init_struct->NVIC_IRQChannel & 0x1F);
    }

}
typedef struct {
    __IOM uint32_t ISER[8U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */
    uint32_t RESERVED0[24U];
    __IOM uint32_t ICER[8U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */
    uint32_t RSERVED1[24U];
    __IOM uint32_t ISPR[8U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */
    uint32_t RESERVED2[24U];
    __IOM uint32_t ICPR[8U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */
    uint32_t RESERVED3[24U];
    __IOM uint32_t IABR[8U];               /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */
    uint32_t RESERVED4[56U];
    __IOM uint8_t  IP[240U];               /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */
    uint32_t RESERVED5[644U];
    __OM  uint32_t STIR;                   /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register */
}  NVIC_Type;

一个感性的认知,就不细究了,顺便一提,中断优先组最好设置为组4,无响应优先级,os里面可能会用到

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 CSDN 开发的 C知道 AI 中,设置 NVIC 中断优先级的方法如下: 1. 首先,需要包含头文件 `stm32f4xx.h`(假设你使用的是STM32F4系列的MCU)。 2. 找到对应的中断号,每个中断对应一个中断号,例如 `TIM2_IRQn` 表示定时器2的中断。 3. 使用 `NVIC_InitTypeDef` 结构体来配置中断优先级。该结构体定义在 `stm32f4xx.h` 中。可以设置以下几个参数: - `NVIC_IRQChannel`: 中断通道,即对应的中断号。 - `NVIC_IRQChannelPreemptionPriority`: 抢占优先级,范围从0到15,数值越小,优先级越高。 - `NVIC_IRQChannelSubPriority`: 子优先级,用于同一抢占优先级的多个中断之间的排序,范围从0到15,数值越小,优先级越高。 - `NVIC_IRQChannelCmd`: 中断使能或禁止控制。 下面是一个设置中断优先级的示例代码: ```c #include "stm32f4xx.h" // 示例中断处理函数 void TIM2_IRQHandler(void) { // 中断处理逻辑 } int main(void) { // ... // 配置中断优先级 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级为0 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; // 子优先级为0 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 使能中断 NVIC_Init(&NVIC_InitStruct); // ... while (1) { // 主循环逻辑 } } ``` 通过以上步骤,你可以设置 NVIC 中断的优先级。请注意,具体的中断号和优先级设置可能会根据不同的 MCU 型号和使用的库而有所不同,请参考相关的文档和头文件进行设置

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值