newPtz/drivers/drv_usart.c

93 lines
2.9 KiB
C

#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;
}