Guest User

Untitled

a guest
May 23rd, 2019
69
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