HAL_NVIC_SetPriority的三个变量
时间: 2023-12-17 09:02:46 浏览: 36
HAL_NVIC_SetPriority函数是用来设置中断优先级的函数,它有三个参数:
1. IRQn_Type类型的参数irqn:表示要设置优先级的中断号,比如USART1_IRQn表示USART1的中断号。
2. uint32_t类型的参数preemptPriority:表示抢占优先级,用来确定同一优先级组中不同中断之间的抢占顺序。抢占优先级越低,被抢占的可能性越大。
3. uint32_t类型的参数subPriority:表示子优先级,用来确定同一抢占优先级中不同中断之间的响应顺序。子优先级越低,被响应的可能性越大。
通过使用HAL_NVIC_SetPriority函数,可以为特定的中断号设置相应的抢占优先级和子优先级,以满足不同中断之间的优先级需求。
相关问题
__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毫秒的中断时间。
HAL_GetTick()函数实现
HAL_GetTick()函数是HAL库提供的一个用于获取当前系统时间的函数,其实现主要基于SysTick中断。在系统初始化时,会启动SysTick定时器,并将其定时中断的时间设置为1ms。每当SysTick定时器定时中断时,SysTick_Handler()函数会被调用,同时全局变量uwTick会自增1,表示当前系统时间增加了1ms。因此,通过读取全局变量uwTick的值,就可以获取当前系统时间。
以下是HAL_GetTick()函数的实现:
```
volatile uint32_t uwTick;
void HAL_InitTick(uint32_t TickPriority)
{
// 启动SysTick定时器,并将其定时中断的时间设置为1ms
if (HAL_SYSTICK_Config(SystemCoreClock / 1000) == HAL_OK) {
// 设置SysTick定时器中断的优先级
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0);
}
}
uint32_t HAL_GetTick(void)
{
// 获取当前系统时间
return uwTick;
}
void SysTick_Handler(void)
{
// SysTick定时器定时中断时,全局变量uwTick自增1
uwTick++;
}
```
需要注意的是,由于SysTick定时器的精度有限,可能会对获取的系统时间产生一定的误差。如果需要更高的精度,可以使用其他的定时器或者计时方法。