RT-Thread论坛
直播中

杨雪

8年用户 1207经验值
私信 关注
[问答]

GD32F103RCT6 rt_kprintf无法打印怎么解决?

使用的芯片为GD32F103RCT6,文件夹board路径里有一个不使用rt操作系统的串口打印配置,映射到printf,使用这个代码配置的printf可以正常打印。我使用的串口为uart1,引脚为PB6和PB7,drv_usart.c文件中的配置已更改。求解



打印值如下,连rt的标识都没有打印



回帖(1)

木頭瓶子

2025-9-23 17:03:04

针对GD32F103RCT6芯片上rt_kprintf无法打印的问题,结合您描述的串口硬件配置(UART1,PB6/PB7)和非RT-Thread的printf可正常工作的信息,以下是系统化的解决方案:




1. 确认串口引脚重映射配置


GD32的UART1默认引脚是PA9/PA10,使用PB6/PB7需开启重映射:


// 在 drv_usart.c 的 USART 初始化函数中添加
rcu_periph_clock_enable(RCU_AF);
gpio_pin_remap_config(GPIO_USART1_REMAP, ENABLE); // 启用UART1重映射



2. 检查串口驱动配置


确保drv_usart.c中已正确定义UART1设备且引脚配置正确:


// 示例配置(GD32库)
static struct gd32_usart usart_config[] = {
    {
        .name = "uart1",
        .usart_periph = USART1,
        .irqn = USART1_IRQn,
        .tx_pin = GPIO_PIN_6,
        .rx_pin = GPIO_PIN_7,
        .tx_gpio_port = GPIOB,
        .rx_gpio_port = GPIOB,
        .clk = RCU_USART1,
        .gpio_clk = RCU_GPIOB,
    }
};



3. 验证控制台设备绑定


在RT-Thread中需将控制台绑定到UART1:



  • 方法1:在 rtconfig.h 中定义:
    #define RT_CONSOLE_DEVICE_NAME "uart1"

  • 方法2:在应用代码中主动设置(如 main.c):
    #include 
    int main(void) {
      rt_console_set_device("uart1"); // 设置控制台设备
      rt_kprintf("RT-Thread Startupn"); // 测试打印
      return 0;
    }




4. 检查中断服务函数


确认中断函数名与RT-Thread标准匹配:


// drv_usart.c 中确保中断函数名正确
void USART1_IRQHandler(void) {
    rt_interrupt_enter();
    gd32_usart_isr(&usart_obj[UART1_INDEX].serial);
    rt_interrupt_leave();
}



5. 确保串口驱动已注册


在RT-Thread启动流程中调用串口初始化:


// board.c 的 rt_hw_board_init() 函数中调用
int rt_hw_board_init() {
    rt_hw_usart_init();  // 初始化并注册串口设备
    /* ...其他初始化... */
}



6. 调试步骤



  • 步骤1:检查串口设备列表

    在MSH(RT-Thread Shell)中输入 list_device,查看uart1是否在列表中且状态正常。

  • 步骤2:手动发送测试

    在初始化代码中添加直接发送测试:
    rt_device_t dev = rt_device_find("uart1");
    if (dev) {
      char test[] = "Direct Testn";
      rt_device_write(dev, 0, test, sizeof(test)-1);
    }

  • 步骤3:检查时钟树配置

    确认USART1时钟源(APB2)已使能,且波特率配置匹配(如115200)。




7. 工程配置检查



  • 确认RT-Thread Settings中已启用 UART DriverConsole 组件。

  • 排除编译器优化问题:调试模式下关闭优化(-O0),检查是否有未预料的中断屏蔽。




常见问题总结



























问题点 症状 解决方案
引脚重映射未开启 无任何输出 配置 GPIO_USART1_REMAP
控制台设备未绑定 无RT标识但有其他输出 设置 RT_CONSOLE_DEVICE_NAME
中断函数名错误 发送阻塞或部分数据丢失 修正为 USART1_IRQHandler

通过以上步骤,可系统性定位并解决rt_kprintf无法打印的问题。若仍遇异常,建议使用逻辑分析仪检查PB6/PB7信号波形,确认硬件通信状态。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分