#include "drv_usart.h" #include "gd32f4xx.h" // 串口配置结构体 static struct gd32_usart_config usart_config[] = { { .name = "test", .usart_periph = USART0, .rcu_periph_clock = RCU_USART0, .gpio_port = GPIOA, .rcu_gpio_clock = RCU_GPIOA, .tx_pin = GPIO_PIN_9, .rx_pin = GPIO_PIN_10, .baud_rate = 9600, .irq_type = USART0_IRQn }, // 可以添加更多串口配置 }; // 初始化所有配置的串口 void gd32_usart_init(void) { for (int i = 0; i < sizeof(usart_config) / sizeof(usart_config[0]); i++) { gd32_usart_configure(&usart_config[i]); } } // 配置单个串口 void gd32_usart_configure(struct gd32_usart_config *config) { // 启用时钟 rcu_periph_clock_enable(config->rcu_periph_clock); rcu_periph_clock_enable(config->rcu_gpio_clock); // 配置GPIO gpio_af_set(config->gpio_port, GPIO_AF_7, config->tx_pin); gpio_af_set(config->gpio_port, GPIO_AF_7, config->rx_pin); gpio_mode_set(config->gpio_port, GPIO_MODE_AF, GPIO_PUPD_NONE, config->tx_pin); gpio_mode_set(config->gpio_port, GPIO_MODE_AF, GPIO_PUPD_NONE, config->rx_pin); gpio_output_options_set(config->gpio_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, config->tx_pin); gpio_output_options_set(config->gpio_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, config->rx_pin); // 配置USART usart_deinit(config->usart_periph); usart_baudrate_set(config->usart_periph, config->baud_rate); usart_word_length_set(config->usart_periph, USART_WL_8BIT); usart_stop_bit_set(config->usart_periph, USART_STB_1BIT); usart_parity_config(config->usart_periph, USART_PM_NONE); // usart_hardware_flow_rts_config(config->usart_periph, USART_RTS_DISABLE); // usart_hardware_flow_cts_config(config->usart_periph, USART_CTS_DISABLE); usart_receive_config(config->usart_periph, USART_RECEIVE_ENABLE); usart_transmit_config(config->usart_periph, USART_TRANSMIT_ENABLE); // 启用USART usart_enable(config->usart_periph); // 配置中断(如果需要) // nvic_irq_enable(config->irq_type, 0, 0); // usart_interrupt_enable(config->usart_periph, USART_INT_RBNE); } // 发送字符 void gd32_usart_putchar(struct gd32_usart_config *config, char ch) { usart_data_transmit(config->usart_periph, (uint16_t)ch); while (usart_flag_get(config->usart_periph, USART_FLAG_TBE) == RESET); } // 发送字符串 void gd32_usart_puts(struct gd32_usart_config *config, const char *str) { while (*str) { gd32_usart_putchar(config, *str++); } } void usart_puts(const char *str) { gd32_usart_puts(&usart_config[0], str); } // 获取串口配置 by name struct gd32_usart_config *gd32_usart_get_config(const char *name) { for (int i = 0; i < sizeof(usart_config) / sizeof(usart_config[0]); i++) { if (rt_strcmp(usart_config[i].name, name) == 0) { return &usart_config[i]; } } return RT_NULL; }