ASR_usart.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #include "main.h"
  2. static void USART_Config(void);
  3. static void Usart_SendByte(char ch);
  4. static void Usart_SendString(char *str);
  5. static void VoiceRecData_handle(void);
  6. static void voiceUsartString(char* str, char head, char value1, char value2);
  7. ASRUsartClassStruct ASRUsartClass = {
  8. .Init = USART_Config,
  9. .SendByte = Usart_SendByte,
  10. .SendString = Usart_SendString,
  11. .ASR_Handle = VoiceRecData_handle
  12. };
  13. char voiceUsartStringData[6];
  14. static uint8_t voiceUsartRecData = 0;
  15. #if 0
  16. #define ASR_USARTx USART1
  17. #define ASR_USART_CLK RCC_APB2Periph_USART1
  18. #define ASR_USART_APBxClkCmd RCC_APB2PeriphClockCmd
  19. #define ASR_USART_BAUDRATE 115200
  20. #define ASR_USART_GPIO_CLK (RCC_APB2Periph_GPIOA)
  21. #define ASR_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
  22. #define ASR_USART_TX_GPIO_PORT GPIOA
  23. #define ASR_USART_TX_GPIO_PIN GPIO_Pin_9
  24. #define ASR_USART_RX_GPIO_PORT GPIOA
  25. #define ASR_USART_RX_GPIO_PIN GPIO_Pin_10
  26. #define ASR_USART_IRQ USART1_IRQn
  27. #define ASR_USART_IRQHandler USART1_IRQHandler
  28. #else
  29. #define ASR_USARTx USART2
  30. #define ASR_USART_CLK RCC_APB1Periph_USART2
  31. #define ASR_USART_APBxClkCmd RCC_APB1PeriphClockCmd
  32. #define ASR_USART_BAUDRATE 115200
  33. #define ASR_USART_GPIO_CLK (RCC_APB2Periph_GPIOA)
  34. #define ASR_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
  35. #define ASR_USART_TX_GPIO_PORT GPIOA
  36. #define ASR_USART_TX_GPIO_PIN GPIO_Pin_2
  37. #define ASR_USART_RX_GPIO_PORT GPIOA
  38. #define ASR_USART_RX_GPIO_PIN GPIO_Pin_3
  39. #define ASR_USART_IRQ USART2_IRQn
  40. #define ASR_USART_IRQHandler USART2_IRQHandler
  41. #endif
  42. /**
  43. * @brief 串口初始化
  44. * @param None
  45. * @retval None
  46. * @note None
  47. */
  48. static void USART_Config(void)
  49. {
  50. NVIC_InitTypeDef NVIC_InitStructure;
  51. GPIO_InitTypeDef GPIO_InitStructure;
  52. USART_InitTypeDef USART_InitStructure;
  53. ASR_USART_GPIO_APBxClkCmd(ASR_USART_GPIO_CLK, ENABLE);
  54. ASR_USART_APBxClkCmd(ASR_USART_CLK, ENABLE);
  55. GPIO_InitStructure.GPIO_Pin = ASR_USART_TX_GPIO_PIN;
  56. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  57. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  58. GPIO_Init(ASR_USART_TX_GPIO_PORT, &GPIO_InitStructure);
  59. GPIO_InitStructure.GPIO_Pin = ASR_USART_RX_GPIO_PIN;
  60. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  61. GPIO_Init(ASR_USART_RX_GPIO_PORT, &GPIO_InitStructure);
  62. USART_InitStructure.USART_BaudRate = ASR_USART_BAUDRATE;
  63. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  64. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  65. USART_InitStructure.USART_Parity = USART_Parity_No ;
  66. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  67. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  68. USART_Init(ASR_USARTx, &USART_InitStructure);
  69. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  70. NVIC_InitStructure.NVIC_IRQChannel = ASR_USART_IRQ;
  71. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  72. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  73. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  74. NVIC_Init(&NVIC_InitStructure);
  75. USART_Cmd(ASR_USARTx, ENABLE);
  76. USART_ITConfig(ASR_USARTx, USART_IT_RXNE, ENABLE);
  77. }
  78. /**
  79. * @brief ASR串口中断
  80. * @param None
  81. * @retval None
  82. */
  83. void ASR_USART_IRQHandler(void)
  84. {
  85. if(USART_GetITStatus(ASR_USARTx, USART_IT_RXNE) != RESET)
  86. {
  87. voiceUsartRecData = USART_ReceiveData(ASR_USARTx);
  88. #ifdef DEBUG_printf
  89. printf("ASR ID : %d\n", voiceUsartRecData);
  90. #endif
  91. }
  92. }
  93. /**
  94. * @brief 语音数据处理
  95. * @param None
  96. * @retval None
  97. * @note 接收语音模块传回的数据,进行指定操作
  98. */
  99. static void VoiceRecData_handle(void)
  100. {
  101. if(voiceUsartRecData != 0)
  102. {
  103. switch(voiceUsartRecData)
  104. {
  105. case 0x5: // 打开窗帘
  106. if(!AllFlag.window_CurrentSW_flag) AllFlag.window_SW_flag = 1;
  107. break;
  108. case 0x6: // 关闭窗帘
  109. if(AllFlag.window_CurrentSW_flag) AllFlag.window_SW_flag = 2;
  110. break;
  111. case 0x7: // 打开灯光
  112. AllFlag.LED_SW_flag = 1;
  113. break;
  114. case 0x8: // 关闭灯光
  115. AllFlag.LED_SW_flag = 0;
  116. break;
  117. case 0x9: // 打开风扇
  118. AllFlag.AutoCtrl_openTime = 0;
  119. AllFlag.AutoCtrl_flag = 1;
  120. GPIOClass.Set(FAN);
  121. break;
  122. case 0xA: // 关闭风扇
  123. AllFlag.AutoCtrl_openTime = 0;
  124. AllFlag.AutoCtrl_flag = 1;
  125. GPIOClass.Reset(FAN);
  126. break;
  127. case 0xB: // 打开加湿器
  128. AllFlag.AutoCtrl_openTime = 0;
  129. AllFlag.AutoCtrl_flag = 1;
  130. GPIOClass.Set(RELAY);
  131. break;
  132. case 0xC: // 关闭加湿器
  133. AllFlag.AutoCtrl_openTime = 0;
  134. AllFlag.AutoCtrl_flag = 1;
  135. GPIOClass.Reset(RELAY);
  136. break;
  137. case 0xD: // 当前温度
  138. voiceUsartString(voiceUsartStringData, 'A', DHT11Data.temp_int, DHT11Data.humi_int);
  139. Usart_SendString(voiceUsartStringData);
  140. case 0xE: // 当前湿度
  141. voiceUsartString(voiceUsartStringData, 'A', DHT11Data.temp_int, DHT11Data.humi_int);
  142. Usart_SendString(voiceUsartStringData);
  143. break;
  144. }
  145. voiceUsartRecData = 0;
  146. }
  147. }
  148. /**
  149. * @brief 语音串口协议 拼接字符串
  150. * @param *str:字符串地址
  151. * @param head:帧头
  152. * @param value1:数据值
  153. * @param value2:数据值
  154. * @retval None
  155. * @note None
  156. */
  157. static void voiceUsartString(char* str, char head, char value1, char value2)
  158. {
  159. str[0] = head;
  160. str[1] = value1/10 + '0';
  161. str[2] = value1%10 + '0';
  162. str[3] = value2/10 + '0';
  163. str[4] = value2%10 + '0';
  164. str[5] = '\0';
  165. }
  166. /**
  167. * @brief 阻塞发送一个字节
  168. * @param None
  169. * @retval None
  170. */
  171. static void Usart_SendByte(char ch)
  172. {
  173. USART_SendData(ASR_USARTx,ch);
  174. while(USART_GetFlagStatus(ASR_USARTx, USART_FLAG_TXE) == RESET);
  175. }
  176. /**
  177. * @brief 阻塞发送字符串
  178. * @param None
  179. * @retval None
  180. */
  181. static void Usart_SendString(char *str)
  182. {
  183. unsigned int k=0;
  184. do
  185. {
  186. Usart_SendByte(*(str + k) );
  187. k++;
  188. }while(*(str + k)!='\0');
  189. while(USART_GetFlagStatus(ASR_USARTx,USART_FLAG_TC)==RESET);
  190. }