USART.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #include "main.h"
  2. static void USART1_Init(uint32_t baudRate);
  3. static void USART2_Init(uint32_t baudRate);
  4. static void USART3_Init(uint32_t baudRate);
  5. static void USART_SendString1(USART_TypeDef *USARTx, uint8_t *str, uint16_t len);
  6. static void USART_SendString2(USART_TypeDef* USARTx, uint8_t *str);
  7. USARTClassStruct USARTClass = {
  8. .USART1_Init = USART1_Init,
  9. .USART2_Init = USART2_Init,
  10. .USART3_Init = USART3_Init,
  11. .USART_SendString1 = USART_SendString1,
  12. .USART_SendString2 = USART_SendString2
  13. };
  14. #define use_USART1
  15. #define use_USART2
  16. //#define use_USART3
  17. #define DEBUG_USART USART1
  18. /* 在别的地方复现此函数 串口1中断函数
  19. void USART1_IRQHandler(void)
  20. {
  21. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
  22. USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  23. }
  24. }
  25. */
  26. /* 在别的地方复现此函数 串口2中断函数
  27. void USART2_IRQHandler(void)
  28. {
  29. if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
  30. USART_ClearITPendingBit(USART2, USART_IT_RXNE);
  31. }
  32. }
  33. */
  34. /* 在别的地方复现此函数 串口3中断函数
  35. void USART3_IRQHandler(void)
  36. {
  37. if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) {
  38. USART_ClearITPendingBit(USART3, USART_IT_RXNE);
  39. }
  40. }
  41. */
  42. /**
  43. * @brief USART1初始化
  44. * @param baudRate: 波特率
  45. * @retval None
  46. */
  47. static void USART1_Init(uint32_t baudRate)
  48. {
  49. #ifdef use_USART1
  50. GPIO_InitTypeDef GPIO_InitStructure;
  51. USART_InitTypeDef USART_InitStructure;
  52. NVIC_InitTypeDef NVIC_InitStructure;
  53. // 打开串口GPIO的时钟
  54. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  55. // 打开串口外设的时钟
  56. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  57. // 将USART Tx的GPIO配置为推挽复用模式
  58. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  59. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  60. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  61. GPIO_Init(GPIOA, &GPIO_InitStructure);
  62. // 将USART Rx的GPIO配置为浮空输入模式
  63. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  64. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  65. GPIO_Init(GPIOA, &GPIO_InitStructure);
  66. // 配置波特率
  67. USART_InitStructure.USART_BaudRate = baudRate;
  68. // 配置 针数据字长
  69. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  70. // 配置停止位
  71. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  72. // 配置校验位
  73. USART_InitStructure.USART_Parity = USART_Parity_No;
  74. // 配置硬件流控制
  75. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  76. // 配置工作模式,收发一起
  77. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  78. // 完成串口的初始化配置
  79. USART_Init(USART1, &USART_InitStructure);
  80. // 使能串口
  81. USART_Cmd(USART1, ENABLE);
  82. //使能接收中断
  83. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  84. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //中断控制器分组设置
  85. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  86. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  87. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
  88. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  89. NVIC_Init(&NVIC_InitStructure);
  90. #endif
  91. }
  92. /**
  93. * @brief USART2初始化
  94. * @param baudRate: 波特率
  95. * @retval None
  96. */
  97. static void USART2_Init(uint32_t baudRate)
  98. {
  99. #ifdef use_USART2
  100. GPIO_InitTypeDef GPIO_InitStructure;
  101. USART_InitTypeDef USART_InitStructure;
  102. NVIC_InitTypeDef NVIC_InitStructure;
  103. // 打开串口GPIO的时钟
  104. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  105. // 打开串口外设的时钟
  106. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  107. // 将USART Tx的GPIO配置为推挽复用模式
  108. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  109. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  110. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  111. GPIO_Init(GPIOA, &GPIO_InitStructure);
  112. // 将USART Rx的GPIO配置为浮空输入模式
  113. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  114. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  115. GPIO_Init(GPIOA, &GPIO_InitStructure);
  116. // 配置波特率
  117. USART_InitStructure.USART_BaudRate = baudRate;
  118. // 配置 针数据字长
  119. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  120. // 配置停止位
  121. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  122. // 配置校验位
  123. USART_InitStructure.USART_Parity = USART_Parity_No;
  124. // 配置硬件流控制
  125. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  126. // 配置工作模式,收发一起
  127. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  128. // 完成串口的初始化配置
  129. USART_Init(USART2, &USART_InitStructure);
  130. // 使能串口
  131. USART_Cmd(USART2, ENABLE);
  132. //使能接收中断
  133. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  134. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //中断控制器分组设置
  135. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  136. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  137. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  138. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  139. NVIC_Init(&NVIC_InitStructure);
  140. #endif
  141. }
  142. /**
  143. * @brief USART3初始化
  144. * @param baudRate: 波特率
  145. * @retval None
  146. */
  147. static void USART3_Init(uint32_t baudRate)
  148. {
  149. #ifdef use_USART3
  150. GPIO_InitTypeDef GPIO_InitStructure;
  151. USART_InitTypeDef USART_InitStructure;
  152. NVIC_InitTypeDef NVIC_InitStructure;
  153. // 打开串口GPIO的时钟
  154. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  155. // 打开串口外设的时钟
  156. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  157. // 将USART Tx的GPIO配置为推挽复用模式
  158. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  159. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  160. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  161. GPIO_Init(GPIOB, &GPIO_InitStructure);
  162. // 将USART Rx的GPIO配置为浮空输入模式
  163. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  164. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  165. GPIO_Init(GPIOB, &GPIO_InitStructure);
  166. // 配置波特率
  167. USART_InitStructure.USART_BaudRate = baudRate;
  168. // 配置 针数据字长
  169. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  170. // 配置停止位
  171. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  172. // 配置校验位
  173. USART_InitStructure.USART_Parity = USART_Parity_No;
  174. // 配置硬件流控制
  175. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  176. // 配置工作模式,收发一起
  177. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  178. // 完成串口的初始化配置
  179. USART_Init(USART3, &USART_InitStructure);
  180. // 使能串口
  181. USART_Cmd(USART3, ENABLE);
  182. //使能接收中断
  183. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  184. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //中断控制器分组设置
  185. NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  186. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  187. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  188. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  189. NVIC_Init(&NVIC_InitStructure);
  190. #endif
  191. }
  192. /**
  193. * @brief USART发送定长字符串
  194. * @param USARTx: 串口几发送
  195. * @param str: 发送的内容
  196. * @param len: 长度
  197. * @retval None
  198. */
  199. static void USART_SendString1(USART_TypeDef *USARTx, uint8_t *str, uint16_t len)
  200. {
  201. unsigned short count = 0;
  202. for(; count < len; count++)
  203. {
  204. USART_SendData(USARTx, *str++); //发送数据
  205. while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET); //等待发送完成
  206. }
  207. }
  208. /**
  209. * @brief USART发送不定长字符串
  210. * @param USARTx: 串口几发送
  211. * @param str: 发送的内容
  212. * @retval None
  213. */
  214. static void USART_SendString2(USART_TypeDef* USARTx, uint8_t *str)
  215. {
  216. unsigned int k=0;
  217. do
  218. {
  219. USART_SendData(USARTx, *(str + k) );
  220. /* 等待发送数据寄存器为空 */
  221. while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){}
  222. k++;
  223. }while(*(str + k)!= '\0');
  224. /* 等待发送完成 */
  225. while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET){}
  226. }
  227. #ifdef DEBUG_printf
  228. ///重定向c库函数printf到串口,重定向后可使用printf函数
  229. int fputc(int ch, FILE *f)
  230. {
  231. /* 发送一个字节数据到串口 */
  232. USART_SendData(DEBUG_USART, (uint8_t) ch);
  233. /* 等待发送完毕 */
  234. while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE) == RESET);
  235. return (ch);
  236. }
  237. #else
  238. int fputc(int ch, FILE *f)
  239. {
  240. return (ch);
  241. }
  242. #endif