usart.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /**************************************************************
  2. ** 串口路由器
  3. ** 功能描述: STM32串口操作
  4. ** 版本:V1.0
  5. ***************************************************************/
  6. #include "usart.h"
  7. //#include "string.h"
  8. #include "stm32f0xx_gpio.h"
  9. #include "stm32f0xx_usart.h"
  10. #include "stm32f0xx_rcc.h"
  11. #include "ALL_Includes.h"
  12. unsigned char uart1Buf[100],uart1BufIndex=0;
  13. extern unsigned char USART1_Finish_Flag;
  14. uint32_t baudrateval = 9600;
  15. extern uint8_t sendbuf[10];
  16. uint32_t baudrate_send = 9600;
  17. void AutoBauRate_StartBitMethod(void)
  18. {
  19. USART_AutoBaudRateConfig(USART1, USART_AutoBaudRate_StartBit);
  20. USART_AutoBaudRateCmd(USART1, ENABLE);
  21. while(USART_GetFlagStatus(USART1, USART_FLAG_REACK) == RESET)
  22. {}
  23. while(USART_GetFlagStatus(USART1, USART_FLAG_TEACK) == RESET)
  24. {}
  25. /* Loop until the end of Autobaudrate phase */
  26. while(USART_GetFlagStatus(USART1, USART_FLAG_ABRF) == RESET)
  27. {}
  28. /* If AutoBaudBate error occurred */
  29. if (USART_GetFlagStatus(USART1, USART_FLAG_ABRE) != RESET)
  30. {
  31. }
  32. else
  33. {
  34. /* Wait until RXNE flag is set */
  35. while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
  36. {}
  37. /* Wait until TXE flag is set */
  38. while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
  39. {}
  40. //将收到的数据发送到串口
  41. USART_SendData(USART1, USART_ReceiveData(USART1));
  42. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  43. {}
  44. //计算波特率
  45. baudrateval = 72000000 / USART1->BRR;
  46. USART1_NVIC_Config();
  47. }
  48. }
  49. void USART1_NVIC_Config(void) //配置IO口和中断配置
  50. {
  51. NVIC_InitTypeDef NVIC_InitStructure;
  52. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //通道设置为串口1中断
  53. NVIC_InitStructure.NVIC_IRQChannelPriority = 1; //中断占先等级3
  54. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断
  55. NVIC_Init(&NVIC_InitStructure);
  56. }
  57. void USART1_Init_Config(void) //配置IO口和中断配置
  58. {
  59. GPIO_InitTypeDef GPIO_InitStructure;
  60. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  61. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  62. GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
  63. GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
  64. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;
  65. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
  66. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  67. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  68. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  69. GPIO_Init(GPIOA,&GPIO_InitStructure);
  70. }
  71. void USART1_Send_Init(void)
  72. {
  73. USART_InitTypeDef Usart_InitStructure;
  74. USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);
  75. USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
  76. USART_Cmd(USART1, DISABLE);
  77. USART_DeInit(USART1);
  78. Usart_InitStructure.USART_BaudRate=9600;
  79. Usart_InitStructure.USART_WordLength=USART_WordLength_8b;
  80. Usart_InitStructure.USART_Parity=USART_Parity_No;
  81. Usart_InitStructure.USART_StopBits=USART_StopBits_1;
  82. Usart_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  83. Usart_InitStructure.USART_Mode=USART_Mode_Tx;
  84. USART_Init(USART1,&Usart_InitStructure);
  85. USART_Cmd(USART1,ENABLE);
  86. }
  87. void USART1_Send_Buffer(void)
  88. {
  89. int i;
  90. if (uart1BufIndex>0)
  91. {
  92. LED_On();
  93. USART1_Send_Init();
  94. for (i=0;i<uart1BufIndex;i++)
  95. {
  96. USART_SendData(USART1, uart1Buf[i]);
  97. }
  98. uart1BufIndex=0;
  99. WatchDog_Feed();
  100. LED_Off();
  101. }
  102. }
  103. void USART1_Init(uint32_t baud)
  104. {
  105. USART_InitTypeDef USART_InitStructure;
  106. //NVIC_InitTypeDef NVIC_InitStructure;
  107. USART_Cmd(USART1, DISABLE);
  108. USART_DeInit(USART1);
  109. /* USART1的基本配置 */
  110. USART_InitStructure.USART_BaudRate = baud; //波特率
  111. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  112. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  113. USART_InitStructure.USART_Parity = USART_Parity_No;
  114. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  115. USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
  116. USART_Init(USART1, &USART_InitStructure);
  117. USART_Cmd(USART1, ENABLE);
  118. }
  119. void USART1_Receive_Init(uint32_t bound,uint32_t Parity,uint32_t StopBits)
  120. {
  121. USART_InitTypeDef USART_InitStructure;
  122. USART_Cmd(USART1, DISABLE);
  123. USART_DeInit(USART1);
  124. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //使能GPIOA的时钟
  125. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能USART的时钟
  126. USART_InitStructure.USART_BaudRate = bound; //波特率1200
  127. USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据
  128. USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位1位
  129. USART_InitStructure.USART_Parity = USART_Parity_No ; //无
  130. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  131. USART_InitStructure.USART_Mode = USART_Mode_Rx;
  132. USART_Init(USART1, &USART_InitStructure);
  133. USART1_Finish_Flag=0;
  134. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  135. USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
  136. USART_Cmd(USART1, ENABLE);
  137. }
  138. void USART1_IRQHandler(void)
  139. {
  140. unsigned char temp=0;
  141. if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
  142. {
  143. USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  144. USART_ClearFlag(USART1,USART_FLAG_RXNE);
  145. temp = USART_ReceiveData(USART1);
  146. uart1Buf[uart1BufIndex++]=temp;
  147. if (uart1BufIndex>=99) uart1BufIndex = 0;
  148. }
  149. if(USART_GetITStatus(USART1,USART_IT_IDLE) == SET)
  150. {
  151. USART_ClearITPendingBit(USART1, USART_IT_IDLE);
  152. temp = USART_ReceiveData(USART1);
  153. USART1_Finish_Flag = 1; //一帧数据接收完成
  154. }
  155. if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET) //溢出
  156. {
  157. USART_ClearFlag(USART1,USART_FLAG_ORE); //读SR
  158. USART_ReceiveData(USART1); //读DR
  159. }
  160. }
  161. void BLE_init(void)
  162. {
  163. USART1_Init(9600); //为初始化蓝牙配置
  164. delay_ms_(50);
  165. USART_SendData(USART1, 0x41);
  166. USART_SendData(USART1, 0x54);
  167. USART_SendData(USART1, 0x2B);
  168. USART_SendData(USART1, 0x48);
  169. USART_SendData(USART1, 0x4F);
  170. USART_SendData(USART1, 0x53);
  171. USART_SendData(USART1, 0x54);
  172. USART_SendData(USART1, 0x45);
  173. USART_SendData(USART1, 0x4E);
  174. USART_SendData(USART1, 0x30);
  175. USART_SendData(USART1, 0x0D);
  176. USART_SendData(USART1, 0x0A);
  177. delay_ms_(10);
  178. USART_SendData(USART1, 0x41);
  179. USART_SendData(USART1, 0x54);
  180. USART_SendData(USART1, 0x2B);
  181. USART_SendData(USART1, 0x52);
  182. USART_SendData(USART1, 0x53);
  183. USART_SendData(USART1, 0x54);
  184. USART_SendData(USART1, 0x0D);
  185. USART_SendData(USART1, 0x0A);
  186. delay_ms_(100);
  187. }
  188. void Uart_Process(void)
  189. {
  190. int i=0,j=1;
  191. u8 tem;
  192. if (uart1BufIndex>0)
  193. {
  194. while(i<100 && uart1Buf[i]!=0x00)
  195. {
  196. if(0x24==uart1Buf[i++])
  197. {
  198. if(0x31==uart1Buf[i++])
  199. {
  200. LED_On();
  201. USART1_Send_Init();
  202. for(j=0;j<6;j++) sendbuf[j] = uart1Buf[j+4];
  203. for(j=1;j<5;j++)
  204. {
  205. if (sendbuf[j]>0x30)
  206. {tem = sendbuf[0]; sendbuf[0] = 0x20; sendbuf[j-1] = tem; break;}
  207. else sendbuf[j] = 0x20;
  208. }
  209. for(j=1;j<6;j++) USART_SendData(USART1, sendbuf[j]);
  210. USART_SendData(USART1, 0x0D);
  211. WatchDog_Feed();
  212. LED_Off();
  213. }
  214. }
  215. }
  216. uart1BufIndex = 0;
  217. }
  218. }
  219. /******************** End of File**************************/