mannaro
@mannaro
Умею профессионально гуглить

Почему может не вызываться прерывание?

Добрый день!
Пытаюсь завести таймер SysTick в STM32F030F4P6.
Разрешаю прерывания глобально, завожу все параметры для SysTick, таймер тикает, выставляет флаг SCB_ICSR_PENDSTSET в ICSR, выставляет бит обнуления COUNTFLAG, но вот в прерывание не заходит. Перепробовал уже кучу всего, перерыл тонны документации. Должно работать, но не работает.

__enable_irq();
SysTick->CTRL = 0b110;
SysTick->LOAD = CPU_SPEED / 100; // 10ms
SysTick->VAL = 0;
SysTick->CTRL = 0b111;
  • Вопрос задан
  • 936 просмотров
Пригласить эксперта
Ответы на вопрос 2
@LampTester
Используйте NVIC_EnableIRQ() вместо __enable_irq(). В ARM прерывания включаются именно так.

И да, определите обработчик, если еще не сделали этого. Просто скопируйте (но не убирайте его из исходного места!) нужное имя из startup_xxx.S в main.c, оформив его как функцию.

void SysTick_Handler(void)
{
}
Ответ написан
Комментировать
@vanyamba-electronics
У меня не вызывался мой обработчик, потому что линкер не хотел перекрывать weak-функции.
Гугление arm-gcc weak function override позволило найти ключ, который надо добавить в Makefile.
Давно дело было, вроде бы это был --partial.
Why does the linker select weak definitions instea...
Точно не помню, может быть -ffunction-sections нужно было добавить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы