Потребляемая мощность таймера Systick на STM32 - PullRequest
0 голосов
/ 27 апреля 2018

В коде, над которым я работаю (проект STM32L4), Systick включен для отметки каждые 1 мс, и его прерывание включено. Это означает, что каждые 1 мс ЦП выходит из WFI (в настоящее время ЦП проводит около 2/3 времени в спящем режиме). Мне интересно, если он не потребляет слишком много энергии, чтобы использовать Systick, как вы думаете?

1 Ответ

0 голосов
/ 28 апреля 2018

Сначала измерьте, сколько времени занимает обработчик прерываний. Вы можете подсчитать циклы с помощью DWT-> CYCCNT и некоторого кода (но это будет довольно неточно, не считая, например, циклов входа и выхода обработчика), или запустить таймер (TIM2 или TIM5 поскольку они являются 32-битными, в противном случае имейте в виду переполнение), скажите контроллеру, чтобы он остановил его в спящем режиме с помощью регистра RCC->APBxSMENR, тогда у вас будет точное количество циклов, сколько времени контроллер не спал.

Если вы знаете, как долго контроллер не спит, вы можете использовать STM32CubeMX для расчета потребляемой мощности.

enter image description here

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;
}
...