__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) { if ((int32_t)(IRQn) < 0) { SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); } else { NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); } }
时间: 2024-04-23 11:22:40 浏览: 187
这段代码看起来是一个内联函数,函数名为 `NVIC_SetPriority`,作用是设置中断优先级。代码中包含了两个分支,一个是当中断号为负数时,另一个是中断号为非负数时,分别对应了不同的设置方式。
具体来说,代码首先判断中断号是否为负数,如果是负数,则使用 System Control Block (SCB) 寄存器来进行中断优先级的设置,否则使用 NVIC (Nested Vectored Interrupt Controller) 寄存器来进行中断优先级的设置。在设置中断优先级时,代码使用了一些位运算的技巧,以确保优先级的正确设置。
需要注意的是,这段代码是在 ARM Cortex-M 处理器中使用的,其中 `_SHP_IDX`、`_BIT_SHIFT`、`__NVIC_PRIO_BITS` 等都是宏定义,用于计算中断优先级的相关参数。如果你不了解这些宏定义的含义,可能需要先了解一下 ARM Cortex-M 处理器的相关知识。
相关问题
void N32_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)什么意思
这是一个函数定义,函数名为 N32_NVIC_SetPriority,接受三个参数:IRQn,PreemptPriority 和 SubPriority。
- IRQn 是一个枚举类型的参数,用于指定中断号。
- PreemptPriority 是一个无符号32位整数,用于设置中断的抢占优先级。
- SubPriority 也是一个无符号32位整数,用于设置中断的子优先级。
该函数的作用是设置指定中断的优先级。在嵌入式系统中,中断的优先级决定了中断处理程序的执行顺序。抢占优先级用于决定是否允许高优先级的中断打断正在执行的低优先级中断处理程序,而子优先级则用于确定同一抢占优先级下的中断的执行顺序。
通过调用该函数并传递相应的参数,可以设置特定中断的抢占优先级和子优先级。这样可以对不同中断进行优先级排序,从而控制系统对中断的响应和处理顺序。
解释每行void timer_init(uint32_t timestamp) { uint32_t tick_us = (SystemCoreClock)/1e6; tick_us = tick_us*timestamp; SysTick_Config(tick_us); //NVIC_SetPriority(SysTick_IRQn, 3); }
这段代码是初始化一个定时器的函数。具体解释如下:
1. `void timer_init(uint32_t timestamp)`:定义一个返回值为空,参数为 uint32_t 类型的函数 timer_init,该函数需要传入一个 uint32_t 类型的参数 timestamp。
2. `uint32_t tick_us = (SystemCoreClock)/1e6;`:将当前系统的主频除以 1 百万,得到每个时钟计数的微秒数。
3. `tick_us = tick_us*timestamp;`:将每个时钟计数的微秒数乘上输入参数 timestamp,得到总共的计时周期。
4. `SysTick_Config(tick_us);`:使用总共的计时周期来配置 SysTick 计时器的时钟源和计数周期。
5. `//NVIC_SetPriority(SysTick_IRQn, 3);`:这行代码是将 SysTick 中断的优先级设置为 3(注释掉了)。通常情况下,这行代码可以用来设置中断的优先级,以确保在多个中断同时发生的情况下有序地处理中断请求。
阅读全文