最近魚鷹在搞調試器,折騰了好多天終于理解了 MDK 、下載算法、調試器、MCU 之間的關系。
簡單來說,就是,調試器作為 USB 轉 SWD 協議的轉換工具,MDK 通過 USB 驅動這個工具,下載算法包含了一些 MCU 內部 FLASH 擦除、編程代碼,和普通代碼不同的是,該代碼可以下載在任意位置運行。如果需要校驗,還會加入 CRC 校驗代碼,扇區檢測代碼。
MDK 首先通過調試器將算法寫入內部 RAM,然后把需要寫入的固件程序寫入 RAM,再由 MDK 控制(通過調試器) MCU 執行相應代碼(擦除或寫入扇區),通過 MCU 的寄存器和設定軟件斷點得到執行結果,如此來回搬運,就可完成固件下載。
說起來簡單,做起來很麻煩(調試器工具功能簡單,只做協議轉換,如何控制通過 MDK),這里點到為止,有時間會好好整理分享一下。
之后準備 USB 相關的工作,發現總是沒有滿意的 USB CORE 庫,官方的庫感覺還不錯,可惜被封裝了,看不到源碼,放棄。
之前魚鷹分享過虛擬串口的代碼,于是下載下來使用,發現竟然在 GD32 中用不了,當初明明 ST 測試沒問題的。
還以為是 GD 芯片問題,然后使用之前的 USB 雙緩沖讀卡器代碼,發現沒有問題。
只能在線調試比較差異,借助邏輯分析儀,總算解決了這兩個 BUG,順利自發自收。
BUG 1
枚舉失敗。
通過邏輯分析儀發現,電腦發送控制幀給 USB 設備,竟然沒有任何回應,即沒有 NAK,也米有 STALL,更不用說 ACK 了。
正常回應
無回應
通過調試發現,該端點接收狀態為0,禁用狀態,再參考可用代碼,發現在復位之后,應該設置為接收有效才對。因此修改如下:
void USBD_Reset (void) { ……………… …… …… EPxREG(0)=EP_CONTROL|EP_RX_VALID;// 除了設定端點類型外,還要使能接收 DADDR = DADDR_EF | 0; /* Enable USB Default Address */ }
很奇怪的是,ST 我以前測試是沒問題的,可能也是兩者之間的差異吧。。
BUG2
枚舉成功后,又出現另外一個問題,就是串口只能發送第一幀數據,第二次卡死……
經過邏輯分析儀發現,發送的數據會被 NAK。后來才發現下面的語句不滿足,直接沒有讀 USB 數據包,從而沒有恢復接收有效狀態,導致串口助手卡死。
這段官方代碼也確實比較迷,沒有最大利用緩存空間(最少需要滿一包的空間,但實際可能不滿一包),不過按下不表。
那就是第一次收到的數據未讀唄,在 main() 函數里面發現根本沒進來,發現竟然一直在 USB 中斷執行……
void main() { while(1) { …… if (usb_rx_ch == -1) usb_rx_ch = USBD_CDC_ACM_GetChar(); …… } }
然后看到這個標志一直在,未清除導致。
但很奇怪的事,該代碼在 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; } …… }
這下串口助手一下子絲滑了,舒服!
審核編輯:劉清
-
緩沖器
+關注
關注
6文章
1930瀏覽量
45648 -
RAM
+關注
關注
8文章
1369瀏覽量
115019 -
狀態機
+關注
關注
2文章
492瀏覽量
27649 -
調試器
+關注
關注
1文章
306瀏覽量
23833 -
GD32
+關注
關注
7文章
413瀏覽量
24473
原文標題:關于 GD32 虛擬串口的兩個 BUG
文章出處:【微信號:emOsprey,微信公眾號:魚鷹談單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
什么是GD32
GD32與STM32有何區別
「必看干貨」淺談GD32與STM32之間的區別
GD32 DMA串口通訊DEMO的相關資料推薦
淺析stm32f103&gd32的u***虛擬串口+打印類printer組合設備
GD32替換STM32?這些坑你別踩...
GD32 DMA串口通訊DEMO
![<b class='flag-5'>GD32</b> DMA<b class='flag-5'>串口</b>通訊DEMO](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32f103&gd32的usb虛擬串口,打印類printer組合設備
![stm32f103&<b class='flag-5'>gd32</b>的usb<b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>,打印類printer組合設備](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論