最近魚鷹在搞調(diào)試器,折騰了好多天終于理解了 MDK 、下載算法、調(diào)試器、MCU 之間的關(guān)系。
簡(jiǎn)單來說,就是,調(diào)試器作為 USB 轉(zhuǎn) SWD 協(xié)議的轉(zhuǎn)換工具,MDK 通過 USB 驅(qū)動(dòng)這個(gè)工具,下載算法包含了一些 MCU 內(nèi)部 FLASH 擦除、編程代碼,和普通代碼不同的是,該代碼可以下載在任意位置運(yùn)行。如果需要校驗(yàn),還會(huì)加入 CRC 校驗(yàn)代碼,扇區(qū)檢測(cè)代碼。
MDK 首先通過調(diào)試器將算法寫入內(nèi)部 RAM,然后把需要寫入的固件程序?qū)懭?RAM,再由 MDK 控制(通過調(diào)試器) MCU 執(zhí)行相應(yīng)代碼(擦除或?qū)懭肷葏^(qū)),通過 MCU 的寄存器和設(shè)定軟件斷點(diǎn)得到執(zhí)行結(jié)果,如此來回搬運(yùn),就可完成固件下載。
說起來簡(jiǎn)單,做起來很麻煩(調(diào)試器工具功能簡(jiǎn)單,只做協(xié)議轉(zhuǎn)換,如何控制通過 MDK),這里點(diǎn)到為止,有時(shí)間會(huì)好好整理分享一下。
之后準(zhǔn)備 USB 相關(guān)的工作,發(fā)現(xiàn)總是沒有滿意的 USB CORE 庫,官方的庫感覺還不錯(cuò),可惜被封裝了,看不到源碼,放棄。
之前魚鷹分享過虛擬串口的代碼,于是下載下來使用,發(fā)現(xiàn)竟然在 GD32 中用不了,當(dāng)初明明 ST 測(cè)試沒問題的。
還以為是 GD 芯片問題,然后使用之前的 USB 雙緩沖讀卡器代碼,發(fā)現(xiàn)沒有問題。
只能在線調(diào)試比較差異,借助邏輯分析儀,總算解決了這兩個(gè) BUG,順利自發(fā)自收。
BUG 1
枚舉失敗。
通過邏輯分析儀發(fā)現(xiàn),電腦發(fā)送控制幀給 USB 設(shè)備,竟然沒有任何回應(yīng),即沒有 NAK,也米有 STALL,更不用說 ACK 了。
正?;貞?yīng)
無回應(yīng)
通過調(diào)試發(fā)現(xiàn),該端點(diǎn)接收狀態(tài)為0,禁用狀態(tài),再參考可用代碼,發(fā)現(xiàn)在復(fù)位之后,應(yīng)該設(shè)置為接收有效才對(duì)。因此修改如下:
void USBD_Reset (void) { ……………… …… …… EPxREG(0)=EP_CONTROL|EP_RX_VALID;// 除了設(shè)定端點(diǎn)類型外,還要使能接收 DADDR = DADDR_EF | 0; /* Enable USB Default Address */ }
很奇怪的是,ST 我以前測(cè)試是沒問題的,可能也是兩者之間的差異吧。。
BUG2
枚舉成功后,又出現(xiàn)另外一個(gè)問題,就是串口只能發(fā)送第一幀數(shù)據(jù),第二次卡死……
經(jīng)過邏輯分析儀發(fā)現(xiàn),發(fā)送的數(shù)據(jù)會(huì)被 NAK。后來才發(fā)現(xiàn)下面的語句不滿足,直接沒有讀 USB 數(shù)據(jù)包,從而沒有恢復(fù)接收有效狀態(tài),導(dǎo)致串口助手卡死。
這段官方代碼也確實(shí)比較迷,沒有最大利用緩存空間(最少需要滿一包的空間,但實(shí)際可能不滿一包),不過按下不表。
那就是第一次收到的數(shù)據(jù)未讀唄,在 main() 函數(shù)里面發(fā)現(xiàn)根本沒進(jìn)來,發(fā)現(xiàn)竟然一直在 USB 中斷執(zhí)行……
void main() { while(1) { …… if (usb_rx_ch == -1) usb_rx_ch = USBD_CDC_ACM_GetChar(); …… } }
然后看到這個(gè)標(biāo)志一直在,未清除導(dǎo)致。
但很奇怪的事,該代碼在 ST 里面跑的挺好的。不管它,加上處理:
void USB_LP_CAN1_RX0_IRQHandler(void) { …… if (istr & ISTR_ESOF) { if (USBD_P_Error_Event) { USBD_P_Error_Event(3); } ISTR = ~ISTR_ESOF; } …… }
這下串口助手一下子絲滑了,舒服!
審核編輯:劉清
-
緩沖器
+關(guān)注
關(guān)注
6文章
1911瀏覽量
45425 -
RAM
+關(guān)注
關(guān)注
8文章
1364瀏覽量
114445 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
491瀏覽量
27458 -
調(diào)試器
+關(guān)注
關(guān)注
1文章
300瀏覽量
23668 -
GD32
+關(guān)注
關(guān)注
7文章
403瀏覽量
24113
原文標(biāo)題:關(guān)于 GD32 虛擬串口的兩個(gè) BUG
文章出處:【微信號(hào):emOsprey,微信公眾號(hào):魚鷹談單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論