看起来USB和串口都可以用来代码下载和日志输出,两者在能力上各自有哪些特有的优势和劣势?
您好,USB口优势
①如果实际应用中用到了USB1,那么PB11(USB1的D+脚)可以直接用作boot触发脚,这样节省一个IO。如果涉及到某些快充头供电的场景,冷启动的话可能会导致PB11被触发,无操作10s后退出boot。
②如果工厂是用电脑烧录的话,USB烧录可以节省USB转串口模块。
③USB烧录比串口烧录快。串口烧录可以配置为115200/1M/2M波特率模式,不过都没有USB快。高波特率下,可能有USB转串口模块的兼容性问题,最好是用CH34x系列。
串口的优势
①大多数应用是建议留出串口1的,用于查看串口打印/过无线认证等,冷启动也可以用来烧录,如果应用中不使用USB的话就无须再引出USB脚。
②MCU中串口打印的库已经完善,直接调用printf/PRINT接口去打印日志即可。USB的打印还需再写部分代码。
PB11触发boot是上拉10K电阻到VCC3V3吧?
对于系统内核的日志输出(特别是哪些你们不提供源代码的模块)和系统crash的堆栈打印,是不是只有串口1可以做到?
是的,PB11触发boot是上拉10K电阻到VCC3V3。
系统内核/堆栈的输出、打印库、串口1没有完全绑定。
系统内核的输出,是调用特定接口获取返回值;打印库输出的数据,在标准驱动文件夹的sys.c代码里可以直接找到,可以通过修改DEBUG宏来指定其他串口作为打印口。
系统内核的输出是不是只能用串口,不能用USB?
或者从调试能力来说,串口和USB没有区别?
是的,串口与USB协议本身存在差异,就打印输出的能力来讲没有区别;或者说具体使用哪个接口去输出打印日志,和打印库没有强制绑定,指定用哪个数据接口输出都可以的,哪怕用SPI接口也可以。
打印库输出的数据,可以在标准驱动文件夹下的sys.c代码,_write函数中获取到,可以不使用串口打印,自行添加USB的处理走USB输出打印日志也是可以的。
USB协议栈对内存的需求,是不是远比串口大?
对于hard fault等总线或者指令相关的错误信息,串口可以打印出来吗?
串口打印需要的驱动代码确实比USB小。
错误信息也可以的。举个例子 v_mepc=__get_MEPC(); 获取程序指针计数器,接口是__get_MEPC()是RISC-V内核底层的指令无法改变,获取到的数据是存放在自定义的变量v_mepc里的。这个步骤与从哪里打印是不相关的,那么问题其实是从串口打印一个变量,还是从USB打印一个变量,是否要走打印库转换格式。所以也是可以串口打印的没问题。
最近遇到内存访问对齐的错误,应该是hard fault或者mcause4吧?基于USB的调试打印无法输出任何信息,直接报告USB设备无法识别。
如果使用串口打印,这种情况能输出信息吗?
hard fault中断服务函数中是否有死循环。进hard fault中断后,USB中断服务函数无法进入,影响了USB发包;串口打印是直接查询发包的,不涉及中断,可以发出去。