Сначала измерьте, сколько времени занимает обработчик прерываний. Вы можете подсчитать циклы с помощью DWT-> CYCCNT и некоторого кода (но это будет довольно неточно, не считая, например, циклов входа и выхода обработчика), или запустить таймер (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;
}