/** ****************************************************************************** * @file main.c * @author Ac6 * @version V1.0 * @date 01-December-2013 * @brief Default main function. ****************************************************************************** */ #include "stm32f4xx.h" #include "stm32f4_discovery.h" #include void TIM4_IRQHandler(void) { if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) { // miejsce na kod wywoływany w momencie wystąpienia przerwania GPIO_ToggleBits(GPIOD, GPIO_Pin_9); GPIO_ToggleBits(GPIOD,GPIO_Pin_8); // wyzerowanie flagi wyzwolonego przerwania TIM_ClearITPendingBit(TIM4, TIM_IT_Update); TIM_Cmd(TIM4, DISABLE); } } void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { TIM_Cmd(TIM4, ENABLE); EXTI_ClearITPendingBit(EXTI_Line0); } } int main(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 1679; TIM_TimeBaseStructure.TIM_Prescaler = 9999; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitTypeDef NVIC_InitStructure1; // numer przerwania NVIC_InitStructure1.NVIC_IRQChannel = EXTI0_IRQn; // priorytet główny NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0x00; // subpriorytet NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 0x00; // uruchom dany kanał NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE; // zapisz wypełnioną strukturę do rejestrów NVIC_Init(&NVIC_InitStructure1); NVIC_InitTypeDef NVIC_InitStructure; // numer przerwania NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; // priorytet główny NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; // subpriorytet NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; // uruchom dany kanał NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // zapisz wypełnioną strukturę do rejestrów NVIC_Init(&NVIC_InitStructure); // wyczyszczenie przerwania od timera 3 (wystąpiło przy konfiguracji timera) TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // zezwolenie na przerwania od przepełnienia dla timera 3 TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); /* GPIOD Periph clock enable */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); EXTI_InitTypeDef EXTI_InitStructure; // wybór numeru aktualnie konfigurowanej linii przerwań EXTI_InitStructure.EXTI_Line = EXTI_Line0; // wybór trybu - przerwanie bądź zdarzenie EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // wybór zbocza, na które zareaguje przerwanie EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // uruchom daną linię przerwań EXTI_InitStructure.EXTI_LineCmd = ENABLE; // zapisz strukturę konfiguracyjną przerwań zewnętrznych do rejestrów EXTI_Init(&EXTI_InitStructure); // podłączenie danego pinu portu do kontrolera przerwań SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource1); GPIO_ResetBits(GPIOD, GPIO_Pin_9|GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15); GPIO_SetBits(GPIOD,GPIO_Pin_8); for(;;) { } }