Uart1.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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 "gd32e230x_conf.h"
  13. #include "SysTick.h"
  14. #define UART1_BUF_SIZE 10
  15. #define XEN GPIO_PIN_4
  16. #define YEN GPIO_PIN_5
  17. #define SEL0 GPIO_PIN_6
  18. #define SEL1 GPIO_PIN_7
  19. #define SEL2 GPIO_PIN_12
  20. #define SEL1_H gpio_bit_set(GPIOA, SEL1)
  21. #define SEL1_L gpio_bit_reset(GPIOA, SEL1)
  22. #define SEL2_H gpio_bit_set(GPIOB, SEL2)
  23. #define SEL2_L gpio_bit_reset(GPIOB, SEL2)
  24. #define SEL0_H gpio_bit_set(GPIOA, SEL0)
  25. #define SEL0_L gpio_bit_reset(GPIOA, SEL0)
  26. extern unsigned char u8_TxBuf[UART1_BUF_SIZE];
  27. extern unsigned char u8_RxBuf[UART1_BUF_SIZE];
  28. extern unsigned char u8_TX_Length;
  29. extern unsigned char u8_RX_Length;
  30. extern unsigned char u8_RX_Index;
  31. extern unsigned char B_Rx_Data_ING;
  32. extern unsigned char B_Rx_Finish;
  33. /*********************************************************************************************************
  34. * 函数名称:ConfigCH448FGPIO
  35. * 函数功能:配置CH448F的切换GPIO
  36. * 输入参数:void
  37. * 输出参数:void
  38. * 返 回 值:void
  39. * 创建日期:2021年07月01日
  40. * 注 意:真值表
  41. * XEN# YEN# SEL2 SEL1 SEL0 AX AY
  42. * 0 0 0 0 0 选择A0X 选择A0Y 实际是4
  43. * 0 0 0 0 1 选择A1X 选择A1Y 实际是3
  44. * 0 0 0 1 0 选择A2X 选择A2Y 实际是2
  45. * 0 0 0 1 1 选择A3X 选择A3Y 实际是1
  46. * 0 0 1 0 0 选择A4X 选择A4Y 实际是8
  47. * 0 0 1 0 1 选择A5X 选择A5Y 实际是7
  48. * 0 0 1 1 0 选择A6X 选择A6Y 实际是6
  49. * 0 0 1 1 1 选择A7X 选择A7Y 实际是5
  50. * 1 1 X X X 全部断开 全部断开
  51. *********************************************************************************************************/
  52. static void ConfigCH448FGPIO(void)
  53. {
  54. rcu_periph_clock_enable(RCU_GPIOA);
  55. rcu_periph_clock_enable(RCU_GPIOB);
  56. gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, XEN);
  57. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, XEN);
  58. gpio_bit_reset(GPIOA, XEN);
  59. gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, YEN);
  60. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, YEN);
  61. gpio_bit_reset(GPIOA, YEN);
  62. gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL0);
  63. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL0);
  64. gpio_bit_reset(GPIOA, SEL0);
  65. gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL1);
  66. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL1);
  67. gpio_bit_reset(GPIOA, SEL1);
  68. gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL2);
  69. gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL2);
  70. gpio_bit_reset(GPIOB, SEL2);
  71. }
  72. static void ConfigUART1(unsigned int bound)
  73. {
  74. nvic_irq_enable(USART1_IRQn, 2);
  75. rcu_periph_clock_enable(RCU_GPIOA);
  76. gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2);
  77. gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
  78. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
  79. gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3);
  80. gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
  81. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
  82. rcu_periph_clock_enable(RCU_USART1);
  83. usart_deinit(USART1);
  84. usart_baudrate_set(USART1, bound);
  85. usart_stop_bit_set(USART1,USART_STB_1BIT);
  86. usart_word_length_set(USART1,USART_WL_9BIT);
  87. usart_parity_config(USART1,USART_PM_EVEN);
  88. usart_receive_config(USART1, USART_RECEIVE_ENABLE);
  89. usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
  90. usart_enable(USART1);
  91. usart_interrupt_enable(USART1, USART_INT_RBNE);
  92. }
  93. void USART1_IRQHandler(void)
  94. {
  95. if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET)
  96. {
  97. usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE);
  98. if (u8_RX_Index < u8_RX_Length )
  99. {
  100. u8_RxBuf[u8_RX_Index] = usart_data_receive(USART1);
  101. u8_RX_Index++;
  102. B_Rx_Data_ING = 1;
  103. }
  104. else
  105. {
  106. B_Rx_Finish = TRUE;
  107. u8_RX_Index = 0;
  108. }
  109. }
  110. }
  111. void InitUART1(unsigned int bound)
  112. {
  113. ConfigUART1(bound);
  114. }
  115. void InitCH448F(void)
  116. {
  117. ConfigCH448FGPIO();
  118. }
  119. void Start_Send_UartData(unsigned char len)
  120. {
  121. unsigned int i;
  122. for(i=0;i<len;i++)
  123. {
  124. usart_data_transmit(USART1, (uint8_t)u8_TxBuf[i]);
  125. while(usart_flag_get(USART1, USART_FLAG_TC) == RESET);
  126. }
  127. }
  128. void select_channel(uint8_t chx)
  129. {
  130. switch(chx)
  131. {
  132. case 0:
  133. SEL0_L;
  134. SEL1_L;
  135. SEL2_L;
  136. break;
  137. case 1:
  138. SEL0_H;
  139. SEL1_L;
  140. SEL2_L;
  141. break;
  142. case 2:
  143. SEL0_L;
  144. SEL1_H;
  145. SEL2_L;
  146. break;
  147. default:
  148. break;
  149. }
  150. DelayNus(3);
  151. }