/**
******************************************************************************
* @file main.c
* @author Ac6
* @version V1.0
* @date 01-December-2013
* @brief Default main function.
******************************************************************************
*/
#include "stm32f4xx.h"
#include "stm32f4_discovery.h"
#include <stm32f4xx_syscfg.h>
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(;;)
{
}
}