Добрый день, уважаемые коллеги.

Спрошу еще здесь, если позволите.


Имеем KEIL5.13 и плату STM32VLDiscovery (STM32F100RBT, ST-Link). Вопрос по поведению отладчика при входе в прерывания. Ужатый донельзя тестовый проект содержит код:

Код
    #include "stm32f10x.h"                  // Device header
    

     TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
     uint32_t TIM3_intcounter,TIM4_intcounter;
    
     void TIM3_IRQHandler (void) {
         TIM_ClearFlag (TIM3, TIM_FLAG_Update);
         TIM3_intcounter++;
     }
    
     void TIM4_IRQHandler (void) {
         TIM_ClearFlag (TIM4, TIM_FLAG_Update);
         TIM4_intcounter++;
     }
    
    
    
    
     int main (void) {
    
     SystemInit();
    
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        
         DBGMCU_Config(DBGMCU_TIM3_STOP,ENABLE);
         DBGMCU_Config(DBGMCU_TIM4_STOP,ENABLE);
    
       TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
       TIM_TimeBaseStructure.TIM_Period = 1000;
       TIM_TimeBaseStructure.TIM_Prescaler = 0;
       TIM_TimeBaseStructure.TIM_ClockDivision = 0;
       TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
       TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
       TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
         TIM_Cmd(TIM3, ENABLE);
         NVIC_EnableIRQ(TIM3_IRQn);
    
       TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
       TIM_TimeBaseStructure.TIM_Period = 50;
       TIM_TimeBaseStructure.TIM_Prescaler = 0;
       TIM_TimeBaseStructure.TIM_ClockDivision = 0;
       TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
       TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
       TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
         TIM_Cmd(TIM4, ENABLE);
         NVIC_EnableIRQ(TIM4_IRQn);
    
    
    
    
    
    
     while (1){
     }
    
    
     }





Таймер TIM3 считает вниз с периодом 1000 тиков, вызывая прерывание по событию обновления. Аналогично таймер TIM4, только с периодом 50 тиков. В их прерываниях инкременируются счетчики TIM3_intcounter, TIM4_intcounter. Ну и еще в режиме отладки таймеры останавливаются, когда ядро остановлено, чтобы не ломились дальше. Контроллер прерываний настроен по умолчанию (одна группа приоритетов и все высшие, равные нулю).

Если шагать по коду по F10, можно видеть, как считают таймеры, как появляется pending бит на NVIC для TIM4, затем, если хватит терпения давить F10, для TIM3, однако в прерывание отладчик не заходит. Можно с таким же успехом тыкать F11. В прерывании он не бывает. Это прекрасно видно по счетчикам TIM3_intcounter, TIM4_intcounter. Просто крутится в while (1) {}.

И только, если нажать Run (F5), ставя потом бряки в прерываниях, можно видеть, как обработчики включаются, счетчики считают, очищаются флаги событий счетчиков... (pending-и сами очищаются, как и должно быть)

Сказать бы, что при шаге он втихаря выполняет обработчик, так нет, - счетчики не меняются. F10 можно до посинения жмакать. Pending-и стоят. Реакции ноль.

Кто сталкивался?

Эта проблема вынесла мне мозг на прошлой неделе в реальном проекте. Но она легко воспроизводится и в таком, минимальном.

Надо, наверно, на четвертый keil возвращаться. Что-то тут глюки. Например, хваленое автодополнение (например, полей структур) сначала работает, при создании нового проекта, проходит несколько минут, - все, молчит как партизан. Симулятор (не железный отладчик) что то не работает, даже для 103 камня, read/write permision denied пишет на любую попытку доступа в адресах периферии, но это может быть я что-то не донастроил.

Спасибо.