nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, uint8_t nvic_irq_sub_priority)
时间: 2023-12-01 18:37:47 浏览: 77
nvic_irq_enable函数用于使能指定的中断,并设置中断的优先级。参数`nvic_irq`是要使能的中断编号,`nvic_irq_pre_priority`是中断的抢占优先级,`nvic_irq_sub_priority`是中断的子优先级。
函数实现的伪代码如下:
```c
void nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, uint8_t nvic_irq_sub_priority) {
// 设置中断的抢占优先级和子优先级
NVIC_SetPriority(nvic_irq, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), nvic_irq_pre_priority, nvic_irq_sub_priority));
// 使能中断
NVIC_EnableIRQ(nvic_irq);
}
```
相关问题
解释一下这段代码: GIC_SetInterfacePriorityMask(((IRQ_PRIORITY_HIGHPLUS << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL))
& 0xfful) << GIC_INTERFACE_PRIORITY_SHIFT);
这段代码是设置中断控制器(GIC)的接口优先级掩码(Interface priority mask)。首先计算出一个 IRQ_PRIORITY_HIGHPLUS,然后向左移动 8 - __NVIC_PRIO_BITS 位,再与 0xfful 进行按位与操作,最后向左移动 GIC_INTERFACE_PRIORITY_SHIFT 位,作为接口优先级掩码的值,最终传递给 GIC_SetInterfacePriorityMask 函数进行设置。其中,__NVIC_PRIO_BITS 是 Cortex-M 系列处理器的一个参数,用于指定中断优先级比特数。
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { /* Configure the SysTick to have interrupt in 1ms time basis*/ if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) { return HAL_ERROR; } /* Configure the SysTick IRQ priority / if (TickPriority < (1UL << __NVIC_PRIO_BITS)) { HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); uwTickPrio = TickPriority; } else { return HAL_ERROR; } / Return function status */ return HAL_OK; }中断时间计算过程
在这段代码中,中断时间的计算过程如下:
1. `SystemCoreClock`是系统时钟频率,单位为Hz。
2. `1000U`表示1毫秒的时间,单位为微秒。
3. `uwTickFreq`是tick的频率,单位为Hz,可以通过`HAL_InitTick()`函数的参数`TickPriority`来设置。
4. `SystemCoreClock / (1000U / uwTickFreq)`表示在tick频率为`uwTickFreq`的情况下,每个tick的时间,单位为微秒。
5. `HAL_SYSTICK_Config()`函数会将上述计算结果作为参数,用于配置SysTick定时器的计数器自动重载寄存器(reload register)的值,来实现1毫秒的中断时间。
6. 如果成功配置定时器中断,`HAL_SYSTICK_Config()`函数将返回0,否则返回非0值。
7. 如果成功配置定时器中断,则通过`HAL_NVIC_SetPriority()`函数设置中断优先级,并将`uwTickPrio`变量设置为`TickPriority`的值。
8. 如果`TickPriority`的值大于或等于`1UL << __NVIC_PRIO_BITS`,则返回错误状态`HAL_ERROR`;否则,返回成功状态`HAL_OK`。
总之,这段代码通过配置SysTick定时器的计数器自动重载寄存器的值,实现了1毫秒的中断时间。