Uart1.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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. #define UART1_BUF_SIZE 10
  15. #define XEN GPIO_PIN_0
  16. #define YEN GPIO_PIN_1
  17. #define SEL0 GPIO_PIN_2
  18. #define SEL1 GPIO_PIN_10
  19. #define SEL2 GPIO_PIN_11
  20. #define SEL_0_H gpio_bit_set(GPIOB,GPIO_PIN_2)
  21. #define SEL_0_L gpio_bit_reset(GPIOB,GPIO_PIN_2)
  22. #define SEL_1_H gpio_bit_set(GPIOB,GPIO_PIN_10)
  23. #define SEL_1_L gpio_bit_reset(GPIOB,GPIO_PIN_10)
  24. #define SEL_2_H gpio_bit_set(GPIOB,GPIO_PIN_11)
  25. #define SEL_2_L gpio_bit_reset(GPIOB,GPIO_PIN_11)
  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_GPIOB);
  55. gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10|GPIO_PIN_11);
  56. gpio_bit_reset(GPIOB,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10|GPIO_PIN_11);
  57. }
  58. static void ConfigUART1(unsigned int bound)
  59. {
  60. nvic_irq_enable(USART1_IRQn,0,2);
  61. rcu_periph_clock_enable(RCU_GPIOA);
  62. //配置TX的GPIO
  63. gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
  64. //配置RX的GPIO
  65. gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
  66. rcu_periph_clock_enable(RCU_USART1);
  67. usart_deinit(USART1);
  68. usart_baudrate_set(USART1, bound);
  69. usart_stop_bit_set(USART1,USART_STB_1BIT);
  70. usart_word_length_set(USART1,USART_WL_9BIT);
  71. usart_parity_config(USART1,USART_PM_EVEN);
  72. usart_receive_config(USART1, USART_RECEIVE_ENABLE);
  73. usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
  74. usart_enable(USART1);
  75. usart_interrupt_enable(USART1, USART_INT_RBNE);
  76. }
  77. void USART1_IRQHandler(void)
  78. {
  79. if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET)
  80. {
  81. usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE);
  82. if (u8_RX_Index < u8_RX_Length )
  83. {
  84. u8_RxBuf[u8_RX_Index] = usart_data_receive(USART1);
  85. u8_RX_Index++;
  86. B_Rx_Data_ING = 1;
  87. }
  88. else
  89. {
  90. B_Rx_Finish = TRUE;
  91. u8_RX_Index = 0;
  92. }
  93. }
  94. }
  95. void InitUART1(unsigned int bound)
  96. {
  97. ConfigUART1(bound);
  98. }
  99. void InitCH448F(void)
  100. {
  101. ConfigCH448FGPIO();
  102. }
  103. void Start_Send_UartData(unsigned char len)
  104. {
  105. unsigned int i;
  106. for(i=0;i<len;i++)
  107. {
  108. usart_data_transmit(USART1, (uint8_t)u8_TxBuf[i]);
  109. while(usart_flag_get(USART1, USART_FLAG_TC) == RESET);
  110. }
  111. }
  112. void select_channel(uint8_t chx)
  113. {
  114. switch(chx)
  115. {
  116. case 0:
  117. SEL_0_L;
  118. SEL_1_L;
  119. SEL_2_L;
  120. break;
  121. case 1:
  122. SEL_0_H;
  123. SEL_1_L;
  124. SEL_2_L;
  125. break;
  126. case 2:
  127. SEL_0_L;
  128. SEL_1_H;
  129. SEL_2_L;
  130. break;
  131. default:
  132. break;
  133. }
  134. DelayNus(3);
  135. }