问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

GD32F407 UART串口通信详解

创作时间:
作者:
@小白创作中心

GD32F407 UART串口通信详解

引用
CSDN
1.
https://blog.csdn.net/m0_63235356/article/details/139904819

GD32F407是一款高性能的ARM Cortex-M4微控制器,广泛应用于工业控制、消费电子等领域。其内置的UART串口通信功能,可以实现设备之间的数据传输。本文将详细介绍如何使用GD32F407的USART0进行串口通信,包括硬件配置、软件编程以及printf重定向到串口的方法。

硬件配置

首先确定串口的TX和RX引脚。使用USART0时,对应的引脚是GPIOB的6和7号引脚。需要打开GPIOB的外设时钟,并配置引脚复用和模式。

rcu_periph_clock_enable(RCU_GPIOB);
gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_6 | GPIO_PIN_7);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6 | GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);

UART配置

接下来配置UART,首先打开对应的外设时钟。

rcu_periph_clock_enable(RCU_USART0);

然后进行串口设置:

  • 复位串口
  • 设置波特率(常用值如9600、115200)
  • 设置校验位(一般选择无校验)
  • 设置数据位长度(通常是8位)
  • 设置停止位(通常是1位)
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_enable(USART0);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);

数据收发

发送数据时需要注意数据类型,实际使用中应以uint16_t为准。

void sendData(uint16_t data) {
    while (RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    usart_data_transmit(USART0, data);
}

接收数据需要开启接收中断:

usart_interrupt_enable(USART0, USART_INT_RBNE);
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_irq_enable(USART0_IRQn, 1, 1);

在中断处理函数中检测并清除中断标志位:

void USART0_IRQHandler(void) {
    if ((RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))) {
        uint8_t data = (uint8_t)usart_data_receive(USART0);
        sendData(data);
        usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);
    }
}

printf重定向

在GD32F407中,不能使用Keil的Use MicroLib选项。解决方案是在代码中添加以下内容:

#if !defined(__MICROLIB)
#if (__ARMCLIB_VERSION <= 6000000)
struct __FILE {
    int handle;
};
#endif
FILE __stdout;
void _sys_exit(int x) {
    x = x;
}
#endif

int fputc(int ch, FILE *f) {
    sendData(ch);
    return ch;
}

这样就可以在主循环中使用printf打印信息到串口助手:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号