Uart1.c 8.4 KB

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