2. 配置串口控制台输出

任务目标

在Zephyr项目中启用串口控制台(Console),使printk()输出重定向到UART,并验证开发板复位后能在串口终端看到启动日志与自定义输出。

环境依赖

  • Zephyr SDK(v3.x+)与west工具链已安装
  • 一块支持Zephyr的开发板(本文以qemu_cortex_m3为例,无需真实硬件)
  • 串口终端工具(如minicom、PuTTY,真实硬件时需要)

实现步骤

Zephyr的串口控制台由CONFIG_CONSOLE与CONFIG_UART_CONSOLE两个Kconfig选项控制。默认情况下,printk()会通过控制台驱动输出。若使用真实开发板,需确认设备树中UART节点与chosen的zephyr,console属性匹配。

关键完整代码

创建项目目录console_demo,包含以下三个文件:

prj.conf

CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
CONFIG_PRINTK=y

CMakeLists.txt

cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(console_demo)

target_sources(app PRIVATE src/main.c)

src/main.c

#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>

void main(void)
{
    printk("Console demo started\n");
    printk("Board: %s\n", CONFIG_BOARD);

    while (1) {
        printk("Uptime: %lld ms\n", k_uptime_get());
        k_sleep(K_SECONDS(1));
    }
}

构建与运行

west build -b qemu_cortex_m3 -d build console_demo
west build -t run -d build

QEMU窗口将显示串口输出。若使用真实开发板,将-b参数替换为对应板型(如nucleo_f103rb),烧录后连接UART引脚(通常为USART1的TX/RX),在终端设置115200-8-N-1即可观察输出。

验证方法

运行后观察终端是否依次出现以下内容:

Console demo started
Board: qemu_cortex_m3
Uptime: 0 ms
Uptime: 1000 ms
Uptime: 2000 ms
...

每秒递增的Uptime输出证明控制台工作正常。若终端无输出,依次检查:

  • 构建时是否启用CONFIG_UART_CONSOLE(执行west build -t menuconfig确认)
  • 真实硬件时,确认UART引脚接线与终端波特率
  • QEMU环境下,确认未使用-nographic以外的重定向参数

常见问题

printk无输出但程序运行正常:检查CONFIG_PRINTK是否被意外关闭;部分板卡需额外设置CONFIG_SERIAL=y。

真实板卡乱码:核对开发板UART时钟配置与终端波特率是否匹配,Zephyr默认使用设备树中current-speed属性(通常为115200)。