添加链接描述
SysTick是一个特殊的定时器,在很多ARM处理器中都有,通常被操作系统使用。
在STM32微控制器中,SysTick默认每1毫秒触发一个中断,并被STM32的硬件抽象层(HAL)用于一些功能,如延时和获取当前时间(Hal_delay HAL_GetTick),因此它有一个很高的优先级。
但是,当使用FreeRTOS这样的实时操作系统时,SysTick也需要被用来支持任务调度,而FreeRTOS需要SysTick的优先级较低。
这就产生了一个冲突,因为STM32 HAL和FreeRTOS对SysTick的优先级有不同的需求。
为了解决这个问题,可以将另一个未使用的定时器(如TIM6)设置为HAL的时间基准源,这样SysTick就可以被FreeRTOS以较低的优先级使用,而不会与STM32 HAL产生冲突。
遇到的问题:
1、以time1为Timebase source且设置优先级最低
2、在time4的定时中断回调函数中调用了Hal_delay
3、程序一直死在Hal_delay 的while((HAL_GetTick() - tickstart) < wait)中。
这是由于time1的优先级很低导致能会被更高优先级的任务或中断所抢占,从而导致HAL_GetTick()的更新延迟。