#include "stm32f4xx.h" #include "stm32f4_discovery.h" int main(void) { //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* Time base configuration TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 8400; TIM_TimeBaseStructure.TIM_Prescaler = 5000; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* Time base configuration TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1; TIM_TimeBaseStructure.TIM_Period = 8400; TIM_TimeBaseStructure.TIM_Prescaler = 7000; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); */ /* Time base configuration */ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 8400; TIM_TimeBaseStructure.TIM_Prescaler = 3000; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = 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); */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_8| GPIO_Pin_9; 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(GPIOA, &GPIO_InitStructure); GPIO_InitTypeDef GPIO_InitStructure2; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); //GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM3); //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //GPIO_Init(GPIOA, &GPIO_InitStructure); //TIM_Cmd(TIM3, ENABLE); //TIM_Cmd(TIM2, ENABLE); //TIM_Cmd(TIM4, ENABLE); /////////////////////////////////////////////// //TIM_OCInitTypeDef TIM_OCInitStructure; /* PWM1 Mode configuration: */ //TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //TIM_OCInitStructure.TIM_Pulse = 0; //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //TIM_OC1Init(TIM3, &TIM_OCInitStructure); //TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //TIM_OC1Init(TIM2, &TIM_OCInitStructure); // TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //TIM_OC1Init(TIM4, &TIM_OCInitStructure); // TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); // ustawienie trybu pracy priorytetów przerwań // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // NVIC_InitTypeDef NVIC_InitStructure; // numer przerwania // NVIC_InitStructure.NVIC_IRQChannel = TIM3_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); // NVIC_InitTypeDef NVIC_InitStructure1; // numer przerwania // NVIC_InitStructure.NVIC_IRQChannel = TIM2_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); // NVIC_InitTypeDef NVIC_InitStructure2; // 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); NVIC_InitTypeDef NVIC_InitStructure; // numer przerwania NVIC_InitStructure.NVIC_IRQChannel = EXTI0_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(TIM3, TIM_IT_Update); // zezwolenie na przerwania od przepełnienia dla timera 3 // TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // wyczyszczenie przerwania od timera 3 (wystąpiło przy konfiguracji timera) // TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // zezwolenie na przerwania od przepełnienia dla timera 3 // TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 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, DISABLE); 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); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource1); GPIO_ToggleBits(GPIOA, GPIO_Pin_1); // for(;;){ } } /* void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { GPIO_ToggleBits(GPIOA, GPIO_Pin_0); // wyzerowanie flagi wyzwolonego przerwania TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } } void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { GPIO_ToggleBits(GPIOA, GPIO_Pin_1); // wyzerowanie flagi wyzwolonego przerwania TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } */ void TIM4_IRQHandler(void) { if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) { GPIO_ToggleBits(GPIOA, GPIO_Pin_1); GPIO_ToggleBits(GPIOA, GPIO_Pin_2); // wyzerowanie flagi wyzwolonego przerwania TIM_ClearITPendingBit(TIM4, TIM_IT_Update); } } void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { TIM_Cmd(TIM4, ENABLE); // wyzerowanie flagi wyzwolonego przerwania EXTI_ClearITPendingBit(EXTI_Line0); } }