#include "uart.h" #include "board_cfg.h" #include "common.h" #include "gd32e23x.h" #include "Hlw8110.h" #include "stdbool.h" #include "systick.h" #define UART1_BUF_SIZE 64 #define IM1253E_bd 4800 unsigned char u8_RxBuf[UART1_BUF_SIZE]; unsigned char u8_TX_Length; unsigned char u8_RX_Index; unsigned char B_Rx_Finish; unsigned char RX_Length; Rx_Data data={0}; void uart1_config(uint32_t bound) { nvic_irq_enable(USART1_IRQn, 2); rcu_periph_clock_enable(RCU_GPIOA); gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2); gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2); gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3); gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3); rcu_periph_clock_enable(RCU_USART1); usart_deinit(USART1); usart_baudrate_set(USART1, bound); usart_stop_bit_set(USART1,USART_STB_1BIT); usart_word_length_set(USART1,USART_WL_8BIT); usart_parity_config(USART1,USART_PM_NONE); usart_receive_config(USART1, USART_RECEIVE_ENABLE); usart_transmit_config(USART1, USART_TRANSMIT_ENABLE); usart_enable(USART1); usart_interrupt_enable(USART1, USART_INT_RBNE); } void USART1_IRQHandler(void) { if(usart_flag_get(USART1, USART_FLAG_ORERR) == SET) { usart_flag_clear(USART1, USART_FLAG_ORERR); } if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_TBE)!= RESET) { usart_interrupt_flag_clear(USART1, USART_INT_FLAG_TBE); } if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET) { usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE); if (u8_RX_Index < RX_Length ) { #if SUPPORT_STM32_ADC extern Rx_Data data; data.data[u8_RX_Index] = usart_data_receive(USART1); #else u8_RxBuf[u8_RX_Index] = usart_data_receive(USART1); #endif u8_RX_Index++; if(u8_RX_Index >= RX_Length) { B_Rx_Finish = TRUE; u8_RX_Index = 0; } } } } #if SUPPORT_STM32_ADC uint32_t read_stm_voltage(uint8_t channel) { uint16_t r_volatge = 0xA5A5; uint32_t value; RX_Length = 4; che442_change_ch(channel); DelayNms(5); //memset(&data.value,0,4); Start_Send_UartData((uint8_t*)&r_volatge,sizeof(r_volatge)); int count = 0; while(B_Rx_Finish != TRUE) { DelayNms(1); if(count >= 100) { u8_RX_Index = 0; B_Rx_Finish = FALSE; break; } count++; } if(B_Rx_Finish == FALSE) { count =0; Start_Send_UartData((uint8_t*)&r_volatge,sizeof(r_volatge)); while(B_Rx_Finish != TRUE) { DelayNms(1); if(count >= 100) { u8_RX_Index = 0; B_Rx_Finish =FALSE; break; } count ++; } } if(B_Rx_Finish) { value = data.value; B_Rx_Finish = false; }else value = 0; return value; } #endif void Start_Send_UartData(uint8_t *pt,uint8_t len) { uint8_t i; for(i = 0;i < len;i++) { usart_data_transmit(USART1, *(pt+i)); //发送字符函数 while(usart_flag_get(USART1, USART_FLAG_TC) == RESET);//等待发送结束 } } #if SUPPORT_STM32_ADC #define CH442E_GPIO GPIOA #define CH442E_RCU RCU_GPIOA #define CH442E_IN_GPIO GPIO_PIN_15 #define CH442E_EN_GPIO GPIO_PIN_12 #define CHOISE_STM32_1 gpio_bit_set(CH442E_GPIO, CH442E_IN_GPIO) #define CHOISE_STM32_2 gpio_bit_reset(CH442E_GPIO, CH442E_IN_GPIO) void che442e_Init(void) { rcu_periph_clock_enable(CH442E_RCU); gpio_mode_set(CH442E_GPIO, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, CH442E_IN_GPIO | CH442E_EN_GPIO); gpio_bit_set(CH442E_GPIO, CH442E_IN_GPIO); gpio_bit_reset(CH442E_GPIO, CH442E_EN_GPIO); } void che442_change_ch(uint8_t channel) { switch(channel) { case STM32_ADC_V_1: CHOISE_STM32_1; break; case STM32_ADC_V_2: CHOISE_STM32_2; break; default: break; } } #endif