Uart1.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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 "IM1253E.h"
  21. /*********************************************************************************************************
  22. * 宏定义
  23. *********************************************************************************************************/
  24. /*********************************************************************************************************
  25. * 枚举结构体
  26. *********************************************************************************************************/
  27. /*********************************************************************************************************
  28. * 内部变量定义
  29. *********************************************************************************************************/
  30. bool Rx_Finish_flag;
  31. uint8_t Rx_Data_buff_IM1253E[UART1_BUF_SIZE] = {0};
  32. uint8_t TX_Length;
  33. uint8_t RX_Length;
  34. uint8_t RX_Index;
  35. uint8_t Rx_Data_len;
  36. extern bool read_IM1253E_ok_flag;
  37. extern bool write_IM1253E_ok_flag;
  38. extern uint8_t W_R_reg_N;
  39. /*********************************************************************************************************
  40. * 内部函数声明
  41. *********************************************************************************************************/
  42. /*********************************************************************************************************
  43. * 内部函数实现
  44. *********************************************************************************************************/
  45. /*********************************************************************************************************
  46. * 函数名称:USART1_IRQHandler
  47. * 函数功能:USART1中断服务函数
  48. * 输入参数:void
  49. * 输出参数:void
  50. * 返 回 值:void
  51. * 创建日期:2021年07月01日
  52. * 注 意:
  53. *********************************************************************************************************/
  54. void USART1_IRQHandler(void)
  55. {
  56. if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET) //接收缓冲区非空中断
  57. {
  58. usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE); //清除USART1中断挂起
  59. Rx_Data_buff_IM1253E[RX_Index] = usart_data_receive(USART1);
  60. RX_Index++;
  61. if(RX_Index >= RX_Length)//接收完成
  62. {
  63. RX_Index = 0;
  64. Rx_Finish_flag = true;
  65. }
  66. /*
  67. if(RX_Index > 1)
  68. {
  69. RX_Index++;
  70. if(Rx_Data_buff_IM1253E[1] == cmd_read_IM1253E)//读命令后返回
  71. {
  72. if(Rx_Data_buff_IM1253E[1] == Rx_Data_len)
  73. {
  74. if(RX_Index >= RX_Length)//接收完成
  75. {
  76. RX_Index = 0;
  77. Rx_Finish_flag = true;
  78. }
  79. }
  80. else//读数据数量和返回数量不对应
  81. {
  82. RX_Index = 0;
  83. }
  84. }
  85. else//写命令后返回
  86. {
  87. if(Rx_Data_buff_IM1253E[1] == Rx_Data_len)
  88. {
  89. if(RX_Index > RX_Length)//接收完成
  90. {
  91. RX_Index = 0;
  92. Rx_Finish_flag = true;
  93. }
  94. }
  95. else//写数据数量和返回数量不对应
  96. {
  97. RX_Index = 0;
  98. }
  99. }
  100. }
  101. else if(RX_Index > 0)
  102. {
  103. if((Rx_Data_buff_IM1253E[RX_Index] == cmd_read_IM1253E) || (Rx_Data_buff_IM1253E[RX_Index] == cmd_write_IM1253E))
  104. {
  105. RX_Index++;
  106. }
  107. else
  108. {
  109. RX_Index = 0;
  110. Rx_Finish_flag = false;
  111. }
  112. }
  113. else
  114. {
  115. if(Rx_Data_buff_IM1253E[RX_Index] == Device_addr_IM1253E)
  116. {
  117. RX_Index++;
  118. }
  119. else
  120. {
  121. RX_Index = 0;
  122. Rx_Finish_flag = false;
  123. }
  124. }
  125. */
  126. }
  127. }
  128. /*********************************************************************************************************
  129. * API函数实现
  130. *********************************************************************************************************/
  131. /*********************************************************************************************************
  132. * 函数名称:InitUART0
  133. * 函数功能:初始化UART模块
  134. * 输入参数:bound,波特率
  135. * 输出参数:void
  136. * 返 回 值:void
  137. * 创建日期:2021年07月01日
  138. * 注 意:
  139. *********************************************************************************************************/
  140. void InitUART1(uint32_t bound)
  141. {
  142. nvic_irq_enable(USART1_IRQn, 2); //使能串口中断,设置优先级
  143. rcu_periph_clock_enable(RCU_GPIOA); //使能GPIOA时钟
  144. //配置TX的GPIO
  145. gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2); //复用PA2
  146. gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
  147. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
  148. //配置RX的GPIO
  149. gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3); //复用PA3
  150. gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
  151. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
  152. //配置USART的参数
  153. rcu_periph_clock_enable(RCU_USART1); //使能串口时钟
  154. usart_deinit(USART1); //RCU配置恢复默认值
  155. usart_baudrate_set(USART1, bound); //设置波特率
  156. usart_stop_bit_set(USART1,USART_STB_1BIT); //设置停止位
  157. usart_word_length_set(USART1,USART_WL_8BIT); //设置数据字长度
  158. usart_parity_config(USART1,USART_PM_NONE); //设置奇偶校验位,偶校验
  159. usart_receive_config(USART1, USART_RECEIVE_ENABLE); //使能接收
  160. usart_transmit_config(USART1, USART_TRANSMIT_ENABLE); //使能发送
  161. usart_enable(USART1); //使能串口
  162. usart_interrupt_enable(USART1, USART_INT_RBNE); //使能接收缓冲区非空中断
  163. }
  164. /*********************************************************************************************************
  165. * 函数名称:Start_Send_UartData
  166. * 函数功能:发送数据函数
  167. * 输入参数:发送数据长度
  168. * 输出参数:void
  169. * 返 回 值:void
  170. * 创建日期:2021年07月01日
  171. * 注 意:
  172. *********************************************************************************************************/
  173. void Start_Send_UartData(uint8_t *pt,uint8_t len)
  174. {
  175. uint8_t i;
  176. for(i = 0;i < len;i++)
  177. {
  178. usart_data_transmit(USART1, *(pt+i)); //发送字符函数
  179. while(usart_flag_get(USART1, USART_FLAG_TC) == RESET);//等待发送结束
  180. }
  181. }
  182. /*********************************************************************************************************
  183. * 函数名称:fputc
  184. * 函数功能:重定向函数
  185. * 输入参数:ch,f
  186. * 输出参数:void
  187. * 返 回 值:int
  188. * 创建日期:2021年07月01日
  189. * 注 意:
  190. *********************************************************************************************************/
  191. int fputc(int ch, FILE *f)
  192. {
  193. usart_data_transmit(USART1, (uint8_t) ch); //发送字符函数,专由fputc函数调用
  194. while(RESET == usart_flag_get(USART1, USART_FLAG_TBE));
  195. return ch; //返回ch
  196. }