#include "stm32f4xx.h" #include "stm32f4_discovery.h" void TIM4_IRQHandler(void) { if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) { //czekaj na opróżnienie bufora wyjściowego while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET) ; // wyslanie danych USART_SendData(USART3, 'A'); // czekaj az dane zostana wyslane while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET) ; TIM_ClearITPendingBit(TIM4, TIM_IT_Update); } } void USART3_IRQHandler(void) { // sprawdzenie flagi zwiazanej z odebraniem danych przez USART if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { // odebrany bajt znajduje sie w rejestrze USART3->DR if(USART3->DR == '1') GPIO_ToggleBits(GPIOD,GPIO_Pin_12); if(USART3->DR == '2') GPIO_ToggleBits(GPIOD,GPIO_Pin_13); if(USART3->DR == '3') GPIO_ToggleBits(GPIOD,GPIO_Pin_14); if(USART3->DR == '4') GPIO_ToggleBits(GPIOD,GPIO_Pin_15); // while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET) // ; // // wyslanie danych // USART_SendData(USART3, USART3->DR - 0x20); // // czekaj az dane zostana wyslane // while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET) // ; } } int main(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); // ustawienie funkcji alternatywnej dla pinów (USART) GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 |GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 8399; TIM_TimeBaseStructure.TIM_Prescaler = 9999; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_Cmd(TIM4, ENABLE); USART_InitTypeDef USART_InitStructure; // predkosc transmisji (mozliwe standardowe opcje: 9600, 19200, 38400, 57600, 115200, ...) USART_InitStructure.USART_BaudRate = 115200; // długość słowa (USART_WordLength_8b lub USART_WordLength_9b) USART_InitStructure.USART_WordLength = USART_WordLength_8b; // liczba bitów stopu (USART_StopBits_1, USART_StopBits_0_5, USART_StopBits_2, USART_StopBits_1_5) USART_InitStructure.USART_StopBits = USART_StopBits_1; // sprawdzanie parzystości (USART_Parity_No, USART_Parity_Even, USART_Parity_Odd) USART_InitStructure.USART_Parity = USART_Parity_No; // sprzętowa kontrola przepływu (USART_HardwareFlowControl_None, USART_HardwareFlowControl_RTS, USART_HardwareFlowControl_CTS, USART_HardwareFlowControl_RTS_CTS) USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // tryb nadawania/odbierania (USART_Mode_Rx, USART_Mode_Rx ) USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART3, &USART_InitStructure); USART_Cmd(USART3, ENABLE); NVIC_InitTypeDef NVIC_InitStructure2; // numer przerwania NVIC_InitStructure2.NVIC_IRQChannel = TIM4_IRQn; // priorytet główny NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority = 0x00; // subpriorytet NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 0x00; // uruchom dany kanał NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE; // zapisz wypełnioną strukturę do rejestrów NVIC_Init(&NVIC_InitStructure2); TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // zezwolenie na przerwania od przepełnienia dla timera 3 TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //struktura do konfiguracji kontrolera NVIC NVIC_InitTypeDef NVIC_InitStructure; // wlaczenie przerwania związanego z odebraniem danych (pozostale zrodla przerwan zdefiniowane sa w pliku stm32f4xx_usart.h) USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // konfiguracja kontrolera przerwan NVIC_Init(&NVIC_InitStructure); // wlaczenie przerwan od ukladu USART NVIC_EnableIRQ(USART3_IRQn); for (;;) { } }