STM32上一个Systick定时器的功耗
Power consumption of a Systick timer on STM32
在我正在处理的代码(STM32L4 项目)中,启用 Systick 每 1 毫秒滴答一次,并启用其中断。这意味着 CPU 每 1ms 从 WFI 退出一次(目前 CPU 大约有 2/3 的时间处于睡眠模式)。
我想知道使用Systick会不会太耗电,你觉得怎么样?
首先,测量中断处理程序需要多长时间。您可以 (但它会很不准确,不计算例如处理程序进入和退出周期),或者启动计时器(TIM2
或 TIM5
因为它们是 32 位,否则请注意溢出),告诉控制器使用 RCC->APBxSMENR
寄存器将其停止在睡眠模式,然后您将有一个精确的周期计数控制器没有休眠的时间。
当你知道控制器有多久没有休眠时,你可以使用STM32CubeMX来计算功耗。
根本不使用 SysTick
如果您的程序中 SysTick 的唯一目的是维护毫秒计数器,您可以改用 32 位定时器。不是启动 Systick,而是启动计时器,并将对毫秒计数器的引用替换为 (TIM2->CNT)
。使用 HAL 时,它只是
HAL_StatusTypeDef HAL_InitTick(uint32_t prio __attribute__((unused))) {
RCC->APB1ENR = RCC_APB1ENR_TIM2EN;
asm volatile("dsb sy");
TIM2->CR1 = TIM_CR1_CEN;
return HAL_OK;
}
uint32_t HAL_GetTick(void) {
return TIM2->CNT;
}
在我正在处理的代码(STM32L4 项目)中,启用 Systick 每 1 毫秒滴答一次,并启用其中断。这意味着 CPU 每 1ms 从 WFI 退出一次(目前 CPU 大约有 2/3 的时间处于睡眠模式)。 我想知道使用Systick会不会太耗电,你觉得怎么样?
首先,测量中断处理程序需要多长时间。您可以 TIM2
或 TIM5
因为它们是 32 位,否则请注意溢出),告诉控制器使用 RCC->APBxSMENR
寄存器将其停止在睡眠模式,然后您将有一个精确的周期计数控制器没有休眠的时间。
当你知道控制器有多久没有休眠时,你可以使用STM32CubeMX来计算功耗。
根本不使用 SysTick
如果您的程序中 SysTick 的唯一目的是维护毫秒计数器,您可以改用 32 位定时器。不是启动 Systick,而是启动计时器,并将对毫秒计数器的引用替换为 (TIM2->CNT)
。使用 HAL 时,它只是
HAL_StatusTypeDef HAL_InitTick(uint32_t prio __attribute__((unused))) {
RCC->APB1ENR = RCC_APB1ENR_TIM2EN;
asm volatile("dsb sy");
TIM2->CR1 = TIM_CR1_CEN;
return HAL_OK;
}
uint32_t HAL_GetTick(void) {
return TIM2->CNT;
}