看起來(lái)USB和串口都可以用來(lái)代碼下載和日志輸出,兩者在能力上各自有哪些特有的優(yōu)勢(shì)和劣勢(shì)?
您好,USB口優(yōu)勢(shì)
①如果實(shí)際應(yīng)用中用到了USB1,那么PB11(USB1的D+腳)可以直接用作boot觸發(fā)腳,這樣節(jié)省一個(gè)IO。如果涉及到某些快充頭供電的場(chǎng)景,冷啟動(dòng)的話可能會(huì)導(dǎo)致PB11被觸發(fā),無(wú)操作10s后退出boot。
②如果工廠是用電腦燒錄的話,USB燒錄可以節(jié)省USB轉(zhuǎn)串口模塊。
③USB燒錄比串口燒錄快。串口燒錄可以配置為115200/1M/2M波特率模式,不過(guò)都沒(méi)有USB快。高波特率下,可能有USB轉(zhuǎn)串口模塊的兼容性問(wèn)題,最好是用CH34x系列。
串口的優(yōu)勢(shì)
①大多數(shù)應(yīng)用是建議留出串口1的,用于查看串口打印/過(guò)無(wú)線認(rèn)證等,冷啟動(dòng)也可以用來(lái)燒錄,如果應(yīng)用中不使用USB的話就無(wú)須再引出USB腳。
②MCU中串口打印的庫(kù)已經(jīng)完善,直接調(diào)用printf/PRINT接口去打印日志即可。USB的打印還需再寫(xiě)部分代碼。
PB11觸發(fā)boot是上拉10K電阻到VCC3V3吧?
對(duì)于系統(tǒng)內(nèi)核的日志輸出(特別是哪些你們不提供源代碼的模塊)和系統(tǒng)crash的堆棧打印,是不是只有串口1可以做到?
是的,PB11觸發(fā)boot是上拉10K電阻到VCC3V3。
系統(tǒng)內(nèi)核/堆棧的輸出、打印庫(kù)、串口1沒(méi)有完全綁定。
系統(tǒng)內(nèi)核的輸出,是調(diào)用特定接口獲取返回值;打印庫(kù)輸出的數(shù)據(jù),在標(biāo)準(zhǔn)驅(qū)動(dòng)文件夾的sys.c代碼里可以直接找到,可以通過(guò)修改DEBUG宏來(lái)指定其他串口作為打印口。
系統(tǒng)內(nèi)核的輸出是不是只能用串口,不能用USB?
或者從調(diào)試能力來(lái)說(shuō),串口和USB沒(méi)有區(qū)別?
是的,串口與USB協(xié)議本身存在差異,就打印輸出的能力來(lái)講沒(méi)有區(qū)別;或者說(shuō)具體使用哪個(gè)接口去輸出打印日志,和打印庫(kù)沒(méi)有強(qiáng)制綁定,指定用哪個(gè)數(shù)據(jù)接口輸出都可以的,哪怕用SPI接口也可以。
打印庫(kù)輸出的數(shù)據(jù),可以在標(biāo)準(zhǔn)驅(qū)動(dòng)文件夾下的sys.c代碼,_write函數(shù)中獲取到,可以不使用串口打印,自行添加USB的處理走USB輸出打印日志也是可以的。
USB協(xié)議棧對(duì)內(nèi)存的需求,是不是遠(yuǎn)比串口大?
對(duì)于hard fault等總線或者指令相關(guān)的錯(cuò)誤信息,串口可以打印出來(lái)嗎?
串口打印需要的驅(qū)動(dòng)代碼確實(shí)比USB小。
錯(cuò)誤信息也可以的。舉個(gè)例子 v_mepc=__get_MEPC(); 獲取程序指針計(jì)數(shù)器,接口是__get_MEPC()是RISC-V內(nèi)核底層的指令無(wú)法改變,獲取到的數(shù)據(jù)是存放在自定義的變量v_mepc里的。這個(gè)步驟與從哪里打印是不相關(guān)的,那么問(wèn)題其實(shí)是從串口打印一個(gè)變量,還是從USB打印一個(gè)變量,是否要走打印庫(kù)轉(zhuǎn)換格式。所以也是可以串口打印的沒(méi)問(wèn)題。
最近遇到內(nèi)存訪問(wèn)對(duì)齊的錯(cuò)誤,應(yīng)該是hard fault或者mcause4吧?基于USB的調(diào)試打印無(wú)法輸出任何信息,直接報(bào)告USB設(shè)備無(wú)法識(shí)別。
如果使用串口打印,這種情況能輸出信息嗎?
hard fault中斷服務(wù)函數(shù)中是否有死循環(huán)。進(jìn)hard fault中斷后,USB中斷服務(wù)函數(shù)無(wú)法進(jìn)入,影響了USB發(fā)包;串口打印是直接查詢(xún)發(fā)包的,不涉及中斷,可以發(fā)出去。