/********************************************************************************************************* * Module : Uart.c * Abstract : Uart modules,uart be used to read data from hlw8110. This file content IRQ of usart and * ch448f code! * Version : 1.0.0 * Author : Leopul(COPYRIGHT 2025 - 2027 Leopul. All rights reserved.) * Complete : 2025-02-16 * Content : None * Note : None *********************************************************************************************************/ #include "Uart1.h" #include "gd32e230x_conf.h" #include "SysTick.h" #define UART1_BUF_SIZE 10 #define XEN GPIO_PIN_4 #define YEN GPIO_PIN_5 #define SEL0 GPIO_PIN_6 #define SEL1 GPIO_PIN_7 #define SEL2 GPIO_PIN_12 #define SEL1_H gpio_bit_set(GPIOA, SEL1) #define SEL1_L gpio_bit_reset(GPIOA, SEL1) #define SEL2_H gpio_bit_set(GPIOB, SEL2) #define SEL2_L gpio_bit_reset(GPIOB, SEL2) #define SEL0_H gpio_bit_set(GPIOA, SEL0) #define SEL0_L gpio_bit_reset(GPIOA, SEL0) extern unsigned char u8_TxBuf[UART1_BUF_SIZE]; extern unsigned char u8_RxBuf[UART1_BUF_SIZE]; extern unsigned char u8_TX_Length; extern unsigned char u8_RX_Length; extern unsigned char u8_RX_Index; extern unsigned char B_Rx_Data_ING; extern unsigned char B_Rx_Finish; /********************************************************************************************************* * 函数名称:ConfigCH448FGPIO * 函数功能:配置CH448F的切换GPIO * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意:真值表 * XEN# YEN# SEL2 SEL1 SEL0 AX AY * 0 0 0 0 0 选择A0X 选择A0Y 实际是4 * 0 0 0 0 1 选择A1X 选择A1Y 实际是3 * 0 0 0 1 0 选择A2X 选择A2Y 实际是2 * 0 0 0 1 1 选择A3X 选择A3Y 实际是1 * 0 0 1 0 0 选择A4X 选择A4Y 实际是8 * 0 0 1 0 1 选择A5X 选择A5Y 实际是7 * 0 0 1 1 0 选择A6X 选择A6Y 实际是6 * 0 0 1 1 1 选择A7X 选择A7Y 实际是5 * 1 1 X X X 全部断开 全部断开 *********************************************************************************************************/ static void ConfigCH448FGPIO(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, XEN); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, XEN); gpio_bit_reset(GPIOA, XEN); gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, YEN); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, YEN); gpio_bit_reset(GPIOA, YEN); gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL0); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL0); gpio_bit_reset(GPIOA, SEL0); gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL1); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL1); gpio_bit_reset(GPIOA, SEL1); gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SEL2); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SEL2); gpio_bit_reset(GPIOB, SEL2); } static void ConfigUART1(unsigned int 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_9BIT); usart_parity_config(USART1,USART_PM_EVEN); 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_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET) { usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE); if (u8_RX_Index < u8_RX_Length ) { u8_RxBuf[u8_RX_Index] = usart_data_receive(USART1); u8_RX_Index++; B_Rx_Data_ING = 1; } else { B_Rx_Finish = TRUE; u8_RX_Index = 0; } } } void InitUART1(unsigned int bound) { ConfigUART1(bound); } void InitCH448F(void) { ConfigCH448FGPIO(); } void Start_Send_UartData(unsigned char len) { unsigned int i; for(i=0;i