Facebook
From pussyhounter, 6 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 216
  1. #include "stm32f4xx.h"
  2. #include "stm32f4_discovery.h"
  3.  
  4. void TIM4_IRQHandler(void) {
  5.         if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) {
  6.                 //czekaj na opróżnienie bufora wyjściowego
  7.                 while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET)
  8.                         ;
  9.                 // wyslanie danych
  10.                 USART_SendData(USART3, 'A');
  11.                 // czekaj az dane zostana wyslane
  12.                 while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
  13.                         ;
  14.                 TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
  15.         }
  16. }
  17. void USART3_IRQHandler(void) {
  18. // sprawdzenie flagi zwiazanej z odebraniem danych przez USART
  19.         if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) {
  20. // odebrany bajt znajduje sie w rejestrze USART3->DR
  21.                 if(USART3->DR == '1')   GPIO_ToggleBits(GPIOD,GPIO_Pin_12);
  22.                 if(USART3->DR == '2')   GPIO_ToggleBits(GPIOD,GPIO_Pin_13);
  23.                 if(USART3->DR == '3')   GPIO_ToggleBits(GPIOD,GPIO_Pin_14);
  24.                 if(USART3->DR == '4')   GPIO_ToggleBits(GPIOD,GPIO_Pin_15);
  25.  
  26. //              while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET)
  27. //                      ;
  28. //              // wyslanie danych
  29. //              USART_SendData(USART3, USART3->DR - 0x20);
  30. //              // czekaj az dane zostana wyslane
  31. //              while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
  32. //                      ;
  33.  
  34.         }
  35. }
  36.  
  37. int main(void) {
  38.  
  39.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  40.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  41.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  42.         //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  43.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  44.  
  45.         GPIO_InitTypeDef GPIO_InitStructure;
  46.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
  47.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  48.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  49.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  50.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  51.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  52.         // ustawienie funkcji alternatywnej dla pinów (USART)
  53.         GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3);
  54.         GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3);
  55.  
  56.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 |GPIO_Pin_14 | GPIO_Pin_15;
  57.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  58.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  59.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  60.         GPIO_Init(GPIOD, &GPIO_InitStructure);
  61.  
  62.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  63.  
  64.         /* Time base configuration */
  65.         TIM_TimeBaseStructure.TIM_Period = 8399;
  66.         TIM_TimeBaseStructure.TIM_Prescaler = 9999;
  67.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  68.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  69.         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  70.  
  71.         TIM_Cmd(TIM4, ENABLE);
  72.  
  73.         USART_InitTypeDef USART_InitStructure;
  74.         // predkosc transmisji (mozliwe standardowe opcje: 9600, 19200, 38400, 57600, 115200, ...)
  75.         USART_InitStructure.USART_BaudRate = 115200;
  76.         // długość słowa (USART_WordLength_8b lub USART_WordLength_9b)
  77.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  78.         // liczba bitów stopu (USART_StopBits_1, USART_StopBits_0_5, USART_StopBits_2, USART_StopBits_1_5)
  79.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  80.         // sprawdzanie parzystości (USART_Parity_No, USART_Parity_Even, USART_Parity_Odd)
  81.         USART_InitStructure.USART_Parity = USART_Parity_No;
  82.         // sprzętowa kontrola przepływu (USART_HardwareFlowControl_None, USART_HardwareFlowControl_RTS, USART_HardwareFlowControl_CTS, USART_HardwareFlowControl_RTS_CTS)
  83.         USART_InitStructure.USART_HardwareFlowControl =
  84.         USART_HardwareFlowControl_None;
  85.         // tryb nadawania/odbierania (USART_Mode_Rx, USART_Mode_Rx )
  86.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  87.  
  88.         USART_Init(USART3, &USART_InitStructure);
  89.  
  90.         USART_Cmd(USART3, ENABLE);
  91.  
  92.         NVIC_InitTypeDef NVIC_InitStructure2;
  93.         // numer przerwania
  94.         NVIC_InitStructure2.NVIC_IRQChannel = TIM4_IRQn;
  95.         // priorytet główny
  96.         NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority = 0x00;
  97.         // subpriorytet
  98.         NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 0x00;
  99.         // uruchom dany kanał
  100.         NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
  101.         // zapisz wypełnioną strukturę do rejestrów
  102.         NVIC_Init(&NVIC_InitStructure2);
  103.         TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
  104.         // zezwolenie na przerwania od przepełnienia dla timera 3
  105.         TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
  106.  
  107.         //struktura do konfiguracji kontrolera NVIC
  108.         NVIC_InitTypeDef NVIC_InitStructure;
  109.         // wlaczenie przerwania związanego z odebraniem danych (pozostale zrodla przerwan zdefiniowane sa w pliku stm32f4xx_usart.h)
  110.         USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  111.         NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  112.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  113.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  114.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  115.         // konfiguracja kontrolera przerwan
  116.         NVIC_Init(&NVIC_InitStructure);
  117.         // wlaczenie przerwan od ukladu USART
  118.         NVIC_EnableIRQ(USART3_IRQn);
  119.  
  120.         for (;;) {
  121.  
  122.         }
  123.  
  124. }
  125.  
  126.