Uart1.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /*********************************************************************************************************
  2. * Module : Uart.c
  3. * Abstract : Uart modules,uart be used to read data from hlw8110. This file content IRQ of usart and
  4. * ch448f code!
  5. * Version : 1.0.0
  6. * Author : Leopul(COPYRIGHT 2025 - 2027 Leopul. All rights reserved.)
  7. * Complete : 2025-02-16
  8. * Content : None
  9. * Note : None
  10. *********************************************************************************************************/
  11. #include "Uart1.h"
  12. #include "gd32f30x_libopt.h"
  13. #include "SysTick.h"
  14. #include "FreeRTOS.h"
  15. #include "task.h"
  16. #define UART1_BUF_SIZE 10
  17. #define XEN GPIO_PIN_11
  18. #define YEN GPIO_PIN_12
  19. #define SEL0 GPIO_PIN_13
  20. #define SEL1 GPIO_PIN_14
  21. #define SEL2 GPIO_PIN_15
  22. #define SEL_0_H gpio_bit_set(GPIOE,GPIO_PIN_13)
  23. #define SEL_0_L gpio_bit_reset(GPIOE,GPIO_PIN_13)
  24. #define SEL_1_H gpio_bit_set(GPIOE,GPIO_PIN_14)
  25. #define SEL_1_L gpio_bit_reset(GPIOE,GPIO_PIN_14)
  26. #define SEL_2_H gpio_bit_set(GPIOE,GPIO_PIN_15)
  27. #define SEL_2_L gpio_bit_reset(GPIOE,GPIO_PIN_15)
  28. extern unsigned char u8_TxBuf[UART1_BUF_SIZE];
  29. extern unsigned char u8_RxBuf[UART1_BUF_SIZE];
  30. extern unsigned char u8_TX_Length;
  31. extern unsigned char u8_RX_Length;
  32. extern unsigned char u8_RX_Index;
  33. extern unsigned char B_Rx_Data_ING;
  34. extern unsigned char B_Rx_Finish;
  35. /*********************************************************************************************************
  36. * 函数名称:ConfigCH448FGPIO
  37. * 函数功能:配置CH448F的切换GPIO
  38. * 输入参数:void
  39. * 输出参数:void
  40. * 返 回 值:void
  41. * 创建日期:2021年07月01日
  42. * 注 意:真值表
  43. * XEN# YEN# SEL2 SEL1 SEL0 AX AY
  44. * 0 0 0 0 0 选择A0X 选择A0Y 实际是4
  45. * 0 0 0 0 1 选择A1X 选择A1Y 实际是3
  46. * 0 0 0 1 0 选择A2X 选择A2Y 实际是2
  47. * 0 0 0 1 1 选择A3X 选择A3Y 实际是1
  48. * 0 0 1 0 0 选择A4X 选择A4Y 实际是8
  49. * 0 0 1 0 1 选择A5X 选择A5Y 实际是7
  50. * 0 0 1 1 0 选择A6X 选择A6Y 实际是6
  51. * 0 0 1 1 1 选择A7X 选择A7Y 实际是5
  52. * 1 1 X X X 全部断开 全部断开
  53. *********************************************************************************************************/
  54. static void ConfigCH448FGPIO(void)
  55. {
  56. rcu_periph_clock_enable(RCU_GPIOE);
  57. gpio_init(GPIOE,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
  58. gpio_bit_reset(GPIOE,GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
  59. }
  60. static void ConfigUART1(unsigned int bound)
  61. {
  62. nvic_irq_enable(USART1_IRQn,0,2);
  63. rcu_periph_clock_enable(RCU_GPIOA);
  64. //配置TX的GPIO
  65. gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
  66. //配置RX的GPIO
  67. gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
  68. rcu_periph_clock_enable(RCU_USART1);
  69. usart_deinit(USART1);
  70. usart_baudrate_set(USART1, bound);
  71. usart_stop_bit_set(USART1,USART_STB_1BIT);
  72. usart_word_length_set(USART1,USART_WL_9BIT);
  73. usart_parity_config(USART1,USART_PM_EVEN);
  74. usart_receive_config(USART1, USART_RECEIVE_ENABLE);
  75. usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
  76. usart_interrupt_enable(USART1, USART_INT_RBNE);
  77. usart_enable(USART1);
  78. }
  79. void USART1_IRQHandler(void)
  80. {
  81. if(usart_flag_get(USART1, USART_FLAG_ORERR) == SET)
  82. {
  83. usart_flag_clear(USART1, USART_FLAG_ORERR);
  84. }
  85. if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_TBE)!= RESET)
  86. {
  87. usart_interrupt_flag_clear(USART1, USART_INT_FLAG_TBE);
  88. }
  89. if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET)
  90. {
  91. usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE);
  92. if (u8_RX_Index < u8_RX_Length )
  93. {
  94. u8_RxBuf[u8_RX_Index] = usart_data_receive(USART1);
  95. u8_RX_Index++;
  96. B_Rx_Data_ING = 1;
  97. if(u8_RX_Index == u8_RX_Length)
  98. {
  99. B_Rx_Finish = TRUE;
  100. u8_RX_Index = 0;
  101. }
  102. }
  103. }
  104. }
  105. void InitUART1(unsigned int bound)
  106. {
  107. ConfigUART1(bound);
  108. }
  109. void InitCH448F(void)
  110. {
  111. ConfigCH448FGPIO();
  112. }
  113. void Start_Send_UartData(unsigned char len)
  114. {
  115. unsigned int i;
  116. for(i=0;i<len;i++)
  117. {
  118. usart_data_transmit(USART1, (uint8_t)u8_TxBuf[i]);
  119. while(usart_flag_get(USART1, USART_FLAG_TC) == RESET);
  120. }
  121. }
  122. void select_channel(uint8_t chx)
  123. {
  124. switch(chx)
  125. {
  126. case 0:
  127. SEL_0_L;
  128. SEL_1_L;
  129. SEL_2_L;
  130. break;
  131. case 1:
  132. SEL_0_H;
  133. SEL_1_L;
  134. SEL_2_L;
  135. break;
  136. case 2:
  137. SEL_0_L;
  138. SEL_1_H;
  139. SEL_2_L;
  140. break;
  141. default:
  142. break;
  143. }
  144. DelayNus(3);
  145. }