#include "uart.h" #include "gpio.h" #include "gd32e23x_usart.h" static Uart_DataPtrType Uart_DataPtr = {0xaa, 0xbb, 0, 0, 0, 0}; /****************************************************************** |Usart0 |PB6-TX:复用推挽输出 |PB7-RX:浮空输入 ******************************************************************/ static void GPIO_Uart_Init(void) { rcu_periph_clock_enable(RCU_GPIOB); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6); gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_7); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7); } /****************************************************************** |Usart0 |PB6-TX |PB7-RX ******************************************************************/ void UartInit(void) { GPIO_Uart_Init(); rcu_periph_clock_enable(RCU_USART0); usart_deinit(USART0); usart_baudrate_set(USART0, 9600); usart_parity_config(USART0, USART_PM_NONE); usart_word_length_set(USART0, USART_WL_8BIT); usart_stop_bit_set(USART0, USART_STB_1BIT); usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); usart_enable(USART0); usart_interrupt_enable(USART0, USART_INT_RBNE); nvic_irq_enable(USART0_IRQn, 0); } void USART0_IRQHandler() { unsigned short Rdat; Rdat = usart_data_receive(USART0); usart_data_transmit(USART0, Rdat); switch (Uart_DataPtr.R_Number) { case 0: { if (Rdat == Uart_DataPtr.HeadA) { Uart_DataPtr.R_Number = 1; } break; } case 1: { if (Rdat == Uart_DataPtr.HeadB) { Uart_DataPtr.R_Number = 2; } else { Uart_DataPtr.R_Number = 0; } break; } case 2: { Uart_DataPtr.R_SpeedH = Rdat; Uart_DataPtr.R_Number = 3; break; } case 3: { Uart_DataPtr.R_SpeedL = Rdat; Uart_DataPtr.R_Number = 0; break; } default: break; } }