День добрый
Я ещё совсем новичок в микроконтроллерах, поэтому даже не очень знаю как правильно задать вопрос по своей проблеме.
Пробую запустить Keil 4.73 вполне дефолтный код обработчика прерывания от таймера
Код
TIM_TimeBaseInitTypeDef timer_struct;
NVIC_InitTypeDef NVIC_struct;
uint32_t flag = 0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
timer_struct.TIM_Prescaler = 20000 - 1;
timer_struct.TIM_CounterMode = TIM_CounterMode_Up;
timer_struct.TIM_Period = 1000;
timer_struct.TIM_ClockDivision = TIM_CKD_DIV1;
timer_struct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM5, &timer_struct);
TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM5, ENABLE);
// NVIC init
NVIC_struct.NVIC_IRQChannel = TIM5_IRQn;
NVIC_struct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_struct.NVIC_IRQChannelSubPriority = 1;
NVIC_struct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_struct);
while (1)
{
flag++;
}
Всё компилируется без ошибок, запускается, но ничего не работает.
По брейкпойнтам стало ясно, что проблема либо с действиями NVIC_Init(&NVIC_struct); либо с TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE); Не важно, в каком порядке инициализировать, та строчка, которая будет второй вешает исполнение программы, ощущение, что оно уходит в бесконечный цикл и до while(1) даже не доходит. flag в watch'e на нуле и не растёт
ПРИ ЭТОМ:
Если поставить брейкпойнт в проблемном месте и трейсить пошагово, то всё работает как надо и flag в watch'e растёт.
Подскажите, с чем может быть проблема, куда копать?