Uart1.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. ///*********************************************************************************************************
  2. //* 模块名称:Uart1.c
  3. //* 摘 要:串口模块,包括串口模块初始化,以及中断服务函数处理,以及读写串口函数实现
  4. //* 当前版本:1.0.0
  5. //* 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.)
  6. //* 完成日期:2021年07月01日
  7. //* 内 容:
  8. //* 注 意:
  9. //**********************************************************************************************************
  10. //* 取代版本:
  11. //* 作 者:
  12. //* 完成日期:
  13. //* 修改内容:
  14. //* 修改文件:
  15. //*********************************************************************************************************/
  16. ///*********************************************************************************************************
  17. //* 包含头文件
  18. //*********************************************************************************************************/
  19. //#include "Uart1.h"
  20. //#include "gd32e230x_conf.h"
  21. //#include "Queue.h"
  22. ///*********************************************************************************************************
  23. //* 宏定义
  24. //*********************************************************************************************************/
  25. ///*********************************************************************************************************
  26. //* 枚举结构体
  27. //*********************************************************************************************************/
  28. ////串口发送状态
  29. //typedef enum
  30. //{
  31. // UART_STATE_OFF, //串口未发送数据
  32. // UART_STATE_ON, //串口正在发送数据
  33. // UART_STATE_MAX
  34. //}EnumUARTState;
  35. ///*********************************************************************************************************
  36. //* 内部变量定义
  37. //*********************************************************************************************************/
  38. //static StructCirQue s_structUARTSendCirQue; //发送串口循环队列
  39. //static StructCirQue s_structUARTRecCirQue; //接收串口循环队列
  40. //static unsigned char s_arrSendBuf[UART1_BUF_SIZE]; //发送串口循环队列的缓冲区
  41. //static unsigned char s_arrRecBuf[UART1_BUF_SIZE]; //接收串口循环队列的缓冲区
  42. //static unsigned char s_iUARTTxSts; //串口发送数据状态
  43. //
  44. ///*********************************************************************************************************
  45. //* 内部函数声明
  46. //*********************************************************************************************************/
  47. //static void InitUARTBuf(void); //初始化串口缓冲区,包括发送缓冲区和接收缓冲区
  48. //static unsigned char WriteReceiveBuf(unsigned char d); //将接收到的数据写入接收缓冲区
  49. //static unsigned char ReadSendBuf(unsigned char *p); //读取发送缓冲区中的数据
  50. //static void ConfigUART0(unsigned int bound); //配置串口相关的参数,包括GPIO、RCU、UART和NVIC
  51. //static void EnableUARTTx(void); //使能串口发送,WriteUARTx中调用,每次发送数据之后需要调用
  52. //
  53. ///*********************************************************************************************************
  54. //* 内部函数实现
  55. //*********************************************************************************************************/
  56. ///*********************************************************************************************************
  57. //* 函数名称:InitUARTBuf
  58. //* 函数功能:初始化串口缓冲区,包括发送缓冲区和接收缓冲区
  59. //* 输入参数:void
  60. //* 输出参数:void
  61. //* 返 回 值:void
  62. //* 创建日期:2021年07月01日
  63. //* 注 意:
  64. //*********************************************************************************************************/
  65. //static void InitUARTBuf(void)
  66. //{
  67. // short i;
  68. // for(i = 0; i < UART1_BUF_SIZE; i++)
  69. // {
  70. // s_arrSendBuf[i] = 0;
  71. // s_arrRecBuf[i] = 0;
  72. // }
  73. // InitQueue(&s_structUARTSendCirQue, s_arrSendBuf, UART1_BUF_SIZE);
  74. // InitQueue(&s_structUARTRecCirQue, s_arrRecBuf, UART1_BUF_SIZE);
  75. //}
  76. ///*********************************************************************************************************
  77. //* 函数名称:WriteReceiveBuf
  78. //* 函数功能:写数据到串口接收缓冲区
  79. //* 输入参数:d,待写入串口接收缓冲区的数据
  80. //* 输出参数:void
  81. //* 返 回 值:写入数据成功标志,0-不成功,1-成功
  82. //* 创建日期:2021年07月01日
  83. //* 注 意:
  84. //*********************************************************************************************************/
  85. //static unsigned char WriteReceiveBuf(unsigned char d)
  86. //{
  87. // unsigned char ok = 0; //写入数据成功标志,0-不成功,1-成功
  88. //
  89. // ok = EnQueue(&s_structUARTRecCirQue, &d, 1);
  90. //
  91. // return ok; //返回写入数据成功标志,0-不成功,1-成功
  92. //}
  93. ///*********************************************************************************************************
  94. //* 函数名称:ReadSendBuf
  95. //* 函数功能:读取串口发送缓冲区中的数据
  96. //* 输入参数:p,读出来的数据存放的首地址
  97. //* 输出参数:p,读出来的数据存放的首地址
  98. //* 返 回 值:读取数据成功标志,0-不成功,1-成功
  99. //* 创建日期:2021年07月01日
  100. //* 注 意:
  101. //*********************************************************************************************************/
  102. //static unsigned char ReadSendBuf(unsigned char *p)
  103. //{
  104. // unsigned char ok = 0; //读取数据成功标志,0-不成功,1-成功
  105. //
  106. // ok = DeQueue(&s_structUARTSendCirQue, p, 1);
  107. //
  108. // return ok; //返回读取数据成功标志,0-不成功,1-成功
  109. //}
  110. ///*********************************************************************************************************
  111. //* 函数名称:ConfigCH448FGPIO
  112. //* 函数功能:配置CH448F的切换GPIO
  113. //* 输入参数:void
  114. //* 输出参数:void
  115. //* 返 回 值:void
  116. //* 创建日期:2021年07月01日
  117. //* 注 意:真值表
  118. //* XEN# YEN# SEL2 SEL1 SEL0 AX AY
  119. //* 0 0 0 0 0 选择A0X 选择A0Y
  120. //* 0 0 0 0 1 选择A1X 选择A1Y
  121. //* 0 0 0 1 0 选择A2X 选择A2Y
  122. //* 0 0 0 1 1 选择A3X 选择A3Y
  123. //* 0 0 1 0 0 选择A4X 选择A4Y
  124. //* 0 0 1 0 1 选择A5X 选择A5Y
  125. //* 0 0 1 1 0 选择A6X 选择A6Y
  126. //* 0 0 1 1 1 选择A7X 选择A7Y
  127. //* 1 1 X X X 全部断开 全部断开
  128. //*********************************************************************************************************/
  129. //static void ConfigCH448FGPIO(void)
  130. //{
  131. // //使能RCU相关时钟
  132. // rcu_periph_clock_enable(RCU_GPIOA); //使能GPIOB的时钟
  133. // gpio_mode_set(XYEN_SEL0_1_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, XEN); //设置GPIO模式
  134. // gpio_output_options_set(XYEN_SEL0_1_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, XEN); //设置GPIO输出模式及速度
  135. // gpio_bit_set(XYEN_SEL0_1_RCU, XEN); //不使能,全部断开
  136. //
  137. // gpio_mode_set(XYEN_SEL0_1_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, YEN); //设置GPIO模式
  138. // gpio_output_options_set(XYEN_SEL0_1_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, YEN); //设置GPIO输出模式及速度
  139. // gpio_bit_set(XYEN_SEL0_1_RCU, YEN); //不使能,全部断开
  140. //
  141. // gpio_mode_set(XYEN_SEL0_1_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL0); //设置GPIO模式
  142. // gpio_output_options_set(XYEN_SEL0_1_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL0); //设置GPIO输出模式及速度
  143. // gpio_bit_reset(XYEN_SEL0_1_RCU, SEL0); //选择A0
  144. //
  145. // gpio_mode_set(XYEN_SEL0_1_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL1); //设置GPIO模式
  146. // gpio_output_options_set(XYEN_SEL0_1_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL1); //设置GPIO输出模式及速度
  147. // gpio_bit_reset(XYEN_SEL0_1_RCU, SEL1); //选择A0
  148. //
  149. // gpio_mode_set(SEL_2_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL2); //设置GPIO模式
  150. // gpio_output_options_set(SEL_2_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL2); //设置GPIO输出模式及速度
  151. // gpio_bit_reset(SEL_2_RCU, SEL2); //选择A0
  152. //
  153. //}
  154. ///*********************************************************************************************************
  155. //* 函数名称:ConfigUART
  156. //* 函数功能:配置串口相关的参数,包括GPIO、RCU、USART和NVIC
  157. //* 输入参数:bound,波特率
  158. //* 输出参数:void
  159. //* 返 回 值:void
  160. //* 创建日期:2021年07月01日
  161. //* 注 意:
  162. //*********************************************************************************************************/
  163. //static void ConfigUART1(unsigned int bound)
  164. //{
  165. // nvic_irq_enable(USART1_IRQn, 0); //使能串口中断,设置优先级
  166. // rcu_periph_clock_enable(RCU_GPIOA); //使能GPIOA时钟
  167. // //配置TX的GPIO
  168. // gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2); //复用PA9
  169. // gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
  170. // gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
  171. //
  172. // //配置RX的GPIO
  173. // gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3); //复用PA10
  174. // gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
  175. // gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
  176. // //配置USART的参数
  177. // rcu_periph_clock_enable(RCU_USART1); //使能串口时钟
  178. // usart_deinit(USART1); //RCU配置恢复默认值
  179. // usart_baudrate_set(USART1, bound); //设置波特率
  180. // usart_stop_bit_set(USART1,USART_STB_1BIT); //设置停止位
  181. // usart_word_length_set(USART1,USART_WL_8BIT); //设置数据字长度
  182. // usart_parity_config(USART1,USART_PM_NONE); //设置奇偶校验位
  183. // usart_receive_config(USART1, USART_RECEIVE_ENABLE); //使能接收
  184. // usart_transmit_config(USART1, USART_TRANSMIT_ENABLE); //使能发送
  185. // usart_enable(USART1); //使能串口
  186. // usart_interrupt_enable(USART1, USART_INT_RBNE); //使能接收缓冲区非空中断
  187. // usart_interrupt_enable(USART1, USART_INT_TBE); //使能发送缓冲区空中断
  188. //
  189. // s_iUARTTxSts = UART_STATE_OFF; //串口发送数据状态设置为未发送数据
  190. //}
  191. ///*********************************************************************************************************
  192. //* 函数名称:EnableUARTTx
  193. //* 函数功能:使能串口发送,在WriteUARTx中调用,即每次发送数据之后需要调用这个函数来使能发送中断
  194. //* 输入参数:void
  195. //* 输出参数:void
  196. //* 返 回 值:void
  197. //* 创建日期:2021年07月01日
  198. //* 注 意:s_iUARTTxSts = UART_STATE_ON;这句话必须放在USART_ITConfig之前,否则会导致中断打开无法执行
  199. //*********************************************************************************************************/
  200. //static void EnableUARTTx(void)
  201. //{
  202. // s_iUARTTxSts = UART_STATE_ON; //串口发送数据状态设置为正在发送数据
  203. // usart_interrupt_enable(USART1, USART_INT_TBE);
  204. //}
  205. ///*********************************************************************************************************
  206. //* 函数名称:USART1_IRQHandler
  207. //* 函数功能:USART1中断服务函数
  208. //* 输入参数:void
  209. //* 输出参数:void
  210. //* 返 回 值:void
  211. //* 创建日期:2021年07月01日
  212. //* 注 意:
  213. //*********************************************************************************************************/
  214. //void USART1_IRQHandler(void)
  215. //{
  216. // unsigned char uData = 0;
  217. // if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET) //接收缓冲区非空中断
  218. // {
  219. // usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE); //清除USART1中断挂起
  220. // uData = usart_data_receive(USART1); //将USART1接收到的数据保存到uData
  221. //
  222. // WriteReceiveBuf(uData); //将接收到的数据写入接收缓冲区
  223. // }
  224. //
  225. // if(usart_flag_get(USART1, USART_FLAG_ORERR) == SET) //溢出错误标志为1
  226. // {
  227. // usart_flag_clear(USART1, USART_FLAG_ORERR); //清除溢出错误标志
  228. //
  229. // usart_data_receive(USART1); //读取USART_DR
  230. // }
  231. //
  232. // if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_TBE)!= RESET) //发送缓冲区空中断
  233. // {
  234. //
  235. // usart_interrupt_flag_clear(USART1, USART_INT_FLAG_TBE); //清除发送中断标志
  236. // __NVIC_ClearPendingIRQ(USART1_IRQn);
  237. //
  238. // ReadSendBuf(&uData); //读取发送缓冲区的数据到uData
  239. //
  240. // usart_data_transmit(USART1, uData); //将uData写入USART_DR
  241. //
  242. // if(QueueEmpty(&s_structUARTSendCirQue)) //当发送缓冲区为空时
  243. // {
  244. // s_iUARTTxSts = UART_STATE_OFF; //串口发送数据状态设置为未发送数据
  245. // usart_interrupt_disable(USART1, USART_INT_TBE); //关闭串口发送缓冲区空中断
  246. // }
  247. // }
  248. //}
  249. ///*********************************************************************************************************
  250. //* API函数实现
  251. //*********************************************************************************************************/
  252. ///*********************************************************************************************************
  253. //* 函数名称:InitUART0
  254. //* 函数功能:初始化UART模块
  255. //* 输入参数:bound,波特率
  256. //* 输出参数:void
  257. //* 返 回 值:void
  258. //* 创建日期:2021年07月01日
  259. //* 注 意:
  260. //*********************************************************************************************************/
  261. //void InitUART1(unsigned int bound)
  262. //{
  263. // InitUARTBuf(); //初始化串口缓冲区,包括发送缓冲区和接收缓冲区
  264. //
  265. // ConfigUART1(bound); //配置串口相关的参数,包括GPIO、RCU、USART和NVIC
  266. //
  267. // ConfigCH448FGPIO(); //配置串口切换开关IO
  268. //}
  269. ///*********************************************************************************************************
  270. //* 函数名称:WriteUART1
  271. //* 函数功能:写串口,即写数据到的串口发送缓冲区
  272. //* 输入参数:pBuf,要写入数据的首地址,len,期望写入数据的个数
  273. //* 输出参数:void
  274. //* 返 回 值:成功写入数据的个数,不一定与形参len相等
  275. //* 创建日期:2021年07月01日
  276. //* 注 意:
  277. //*********************************************************************************************************/
  278. //unsigned char WriteUART1(unsigned char *pBuf, unsigned char len)
  279. //{
  280. // unsigned char wLen = 0; //实际写入数据的个数
  281. //
  282. // wLen = EnQueue(&s_structUARTSendCirQue, pBuf, len);
  283. // if(wLen < UART1_BUF_SIZE)
  284. // {
  285. // if(s_iUARTTxSts == UART_STATE_OFF)
  286. // {
  287. // EnableUARTTx();
  288. // }
  289. // }
  290. // return wLen; //返回实际写入数据的个数
  291. //}
  292. ///*********************************************************************************************************
  293. //* 函数名称:ReadUART1
  294. //* 函数功能:读串口,即读取串口接收缓冲区中的数据
  295. //* 输入参数:pBuf,读取的数据存放的首地址,len,期望读取数据的个数
  296. //* 输出参数:pBuf,读取的数据存放的首地址
  297. //* 返 回 值:成功读取数据的个数,不一定与形参len相等
  298. //* 创建日期:2021年07月01日
  299. //* 注 意:
  300. //*********************************************************************************************************/
  301. //unsigned char ReadUART1(unsigned char *pBuf, unsigned char len)
  302. //{
  303. // unsigned char rLen = 0; //实际读取数据长度
  304. //
  305. // rLen = DeQueue(&s_structUARTRecCirQue, pBuf, len);
  306. // return rLen; //返回实际读取数据的长度
  307. //}
  308. //
  309. ///*********************************************************************************************************
  310. //* 函数名称:fputc
  311. //* 函数功能:重定向函数
  312. //* 输入参数:ch,f
  313. //* 输出参数:void
  314. //* 返 回 值:int
  315. //* 创建日期:2021年07月01日
  316. //* 注 意:
  317. //*********************************************************************************************************/
  318. //int fputc(int ch, FILE *f)
  319. //{
  320. // usart_data_transmit(USART1, (uint8_t) ch); //发送字符函数,专由fputc函数调用
  321. //
  322. // while(RESET == usart_flag_get(USART1, USART_FLAG_TBE));
  323. //
  324. // return ch; //返回ch
  325. //}
  326. /*********************************************************************************************************
  327. * 模块名称:Uart1.c
  328. * 摘 要:串口模块,包括串口模块初始化,以及中断服务函数处理,以及读写串口函数实现
  329. * 当前版本:1.0.0
  330. * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.)
  331. * 完成日期:2021年07月01日
  332. * 内 容:
  333. * 注 意:
  334. **********************************************************************************************************
  335. * 取代版本:
  336. * 作 者:
  337. * 完成日期:
  338. * 修改内容:
  339. * 修改文件:
  340. *********************************************************************************************************/
  341. /*********************************************************************************************************
  342. * 包含头文件
  343. *********************************************************************************************************/
  344. #include "Uart1.h"
  345. #include "gd32e230x_conf.h"
  346. #include "Hlw8110.h"
  347. /*********************************************************************************************************
  348. * 宏定义
  349. *********************************************************************************************************/
  350. extern unsigned char u8_TxBuf[UART1_BUF_SIZE];
  351. extern unsigned char u8_RxBuf[UART1_BUF_SIZE];
  352. extern unsigned char u8_TX_Length;
  353. extern unsigned char u8_RX_Length;
  354. extern unsigned char u8_RX_Index;
  355. extern unsigned char B_Rx_Data_ING; // 接收数据标志位 , < 1:接收数据中,0:未接收到数据 >
  356. extern unsigned char B_Rx_Finish;
  357. /*********************************************************************************************************
  358. * 枚举结构体
  359. *********************************************************************************************************/
  360. /*********************************************************************************************************
  361. * 内部变量定义
  362. *********************************************************************************************************/
  363. /*********************************************************************************************************
  364. * 内部函数声明
  365. *********************************************************************************************************/
  366. static void ConfigUART0(unsigned int bound); //配置串口相关的参数,包括GPIO、RCU、UART和NVIC
  367. /*********************************************************************************************************
  368. * 内部函数实现
  369. *********************************************************************************************************/
  370. /*********************************************************************************************************
  371. * 函数名称:ConfigCH448FGPIO
  372. * 函数功能:配置CH448F的切换GPIO
  373. * 输入参数:void
  374. * 输出参数:void
  375. * 返 回 值:void
  376. * 创建日期:2021年07月01日
  377. * 注 意:真值表
  378. * XEN# YEN# SEL2 SEL1 SEL0 AX AY
  379. * 0 0 0 0 0 选择A0X 选择A0Y 实际是4
  380. * 0 0 0 0 1 选择A1X 选择A1Y 实际是3
  381. * 0 0 0 1 0 选择A2X 选择A2Y 实际是2
  382. * 0 0 0 1 1 选择A3X 选择A3Y 实际是1
  383. * 0 0 1 0 0 选择A4X 选择A4Y 实际是8
  384. * 0 0 1 0 1 选择A5X 选择A5Y 实际是7
  385. * 0 0 1 1 0 选择A6X 选择A6Y 实际是6
  386. * 0 0 1 1 1 选择A7X 选择A7Y 实际是5
  387. * 1 1 X X X 全部断开 全部断开
  388. *********************************************************************************************************/
  389. static void ConfigCH448FGPIO(void)
  390. {
  391. //使能RCU相关时钟
  392. rcu_periph_clock_enable(RCU_GPIOA); //使能GPIOA的时钟
  393. gpio_mode_set(XYEN_SEL0_1_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, XEN); //设置GPIO模式
  394. gpio_output_options_set(XYEN_SEL0_1_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, XEN); //设置GPIO输出模式及速度
  395. gpio_bit_reset(XYEN_SEL0_1_RCU, XEN); //不使能,全部断开
  396. gpio_mode_set(XYEN_SEL0_1_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, YEN); //设置GPIO模式
  397. gpio_output_options_set(XYEN_SEL0_1_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, YEN); //设置GPIO输出模式及速度
  398. gpio_bit_reset(XYEN_SEL0_1_RCU, YEN); //不使能,全部断开
  399. gpio_mode_set(XYEN_SEL0_1_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL0); //设置GPIO模式
  400. gpio_output_options_set(XYEN_SEL0_1_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL0); //设置GPIO输出模式及速度
  401. gpio_bit_reset(XYEN_SEL0_1_RCU, SEL0); //选择A0
  402. gpio_mode_set(XYEN_SEL0_1_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL1); //设置GPIO模式
  403. gpio_output_options_set(XYEN_SEL0_1_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL1); //设置GPIO输出模式及速度
  404. gpio_bit_reset(XYEN_SEL0_1_RCU, SEL1); //选择A0
  405. rcu_periph_clock_enable(RCU_GPIOA); //使能GPIOA的时钟
  406. gpio_mode_set(SEL_2_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL2); //设置GPIO模式
  407. gpio_output_options_set(SEL_2_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL2); //设置GPIO输出模式及速度
  408. gpio_bit_reset(SEL_2_RCU, SEL2); //选择A0
  409. }
  410. /*********************************************************************************************************
  411. * 函数名称:ConfigUART
  412. * 函数功能:配置串口相关的参数,包括GPIO、RCU、USART和NVIC
  413. * 输入参数:bound,波特率
  414. * 输出参数:void
  415. * 返 回 值:void
  416. * 创建日期:2021年07月01日
  417. * 注 意:
  418. *********************************************************************************************************/
  419. static void ConfigUART1(unsigned int bound)
  420. {
  421. nvic_irq_enable(USART1_IRQn, 2); //使能串口中断,设置优先级
  422. rcu_periph_clock_enable(RCU_GPIOA); //使能GPIOA时钟
  423. //配置TX的GPIO
  424. gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2); //复用PA2
  425. gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
  426. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
  427. //配置RX的GPIO
  428. gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3); //复用PA3
  429. gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
  430. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
  431. //配置USART的参数
  432. rcu_periph_clock_enable(RCU_USART1); //使能串口时钟
  433. usart_deinit(USART1); //RCU配置恢复默认值
  434. usart_baudrate_set(USART1, bound); //设置波特率
  435. usart_stop_bit_set(USART1,USART_STB_1BIT); //设置停止位
  436. usart_word_length_set(USART1,USART_WL_9BIT); //设置数据字长度
  437. usart_parity_config(USART1,USART_PM_EVEN); //设置奇偶校验位,偶校验
  438. usart_receive_config(USART1, USART_RECEIVE_ENABLE); //使能接收
  439. usart_transmit_config(USART1, USART_TRANSMIT_ENABLE); //使能发送
  440. usart_enable(USART1); //使能串口
  441. usart_interrupt_enable(USART1, USART_INT_RBNE); //使能接收缓冲区非空中断
  442. }
  443. /*********************************************************************************************************
  444. * 函数名称:USART1_IRQHandler
  445. * 函数功能:USART1中断服务函数
  446. * 输入参数:void
  447. * 输出参数:void
  448. * 返 回 值:void
  449. * 创建日期:2021年07月01日
  450. * 注 意:
  451. *********************************************************************************************************/
  452. void USART1_IRQHandler(void)
  453. {
  454. if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET) //接收缓冲区非空中断
  455. {
  456. usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE); //清除USART1中断挂起
  457. if (u8_RX_Index < u8_RX_Length )
  458. {
  459. u8_RxBuf[u8_RX_Index] = usart_data_receive(USART1); //将USART1接收到的数据保存到u8_RxBuf
  460. u8_RX_Index++;
  461. B_Rx_Data_ING = 1; // 置数据接收标志位
  462. }
  463. else
  464. {
  465. B_Rx_Finish = TRUE; // 数据接收完毕
  466. u8_RX_Index = 0;
  467. }
  468. }
  469. }
  470. /*********************************************************************************************************
  471. * API函数实现
  472. *********************************************************************************************************/
  473. /*********************************************************************************************************
  474. * 函数名称:InitUART0
  475. * 函数功能:初始化UART模块
  476. * 输入参数:bound,波特率
  477. * 输出参数:void
  478. * 返 回 值:void
  479. * 创建日期:2021年07月01日
  480. * 注 意:
  481. *********************************************************************************************************/
  482. void InitUART1(unsigned int bound)
  483. {
  484. ConfigUART1(bound); //配置串口相关的参数,包括GPIO、RCU、USART和NVIC
  485. }
  486. /*********************************************************************************************************
  487. * 函数名称:InitCH448F
  488. * 函数功能:初始化LED模块
  489. * 输入参数:void
  490. * 输出参数:void
  491. * 返 回 值:void
  492. * 创建日期:2021年07月01日
  493. * 注 意:
  494. *********************************************************************************************************/
  495. void InitCH448F(void)
  496. {
  497. ConfigCH448FGPIO(); //配置串口切换开关IO
  498. }
  499. /*********************************************************************************************************
  500. * 函数名称:Start_Send_UartData
  501. * 函数功能:发送数据函数
  502. * 输入参数:发送数据长度
  503. * 输出参数:void
  504. * 返 回 值:void
  505. * 创建日期:2021年07月01日
  506. * 注 意:
  507. *********************************************************************************************************/
  508. void Start_Send_UartData(unsigned char len)
  509. {
  510. unsigned int i;
  511. for(i=0;i<len;i++)
  512. {
  513. usart_data_transmit(USART1, (uint8_t)u8_TxBuf[i]); //发送字符函数
  514. while(usart_flag_get(USART1, USART_FLAG_TC) == RESET);//等待发送结束
  515. // while(usart_flag_get(USART1, USART_FLAG_TBE) == RESET);
  516. }
  517. }
  518. /*********************************************************************************************************
  519. * 函数名称:fputc
  520. * 函数功能:重定向函数
  521. * 输入参数:ch,f
  522. * 输出参数:void
  523. * 返 回 值:int
  524. * 创建日期:2021年07月01日
  525. * 注 意:
  526. *********************************************************************************************************/
  527. int fputc(int ch, FILE *f)
  528. {
  529. usart_data_transmit(USART1, (uint8_t) ch); //发送字符函数,专由fputc函数调用
  530. while(RESET == usart_flag_get(USART1, USART_FLAG_TBE));
  531. return ch; //返回ch
  532. }