Сегодня посмотрел примеры для других плат, что-то переделал и запустил прерывание на своей, заморгало:
void TIM_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure;
/* Enable TIM2 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* TIM1 config */ TIM_TimeBaseStructure.TIM_Period = 0x4AF; TIM_TimeBaseStructure.TIM_Prescaler = ((SystemCoreClock/1200) - 1); TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
#if 0 /* Output Compare Timing Mode configuration: Channel1 */ TIM_OCStructInit(&TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; TIM_OCInitStructure.TIM_Pulse = 0x0; TIM_OC1Init(TIM1, &TIM_OCInitStructure); #endif /* Immediate load of TIM2 Precaler values */ TIM_PrescalerConfig(TIM2, ((SystemCoreClock/1200) - 1), TIM_PSCReloadMode_Immediate);
/* Clear TIM2 update pending flags */ TIM_ClearFlag(TIM2, TIM_FLAG_Update);
/* Enable the TIM2 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
/* Enable TIM2 Update interrupts */ TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); /* TIM2 enable counters */ TIM_Cmd(TIM2, ENABLE); }
void TIM2_IRQHandler(void) { /* Clear TIM3 update interrupt */ TIM_ClearITPendingBit(TIM2, TIM_IT_Update); /* Toggle LED2 */ STM32vldiscovery_LEDToggle(LED3); }
поясните мне пожалуйста, зачем в обработчике нужно вот это: TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
И еще, там где закоментировано if 0 endif в этом случае выход таймера подсоединяется на внешнюю ногу, я прав?
и еще последний вопрос, все эти обработчики уже объявлены в ассемблерном файле boot и чтобы вызвать что то из обработчика нужно или внутрь него писать или вызвать из него внешнюю функцию. не накладно ли? (push pop...)-так сделано в примерах.
|