Zephyr重定向日志打印到USB串口

发布时间 2023-10-24 10:50:00作者: jayant97

nRF52840DK开发板的例程大多数是从硬件串口打印日志,然后硬件串口在开发板上通过Jlink转换为USB串口,最后打印到电脑上。
这里给出通过52840自己的USB串口打印日志的方法。

zephyr/samples/hello_world例程为例:

修改config

# 使能串口驱动
CONFIG_SERIAL=y

# 使能串口的中断模式(除此之外,还有阻塞、异步两种模式)
# CONFIG_UART_INTERRUPT_DRIVEN=y

# 使能串口流控
# CONFIG_UART_LINE_CTRL=y

# 使能USB协议栈
CONFIG_USB_DEVICE_STACK=y
CONFIG_USB_DEVICE_PRODUCT="Hello world sample"
CONFIG_USB_DEVICE_PID=0x0001

# 使能USB串口
CONFIG_USB_CDC_ACM=y


# 使能Zephyr终端
CONFIG_CONSOLE=y

# 使终端为串口
CONFIG_UART_CONSOLE=y
CONFIG_STDOUT_CONSOLE=y

CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=y

修改设备树

新建app.overlayboards/<板子名称>.overlay

/* zephyr的系统代码是从chosen节点的`zephyr,console`属性来找串口device的,因此这里修改为我们新建的USB串口 */
/ {
	chosen {
		zephyr,console = &cdc_acm_uart1;
	};
};

/* 在52840的USB设备下新增一个cdc_acm节点,即虚拟串口 */
&zephyr_udc0 {
	cdc_acm_uart1: cdc_acm_uart1 {
		compatible = "zephyr,cdc-acm-uart";
        status = "okay";
	};
};

测试运行

原始的hello world只打印了一次,我们插上USB然后打开串口就会错过日志打印,因此改成循环打印

void main(void)
{   
    int i = 0;
    while(1) {
        k_sleep(K_MSEC(2000));
        printk("Hello World! %s %d\n", CONFIG_BOARD, i++);
    }
}

最后用115200波特率打开串口: