Zephyr重定向日志打印到USB串口
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.overlay
或 boards/<板子名称>.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波特率打开串口: