SHARE
TWEET

Untitled

a guest May 23rd, 2019 65 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "mcu_support_package/inc/stm32f10x.h"
  2.  
  3. static uint8_t Buffer = 0; //Буфер приемника
  4. static uint8_t Mess[5]; //сообщение-запрос
  5. static uint8_t Reply[4] = {0xAA,0xCC,0,0}; //сообщение-ответ
  6. static uint8_t count = 0; //счетчик, который соответствует количеству полученных правильных запросов
  7. static uint16_t Freq = 0; //частота динамика
  8.  
  9. void ProcessingRequest(void); //функция обработки запроса
  10. void ProcessingReply(void) ;//функция обработки ответа
  11.  
  12. void USART2_IRQHandler(void)
  13. {
  14.     static uint8_t irep = 1; //счетчик элементов ответа
  15.     if(USART_GetITStatus(USART2, USART_IT_TC) == SET) //Прерывание окончанию передачи
  16.     {
  17.         USART_SendData(USART2, Reply[irep]);
  18.         irep++;
  19.         if (irep>3)
  20.         {
  21.             irep=1;
  22.             USART_ITConfig(USART2, USART_IT_TC, DISABLE); //Передали, выключаем прерывание по передаче
  23.         }
  24.     }
  25.     else
  26.     {
  27.         Buffer = USART_ReceiveData(USART2);
  28.     }
  29. }
  30.  
  31. void SysTick_Handler(void) //для динамика
  32. {
  33.     //GPIOA->ODR^=GPIO_Pin_6;
  34.     static uint8_t a = 1; //для инверсии включения динамика
  35.     static uint8_t k = 1; //счетчик прерываний
  36.     static uint8_t f = 0; //коэффицент(когда подавать напряжение на динамик)
  37.     f=1000/Freq;
  38.     if(k == f)
  39.     {
  40.         if (a==1)
  41.         {
  42.             GPIO_SetBits(GPIOA, GPIO_Pin_6);
  43.         }
  44.         else
  45.         {
  46.             GPIO_ResetBits(GPIOA, GPIO_Pin_6);
  47.         }
  48.         a=~a;
  49.         k=0;
  50.     }
  51.     k++;
  52.     if (k>=254)
  53.     {
  54.         k=1; //обновляем счетчик, чтобы он не переполнился
  55.     }
  56. }
  57.  
  58. int main(void)
  59. {
  60.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //UART1 на выводах РА2(tx) и РА3(rx), динамик PA4
  61.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //Затактировали UART2
  62.    
  63.     GPIO_InitTypeDef gpioStruct;
  64.    
  65.     gpioStruct.GPIO_Mode = GPIO_Mode_Out_PP; //динамик
  66.     gpioStruct.GPIO_Pin = GPIO_Pin_6;
  67.     gpioStruct.GPIO_Speed = GPIO_Speed_2MHz;
  68.     GPIO_Init(GPIOA, &gpioStruct);
  69.    
  70.     gpioStruct.GPIO_Mode = GPIO_Mode_AF_PP; //РА2(tx)
  71.     gpioStruct.GPIO_Pin = GPIO_Pin_2;
  72.     GPIO_Init(GPIOA, &gpioStruct);
  73.    
  74.     gpioStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //РА3(rx)
  75.     gpioStruct.GPIO_Pin = GPIO_Pin_3;
  76.     GPIO_Init(GPIOA, &gpioStruct);
  77.    
  78.     USART_InitTypeDef UARTStruct; //Настройка UART
  79.    
  80.     UARTStruct.USART_BaudRate = 57600;
  81.     UARTStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  82.     UARTStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  83.     UARTStruct.USART_Parity = USART_Parity_No;
  84.     UARTStruct.USART_StopBits = USART_StopBits_1;
  85.     UARTStruct.USART_WordLength = USART_WordLength_8b;
  86.     USART_Init(USART2, &UARTStruct); //Инициализация
  87.    
  88.     USART_Cmd(USART2, ENABLE); //Включение UART
  89.    
  90.     __disable_irq();
  91.     SysTick_Config((SystemCoreClock/10000)-1);
  92.     USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //Прерывание по факту приема данных
  93.     NVIC_EnableIRQ(USART2_IRQn);
  94.     __enable_irq();
  95.    
  96.     while(1)
  97.     {
  98.         ProcessingRequest();
  99.     }
  100.     return 0;
  101. }
  102.  
  103. void ProcessingRequest(void) //функция обработки запроса
  104. {
  105.     static uint8_t Buf = 0; //предыдущее значение буфера
  106.     static int chsum = 0; //теоретическая контрольная сумма
  107.     if (Buf!=Buffer) //если значение буфера изменилось
  108.     {
  109.         Buf=Buffer;
  110.         //Freq=Buffer;
  111.         SysTick_Config((SystemCoreClock/(Freq*2))-1);
  112.         for(int i=0; i<4; i++)
  113.         {
  114.             Mess[i]=Mess[i+1];
  115.         }
  116.         Mess[4]=Buffer;
  117.         chsum=(Mess[0]+Mess[1]+Mess[2]+Mess[3])%256;
  118.         if(Mess[0]==0xBB&&Mess[1]==0xCC&&Mess[4]==chsum)
  119.         {
  120.             count++; //пополняем счетчик, который соответствует количеству полученных правильных запросов
  121.             if(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == SET)
  122.             {
  123.                 ProcessingReply (); //обрабатывает ответ
  124.                 USART_SendData(USART2, Reply[0]);
  125.                 USART_ITConfig(USART2, USART_IT_TC, ENABLE); //так как отправили только четверть, включаем прерывания по передаче
  126.             }
  127.             Freq=(Mess[3]<<8) + Mess[2]; //считываем частоту
  128.         }
  129.     }
  130. }
  131. void ProcessingReply(void) //функция обработки ответа
  132. {
  133.     Reply[2]=count;
  134.     Reply[3]=(0xAA+0xCC+count)%256;
  135.     if (count>=254)
  136.     {
  137.         count=0; //обнуляем счетчик, чтобы он не переполнился
  138.     }
  139. }
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148. // В Project->Options->Linker, Scatter File выбран файл stack_protection.sct
  149. // он обеспечивает падение в HardFault при переполнении стека
  150. // Из-за этого может выдаваться ложное предупреждение "AppData\Local\Temp\p2830-2(34): warning:  #1-D: last line of file ends without a newline"
  151.  
  152. #ifdef USE_FULL_ASSERT
  153.  
  154. // эта функция вызывается, если assert_param обнаружил ошибку
  155. void assert_failed(uint8_t * file, uint32_t line)
  156. {
  157.     /* User can add his own implementation to report the file name and line number,
  158.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  159.  
  160.     (void)file;
  161.     (void)line;
  162.  
  163.     __disable_irq();
  164.     while(1)
  165.     {
  166.         // это ассемблерная инструкция "отладчик, стой тут"
  167.         // если вы попали сюда, значит вы ошиблись в параметрах вызова функции из SPL.
  168.         // Смотрите в call stack, чтобы найти ее
  169.         __BKPT(0xAB);
  170.     }
  171. }
  172.  
  173. #endif
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top