Сначала измерьте, сколько времени занимает обработчик прерываний. Вы можете подсчитать циклы с помощью DWT-> CYCCNT и некоторого кода (но это будет довольно неточно, не считая, например, циклов входа и выхода обработчика), или запустить таймер (TIM2
или TIM5
поскольку они являются 32-битными, в противном случае имейте в виду переполнение), скажите контроллеру, чтобы он остановил его в спящем режиме с помощью регистра RCC->APBxSMENR
, тогда у вас будет точное количество циклов, сколько времени контроллер не спал.
Если вы знаете, как долго контроллер не спит, вы можете использовать STM32CubeMX для расчета потребляемой мощности.
![enter image description here](https://i.stack.imgur.com/A55mx.png)
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;
}