



针对GD32F103RCT6芯片上rt_kprintf无法打印的问题,结合您描述的串口硬件配置(UART1,PB6/PB7)和非RT-Thread的printf可正常工作的信息,以下是系统化的解决方案:
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重映射确保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,
}
};在RT-Thread中需将控制台绑定到UART1:
rtconfig.h 中定义:#define RT_CONSOLE_DEVICE_NAME "uart1"main.c):#include
int main(void) {
rt_console_set_device("uart1"); // 设置控制台设备
rt_kprintf("RT-Thread Startupn"); // 测试打印
return 0;
}确认中断函数名与RT-Thread标准匹配:
// drv_usart.c 中确保中断函数名正确
void USART1_IRQHandler(void) {
rt_interrupt_enter();
gd32_usart_isr(&usart_obj[UART1_INDEX].serial);
rt_interrupt_leave();
}在RT-Thread启动流程中调用串口初始化:
// board.c 的 rt_hw_board_init() 函数中调用
int rt_hw_board_init() {
rt_hw_usart_init(); // 初始化并注册串口设备
/* ...其他初始化... */
}list_device,查看uart1是否在列表中且状态正常。rt_device_t dev = rt_device_find("uart1");
if (dev) {
char test[] = "Direct Testn";
rt_device_write(dev, 0, test, sizeof(test)-1);
}| 问题点 | 症状 | 解决方案 |
|---|---|---|
| 引脚重映射未开启 | 无任何输出 | 配置 GPIO_USART1_REMAP |
| 控制台设备未绑定 | 无RT标识但有其他输出 | 设置 RT_CONSOLE_DEVICE_NAME |
| 中断函数名错误 | 发送阻塞或部分数据丢失 | 修正为 USART1_IRQHandler |
通过以上步骤,可系统性定位并解决rt_kprintf无法打印的问题。若仍遇异常,建议使用逻辑分析仪检查PB6/PB7信号波形,确认硬件通信状态。
举报
更多回帖