usart.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include "gd32f30x_usart.h"
  2. #include "gd32f30x_rcu.h"
  3. #include "gd32f30x_gpio.h"
  4. #include "gd32f30x_misc.h"
  5. #include "gd32f30x_it.h"
  6. #include "usart.h"
  7. // PA9
  8. // PA10
  9. #if 1
  10. #pragma import(__use_no_semihosting)
  11. //标准库需要的支持函数
  12. struct __FILE
  13. {
  14. int handle;
  15. };
  16. FILE __stdout;
  17. //定义_sys_exit()以避免使用半主机模式
  18. _sys_exit(int x)
  19. {
  20. x = x;
  21. }
  22. #endif
  23. //重定义fputc函数
  24. int fputc(int ch, FILE *f)
  25. {
  26. usart_data_transmit(USART0, (uint8_t) ch);
  27. while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
  28. return ch;
  29. }
  30. #if EN_USART1_RX //如果使能了接收
  31. //串口1中断服务程序
  32. //注意,读取USARTx->SR能避免莫名其妙的错误
  33. u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
  34. //接收状态
  35. //bit15, 接收完成标志
  36. //bit14, 接收到0x0d
  37. //bit13~0, 接收到的有效字节数目
  38. u16 USART_RX_STA=0; //接收状态标记
  39. void uart_init(u32 bound)
  40. {
  41. rcu_periph_clock_enable(RCU_GPIOA);
  42. rcu_periph_clock_enable(RCU_USART0);
  43. //gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
  44. gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_9);
  45. gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_10);
  46. usart_deinit(USART0);
  47. usart_baudrate_set(USART0, bound);
  48. usart_stop_bit_set(USART0,USART_STB_1BIT);
  49. usart_word_length_set(USART0,USART_WL_8BIT);
  50. usart_parity_config(USART0,USART_PM_NONE);
  51. usart_receive_config(USART0, USART_RECEIVE_ENABLE);
  52. usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
  53. usart_interrupt_enable(USART0, USART_INT_TBE);
  54. usart_interrupt_enable(USART0, USART_INT_RBNE);
  55. usart_enable(USART0);
  56. nvic_irq_enable(USART0_IRQn, 0, 0);
  57. }
  58. void USART0_IRQHandler(void) //串口1中断服务程序
  59. {
  60. u8 Res;
  61. if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  62. {
  63. usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);
  64. __NVIC_ClearPendingIRQ(USART0_IRQn);
  65. Res =usart_data_receive(USART0);//(USART0->DR); //读取接收到的数据
  66. if((USART_RX_STA&0x8000)==0)//接收未完成
  67. {
  68. if(USART_RX_STA&0x4000)//接收到了0x0d
  69. {
  70. if(Res!=0x0a)
  71. USART_RX_STA=0;//接收错误,重新开始
  72. else
  73. USART_RX_STA|=0x8000; //接收完成了
  74. }
  75. }else
  76. { //还没收到0X0D
  77. if(Res==0x0d)
  78. USART_RX_STA|=0x4000;
  79. else
  80. {
  81. USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
  82. USART_RX_STA++;
  83. if(USART_RX_STA>(USART_REC_LEN-1))
  84. USART_RX_STA=0;//接收数据错误,重新开始接收
  85. }
  86. }
  87. }
  88. }
  89. #endif