Uart1.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  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. #include "board_cfg.h"
  348. /*********************************************************************************************************
  349. * 宏定义
  350. *********************************************************************************************************/
  351. extern unsigned char u8_TxBuf[UART1_BUF_SIZE];
  352. extern unsigned char u8_RxBuf[UART1_BUF_SIZE];
  353. extern unsigned char u8_TX_Length;
  354. extern unsigned char u8_RX_Length;
  355. extern unsigned char u8_RX_Index;
  356. extern unsigned char B_Rx_Data_ING; // 接收数据标志位 , < 1:接收数据中,0:未接收到数据 >
  357. extern unsigned char B_Rx_Finish;
  358. /*********************************************************************************************************
  359. * 枚举结构体
  360. *********************************************************************************************************/
  361. /*********************************************************************************************************
  362. * 内部变量定义
  363. *********************************************************************************************************/
  364. /*********************************************************************************************************
  365. * 内部函数声明
  366. *********************************************************************************************************/
  367. static void ConfigUART0(unsigned int bound); //配置串口相关的参数,包括GPIO、RCU、UART和NVIC
  368. /*********************************************************************************************************
  369. * 内部函数实现
  370. *********************************************************************************************************/
  371. /*********************************************************************************************************
  372. * 函数名称:ConfigCH448FGPIO
  373. * 函数功能:配置CH448F的切换GPIO
  374. * 输入参数:void
  375. * 输出参数:void
  376. * 返 回 值:void
  377. * 创建日期:2021年07月01日
  378. * 注 意:真值表
  379. * XEN# YEN# SEL2 SEL1 SEL0 AX AY
  380. * 0 0 0 0 0 选择A0X 选择A0Y 实际是4
  381. * 0 0 0 0 1 选择A1X 选择A1Y 实际是3
  382. * 0 0 0 1 0 选择A2X 选择A2Y 实际是2
  383. * 0 0 0 1 1 选择A3X 选择A3Y 实际是1
  384. * 0 0 1 0 0 选择A4X 选择A4Y 实际是8
  385. * 0 0 1 0 1 选择A5X 选择A5Y 实际是7
  386. * 0 0 1 1 0 选择A6X 选择A6Y 实际是6
  387. * 0 0 1 1 1 选择A7X 选择A7Y 实际是5
  388. * 1 1 X X X 全部断开 全部断开
  389. *********************************************************************************************************/
  390. static void ConfigCH448FGPIO(void)
  391. {
  392. //使能RCU相关时钟
  393. rcu_periph_clock_enable(RCU_GPIOA); //使能GPIOA的时钟
  394. gpio_mode_set(XYEN_SEL0_1_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, XEN); //设置GPIO模式
  395. gpio_output_options_set(XYEN_SEL0_1_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, XEN); //设置GPIO输出模式及速度
  396. gpio_bit_reset(XYEN_SEL0_1_RCU, XEN); //不使能,全部断开
  397. gpio_mode_set(XYEN_SEL0_1_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, YEN); //设置GPIO模式
  398. gpio_output_options_set(XYEN_SEL0_1_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, YEN); //设置GPIO输出模式及速度
  399. gpio_bit_reset(XYEN_SEL0_1_RCU, YEN); //不使能,全部断开
  400. gpio_mode_set(XYEN_SEL0_1_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL0); //设置GPIO模式
  401. gpio_output_options_set(XYEN_SEL0_1_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL0); //设置GPIO输出模式及速度
  402. gpio_bit_reset(XYEN_SEL0_1_RCU, SEL0); //选择A0
  403. gpio_mode_set(XYEN_SEL0_1_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL1); //设置GPIO模式
  404. gpio_output_options_set(XYEN_SEL0_1_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL1); //设置GPIO输出模式及速度
  405. gpio_bit_reset(XYEN_SEL0_1_RCU, SEL1); //选择A0
  406. rcu_periph_clock_enable(RCU_GPIOA); //使能GPIOA的时钟
  407. gpio_mode_set(SEL_2_RCU, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL2); //设置GPIO模式
  408. gpio_output_options_set(SEL_2_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL2); //设置GPIO输出模式及速度
  409. gpio_bit_reset(SEL_2_RCU, SEL2); //选择A0
  410. }
  411. /*********************************************************************************************************
  412. * 函数名称:ConfigUART
  413. * 函数功能:配置串口相关的参数,包括GPIO、RCU、USART和NVIC
  414. * 输入参数:bound,波特率
  415. * 输出参数:void
  416. * 返 回 值:void
  417. * 创建日期:2021年07月01日
  418. * 注 意:
  419. *********************************************************************************************************/
  420. static void ConfigUART1(unsigned int bound)
  421. {
  422. nvic_irq_enable(USART1_IRQn, 2); //使能串口中断,设置优先级
  423. rcu_periph_clock_enable(RCU_GPIOA); //使能GPIOA时钟
  424. //配置TX的GPIO
  425. gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2); //复用PA2
  426. gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
  427. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
  428. //配置RX的GPIO
  429. gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3); //复用PA3
  430. gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
  431. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
  432. //配置USART的参数
  433. rcu_periph_clock_enable(RCU_USART1); //使能串口时钟
  434. usart_deinit(USART1); //RCU配置恢复默认值
  435. usart_baudrate_set(USART1, bound); //设置波特率
  436. usart_stop_bit_set(USART1,USART_STB_1BIT); //设置停止位
  437. usart_word_length_set(USART1,USART_WL_9BIT); //设置数据字长度
  438. usart_parity_config(USART1,USART_PM_EVEN); //设置奇偶校验位,偶校验
  439. usart_receive_config(USART1, USART_RECEIVE_ENABLE); //使能接收
  440. usart_transmit_config(USART1, USART_TRANSMIT_ENABLE); //使能发送
  441. usart_enable(USART1); //使能串口
  442. usart_interrupt_enable(USART1, USART_INT_RBNE); //使能接收缓冲区非空中断
  443. }
  444. /*********************************************************************************************************
  445. * 函数名称:USART1_IRQHandler
  446. * 函数功能:USART1中断服务函数
  447. * 输入参数:void
  448. * 输出参数:void
  449. * 返 回 值:void
  450. * 创建日期:2021年07月01日
  451. * 注 意:
  452. *********************************************************************************************************/
  453. void USART1_IRQHandler(void)
  454. {
  455. if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET) //接收缓冲区非空中断
  456. {
  457. usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE); //清除USART1中断挂起
  458. if (u8_RX_Index < u8_RX_Length )
  459. {
  460. u8_RxBuf[u8_RX_Index] = usart_data_receive(USART1); //将USART1接收到的数据保存到u8_RxBuf
  461. u8_RX_Index++;
  462. B_Rx_Data_ING = 1; // 置数据接收标志位
  463. }
  464. else
  465. {
  466. B_Rx_Finish = TRUE; // 数据接收完毕
  467. u8_RX_Index = 0;
  468. }
  469. }
  470. }
  471. /*********************************************************************************************************
  472. * API函数实现
  473. *********************************************************************************************************/
  474. /*********************************************************************************************************
  475. * 函数名称:InitUART0
  476. * 函数功能:初始化UART模块
  477. * 输入参数:bound,波特率
  478. * 输出参数:void
  479. * 返 回 值:void
  480. * 创建日期:2021年07月01日
  481. * 注 意:
  482. *********************************************************************************************************/
  483. void InitUART1(unsigned int bound)
  484. {
  485. ConfigUART1(bound); //配置串口相关的参数,包括GPIO、RCU、USART和NVIC
  486. }
  487. /*********************************************************************************************************
  488. * 函数名称:InitCH448F
  489. * 函数功能:初始化LED模块
  490. * 输入参数:void
  491. * 输出参数:void
  492. * 返 回 值:void
  493. * 创建日期:2021年07月01日
  494. * 注 意:
  495. *********************************************************************************************************/
  496. void InitCH448F(void)
  497. {
  498. ConfigCH448FGPIO(); //配置串口切换开关IO
  499. }
  500. /*********************************************************************************************************
  501. * 函数名称:Start_Send_UartData
  502. * 函数功能:发送数据函数
  503. * 输入参数:发送数据长度
  504. * 输出参数:void
  505. * 返 回 值:void
  506. * 创建日期:2021年07月01日
  507. * 注 意:
  508. *********************************************************************************************************/
  509. void Start_Send_UartData(unsigned char len)
  510. {
  511. unsigned int i;
  512. for(i=0;i<len;i++)
  513. {
  514. usart_data_transmit(USART1, (uint8_t)u8_TxBuf[i]); //发送字符函数
  515. while(usart_flag_get(USART1, USART_FLAG_TC) == RESET);//等待发送结束
  516. // while(usart_flag_get(USART1, USART_FLAG_TBE) == RESET);
  517. }
  518. }
  519. /*********************************************************************************************************
  520. * 函数名称:fputc
  521. * 函数功能:重定向函数
  522. * 输入参数:ch,f
  523. * 输出参数:void
  524. * 返 回 值:int
  525. * 创建日期:2021年07月01日
  526. * 注 意:
  527. *********************************************************************************************************/
  528. int fputc(int ch, FILE *f)
  529. {
  530. usart_data_transmit(USART1, (uint8_t) ch); //发送字符函数,专由fputc函数调用
  531. while(RESET == usart_flag_get(USART1, USART_FLAG_TBE));
  532. return ch; //返回ch
  533. }
  534. void select_channel(uint8_t chx)
  535. {
  536. switch(chx)
  537. {
  538. #if(RelaySlaveChaNum == 6)
  539. case 0x05: //001
  540. SEL0_H;
  541. SEL1_L;
  542. SEL2_L;
  543. break;
  544. case 0x04: //000
  545. SEL0_L;
  546. SEL1_L;
  547. SEL2_L;
  548. break;
  549. case 0x03: //111
  550. SEL0_H;
  551. SEL1_H;
  552. SEL2_H;
  553. break;
  554. case 0x02: //110
  555. SEL0_L;
  556. SEL1_H;
  557. SEL2_H;
  558. break;
  559. case 0x01: //101
  560. SEL0_H;
  561. SEL1_L;
  562. SEL2_H;
  563. break;
  564. case 0x00: //100
  565. SEL0_L;
  566. SEL1_L;
  567. SEL2_H;
  568. break;
  569. default:
  570. break;
  571. #elif (RelaySlaveChaNum <= 4 && (!SUPPORT_TWIN_FIRE))
  572. #if (RelaySlaveChaNum >= 1)
  573. case 0x00: //100
  574. SEL0_L;
  575. SEL1_L;
  576. SEL2_H;
  577. break;
  578. #endif
  579. #if (RelaySlaveChaNum >= 2)
  580. case 0x01: //101
  581. SEL0_H;
  582. SEL1_L;
  583. SEL2_H;
  584. break;
  585. #endif
  586. #if (RelaySlaveChaNum >= 3)
  587. case 0x02: //110
  588. SEL0_L;
  589. SEL1_H;
  590. SEL2_H;
  591. break;
  592. #endif
  593. #if (RelaySlaveChaNum >= 4)
  594. case 0x03: //111
  595. SEL0_H;
  596. SEL1_H;
  597. SEL2_H;
  598. break;
  599. #endif
  600. #else
  601. case 0x07: //011
  602. SEL0_H;
  603. SEL1_H;
  604. SEL2_L;
  605. break;
  606. case 0x06: //010
  607. SEL0_L;
  608. SEL1_H;
  609. SEL2_L;
  610. break;
  611. case 0x05: //001
  612. SEL0_H;
  613. SEL1_L;
  614. SEL2_L;
  615. break;
  616. case 0x04: //000
  617. SEL0_L;
  618. SEL1_L;
  619. SEL2_L;
  620. break;
  621. case 0x03: //111
  622. SEL0_H;
  623. SEL1_H;
  624. SEL2_H;
  625. break;
  626. case 0x02: //110
  627. SEL0_L;
  628. SEL1_H;
  629. SEL2_H;
  630. break;
  631. case 0x01: //101
  632. SEL0_H;
  633. SEL1_L;
  634. SEL2_H;
  635. break;
  636. case 0x00: //100
  637. SEL0_L;
  638. SEL1_L;
  639. SEL2_H;
  640. break;
  641. default:
  642. break;
  643. #endif
  644. }
  645. }