Timer STM32上Systick定时器的功耗

Timer STM32上Systick定时器的功耗,timer,arm,stm32,Timer,Arm,Stm32,在我正在编写的代码(STM32L4项目)中,Systick每1ms被启用一次,其中断被启用。这意味着每隔1ms CPU就会退出WFI(目前CPU大约有2/3的时间处于睡眠模式)。 我想知道使用Systick是否会消耗太多的电力,您认为如何?首先,测量中断处理程序需要多长时间。您可以(但它将非常不准确,不计算处理程序的进入和退出周期),或启动计时器(TIM2或TIM5,因为它们是32位,否则请注意溢出),告诉控制器使用RCC->APBxSMENR寄存器在睡眠模式下停止,然后,您将获得控制器未睡眠时

在我正在编写的代码(STM32L4项目)中,Systick每1ms被启用一次,其中断被启用。这意味着每隔1ms CPU就会退出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;
}

什么是功率过大?您是否使用硬币电池,并且需要它使用数年?你有电源吗?你需要添加细节。你需要mA中的数字吗?我真的看不出你的评论有什么意义。对于大多数电池供电的设备来说,功耗是一个主要(也是困难的)问题。那么,一个供电的外围设备的功耗是不计数还是计数?为什么不直接测量呢?启动计时器将芯片放入wfi中,无中断,然后进行相同的计时器设置,但不断言启用,测量功耗。如果你能准确地测量,你会感到震惊,而这是你最不担心的功耗…另一方面,启用计时器外围设备,你可能能够测量,即使你启用了时钟门,但不启动计时器。systick应该更便宜,但只是测量和查看……我没有使用HAL,但我在代码中保留了相同的systick API,但修改了实现以使用LPTIMx。我看到的好处是它与CPU频率无关,因此我可以在不改变systick时基的情况下降低该频率(用于功耗)。