系统时钟问题

弱函数,通过__weak来修饰,使得用户可以覆盖

使用systick作为HAL基础定时器时,作用是产生滴答信号计数值,然后用于延时计算,如果不需要延时计算,停掉systick对系统运行无影响

可以使用TIM6作为HAL的基础时钟,TIM6完全代替了SysTick。

FreeRTOS使用systick作为基础时钟,用于产生FreeRTOS滴答信号,而且在定时中断中检查任务状态,发出任务调度申请

在使用FR的时候,必须为HAL库设置一个非Systick的时钟

Systick是Cortex-M内核的一个定时器,在整个32系列都存在,用它作为基础时钟适应性更强

  1. 不使用FreeRTOS时:系统默认使用SysTick定时器作为HAL库的基础时钟(也可配置其他定时器)。时钟默认周期为1ms,HAL的毫秒级延时函数(如HAL_Delay())依赖此时钟。
  2. 使用FreeRTOS时:SysTick定时器必须作为FreeRTOS的基础时钟(用于系统嘀嗒信号)。需为HAL库单独指定一个非SysTick定时器(如TIM6、TIM7等)作为其基础时钟。
  3. FreeRTOS中SysTick的作用:产生系统嘀嗒信号(默认周期1ms),支持任务调度和时间管理。实现延时函数(如vTaskDelay())。在SysTick中断中执行任务状态检查、调度申请等核心操作。

空闲任务与低功耗

1
2
3
4
void vApplicationIdleHook(void) {

HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
}

空闲钩子函数中直接进入休眠

对了还要把htim6hal库的基础时钟关掉:只影响hay_delay()

Tickless低功耗模式

最大也就99毫秒?

会计算睡眠的节拍数,然后补回来

image-20251015235706977