uart.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include "uart.h"
  2. #include "board_cfg.h"
  3. #include "common.h"
  4. #include "gd32e23x.h"
  5. #include "Hlw8110.h"
  6. #include "stdbool.h"
  7. #include "systick.h"
  8. #define UART1_BUF_SIZE 64
  9. #define IM1253E_bd 4800
  10. unsigned char u8_RxBuf[UART1_BUF_SIZE];
  11. unsigned char u8_TX_Length;
  12. unsigned char u8_RX_Index;
  13. unsigned char B_Rx_Finish;
  14. unsigned char RX_Length;
  15. Rx_Data data={0};
  16. void uart1_config(uint32_t bound)
  17. {
  18. nvic_irq_enable(USART1_IRQn, 2);
  19. rcu_periph_clock_enable(RCU_GPIOA);
  20. gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2);
  21. gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
  22. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
  23. gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3);
  24. gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
  25. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
  26. rcu_periph_clock_enable(RCU_USART1);
  27. usart_deinit(USART1);
  28. usart_baudrate_set(USART1, bound);
  29. usart_stop_bit_set(USART1,USART_STB_1BIT);
  30. usart_word_length_set(USART1,USART_WL_8BIT);
  31. usart_parity_config(USART1,USART_PM_NONE);
  32. usart_receive_config(USART1, USART_RECEIVE_ENABLE);
  33. usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
  34. usart_enable(USART1);
  35. usart_interrupt_enable(USART1, USART_INT_RBNE);
  36. }
  37. void USART1_IRQHandler(void)
  38. {
  39. if(usart_flag_get(USART1, USART_FLAG_ORERR) == SET)
  40. {
  41. usart_flag_clear(USART1, USART_FLAG_ORERR);
  42. }
  43. if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_TBE)!= RESET)
  44. {
  45. usart_interrupt_flag_clear(USART1, USART_INT_FLAG_TBE);
  46. }
  47. if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET)
  48. {
  49. usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE);
  50. if (u8_RX_Index < RX_Length )
  51. {
  52. #if SUPPORT_STM32_ADC
  53. extern Rx_Data data;
  54. data.data[u8_RX_Index] = usart_data_receive(USART1);
  55. #else
  56. u8_RxBuf[u8_RX_Index] = usart_data_receive(USART1);
  57. #endif
  58. u8_RX_Index++;
  59. if(u8_RX_Index >= RX_Length)
  60. {
  61. B_Rx_Finish = TRUE;
  62. u8_RX_Index = 0;
  63. }
  64. }
  65. }
  66. }
  67. #if SUPPORT_STM32_ADC
  68. uint32_t read_stm_voltage(uint8_t channel)
  69. {
  70. uint16_t r_volatge = 0xA5A5;
  71. uint32_t value;
  72. RX_Length = 4;
  73. che442_change_ch(channel);
  74. DelayNms(5);
  75. //memset(&data.value,0,4);
  76. Start_Send_UartData((uint8_t*)&r_volatge,sizeof(r_volatge));
  77. int count = 0;
  78. while(B_Rx_Finish != TRUE)
  79. {
  80. DelayNms(1);
  81. if(count >= 100)
  82. {
  83. u8_RX_Index = 0;
  84. B_Rx_Finish = FALSE;
  85. break;
  86. }
  87. count++;
  88. }
  89. if(B_Rx_Finish == FALSE)
  90. {
  91. count =0;
  92. Start_Send_UartData((uint8_t*)&r_volatge,sizeof(r_volatge));
  93. while(B_Rx_Finish != TRUE)
  94. {
  95. DelayNms(1);
  96. if(count >= 100)
  97. {
  98. u8_RX_Index = 0;
  99. B_Rx_Finish =FALSE;
  100. break;
  101. }
  102. count ++;
  103. }
  104. }
  105. if(B_Rx_Finish)
  106. {
  107. value = data.value;
  108. B_Rx_Finish = false;
  109. }else
  110. value = 0;
  111. return value;
  112. }
  113. #endif
  114. void Start_Send_UartData(uint8_t *pt,uint8_t len)
  115. {
  116. uint8_t i;
  117. for(i = 0;i < len;i++)
  118. {
  119. usart_data_transmit(USART1, *(pt+i)); //发送字符函数
  120. while(usart_flag_get(USART1, USART_FLAG_TC) == RESET);//等待发送结束
  121. }
  122. }
  123. #if SUPPORT_STM32_ADC
  124. #define CH442E_GPIO GPIOA
  125. #define CH442E_RCU RCU_GPIOA
  126. #define CH442E_IN_GPIO GPIO_PIN_15
  127. #define CH442E_EN_GPIO GPIO_PIN_12
  128. #define CHOISE_STM32_1 gpio_bit_set(CH442E_GPIO, CH442E_IN_GPIO)
  129. #define CHOISE_STM32_2 gpio_bit_reset(CH442E_GPIO, CH442E_IN_GPIO)
  130. void che442e_Init(void)
  131. {
  132. rcu_periph_clock_enable(CH442E_RCU);
  133. gpio_mode_set(CH442E_GPIO, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, CH442E_IN_GPIO | CH442E_EN_GPIO);
  134. gpio_bit_set(CH442E_GPIO, CH442E_IN_GPIO);
  135. gpio_bit_reset(CH442E_GPIO, CH442E_EN_GPIO);
  136. }
  137. void che442_change_ch(uint8_t channel)
  138. {
  139. switch(channel)
  140. {
  141. case STM32_ADC_V_1:
  142. CHOISE_STM32_1;
  143. break;
  144. case STM32_ADC_V_2:
  145. CHOISE_STM32_2;
  146. break;
  147. default:
  148. break;
  149. }
  150. }
  151. #endif