Ну вот у меня в проекте есть RTOS. Я делаю так:
Да, я люблю прямое обращение к регистрам, но это не принципиально. Это инит таймера. Сам обработчик оформляю в main.c так:Код:// Настройка таймера RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE ); // Запуск таймера TIM3 если он стоял (зависимость модуля от таймера) TIM3->PSC = 0x00A7; TIM3->ARR = 0xFFFF; TIM3->CCMR1 = 0x0000; TIM3->CCMR2 = 0x3131; TIM3->CCER = 0x3300; TIM3->SMCR = 0x0000; TIM3->DIER = 0x0000; TIM3->CR1 = 0x0001; // Включаем прерывания NVIC_EnableIRQ(TIM3_IRQn); TIM3->DIER = (TIM3->DIER & ~TIM_DIER_CC1IE) | TIM_DIER_CC3IE;
А в стартовом коде не забываем выставить приоритеты нужным нам прерываниям:Код:// Прерывание таймера TIM3 void TIM3_IRQHandler ( void ) { TIM3_IRQ(); }
Резюмирую: Чудес не бывает. STM32 сложнее АТмеги и там надо все делать руками. Т.е., для активации всей цепочки прерываний надо обязательно включить [тактирование] всего оборудования, что ты используешь (без исключений). Надо выставить все необходимые флаги и маски в настройках самого устройства (источники прерываний). Надо активировать необходимые прерывания в контроллере прерываний NVIC, при использовании всяких RTOS - дополнительно распределить приоритеты. Перехватить сам вектор прерывания (по умолчанию все неиспользованные вектора стоят как .weak и для перехвата просто достаточно объявить их в main.c). Если используются ноги - то и там следует настроить AF. Как-то так...Код:static void NVIC_Configuration ( void ) { NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 ); NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( &NVIC_InitStructure ); NVIC_InitStructure.NVIC_IRQChannel = SD_SDIO_DMA_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_Init( &NVIC_InitStructure ); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( &NVIC_InitStructure ); }




Ответить с цитированием