加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶(hù)
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

關(guān)于 GD32 虛擬串口的兩個(gè) BUG

2023/07/19
2534
閱讀需 5 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

來(lái)源:公眾號(hào)【魚(yú)鷹談單片機(jī)】ID ??:emOsprey

最近魚(yú)鷹在搞調(diào)試器,折騰了好多天終于理解了 MDK 、下載算法、調(diào)試器、MCU 之間的關(guān)系。

簡(jiǎn)單來(lái)說(shuō),就是,調(diào)試器作為 USB 轉(zhuǎn) SWD 協(xié)議的轉(zhuǎn)換工具,MDK 通過(guò) USB 驅(qū)動(dòng)這個(gè)工具,下載算法包含了一些 MCU 內(nèi)部 FLASH 擦除、編程代碼,和普通代碼不同的是,該代碼可以下載在任意位置運(yùn)行。如果需要校驗(yàn),還會(huì)加入 CRC 校驗(yàn)代碼,扇區(qū)檢測(cè)代碼。

MDK 首先通過(guò)調(diào)試器將算法寫(xiě)入內(nèi)部 RAM,然后把需要寫(xiě)入的固件程序?qū)懭?RAM,再由 MDK 控制(通過(guò)調(diào)試器) MCU 執(zhí)行相應(yīng)代碼(擦除或?qū)懭肷葏^(qū)),通過(guò) MCU 的寄存器和設(shè)定軟件斷點(diǎn)得到執(zhí)行結(jié)果,如此來(lái)回搬運(yùn),就可完成固件下載。

說(shuō)起來(lái)簡(jiǎn)單,做起來(lái)很麻煩(調(diào)試器工具功能簡(jiǎn)單,只做協(xié)議轉(zhuǎn)換,如何控制通過(guò) MDK),這里點(diǎn)到為止,有時(shí)間會(huì)好好整理分享一下。

之后準(zhǔn)備 USB 相關(guān)的工作,發(fā)現(xiàn)總是沒(méi)有滿(mǎn)意的 USB CORE 庫(kù),官方的庫(kù)感覺(jué)還不錯(cuò),可惜被封裝了,看不到源碼,放棄。

之前魚(yú)鷹分享過(guò)虛擬串口的代碼,于是下載下來(lái)使用,發(fā)現(xiàn)竟然在 GD32 中用不了,當(dāng)初明明 ST 測(cè)試沒(méi)問(wèn)題的。

還以為是 GD 芯片問(wèn)題,然后使用之前的 USB 雙緩沖讀卡器代碼,發(fā)現(xiàn)沒(méi)有問(wèn)題。

只能在線(xiàn)調(diào)試比較差異,借助邏輯分析儀,總算解決了這兩個(gè) BUG,順利自發(fā)自收。

BUG 1

枚舉失敗。

通過(guò)邏輯分析儀發(fā)現(xiàn),電腦發(fā)送控制幀給 USB 設(shè)備,竟然沒(méi)有任何回應(yīng),即沒(méi)有 NAK,也米有 STALL,更不用說(shuō) ACK 了。

正?;貞?yīng)

無(wú)回應(yīng)

通過(guò)調(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)類(lèi)型外,還要使能接收  DADDR = DADDR_EF | 0;                 /* Enable USB Default Address         */}

很奇怪的是,ST 我以前測(cè)試是沒(méi)問(wèn)題的,可能也是兩者之間的差異吧。。

BUG?2

枚舉成功后,又出現(xiàn)另外一個(gè)問(wèn)題,就是串口只能發(fā)送第一幀數(shù)據(jù),第二次卡死……

經(jīng)過(guò)邏輯分析儀發(fā)現(xiàn),發(fā)送的數(shù)據(jù)會(huì)被 NAK。后來(lái)才發(fā)現(xiàn)下面的語(yǔ)句不滿(mǎn)足,直接沒(méi)有讀 USB 數(shù)據(jù)包,從而沒(méi)有恢復(fù)接收有效狀態(tài),導(dǎo)致串口助手卡死。

這段官方代碼也確實(shí)比較迷,沒(méi)有最大利用緩存空間(最少需要滿(mǎn)一包的空間,但實(shí)際可能不滿(mǎn)一包),不過(guò)按下不表。

那就是第一次收到的數(shù)據(jù)未讀唄,在 main() 函數(shù)里面發(fā)現(xiàn)根本沒(méi)進(jìn)來(lái),發(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;  }    ……?}?

這下串口助手一下子絲滑了,舒服!

 

 

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠(chǎng)商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
7B-25.000MEEQ-T 1 TXC Corporation Parallel - Fundamental Quartz Crystal, 25MHz Nom, SMD, 4 PIN

ECAD模型

下載ECAD模型
$1.26 查看
HCNW3120-000E 1 Agilent Technologies Inc IC Output Optocoupler, 1-Element, 5000V Isolation,
$4.36 查看
CPC1979J 1 Littelfuse Inc Transistor Output SSR, 1-Channel, 2500V Isolation, ROHS COMPLIANT, ISOPLUS264, 4 PIN

ECAD模型

下載ECAD模型
$13.97 查看

相關(guān)推薦

  • STM32移植到GD32(以32的工程為模板簡(jiǎn)單三步完成移植)
    8387
    03/22 13:35 資訊
  • 電子產(chǎn)業(yè)圖譜

    六年開(kāi)發(fā)經(jīng)驗(yàn),豐富的KEIL調(diào)試經(jīng)驗(yàn),STM32使用經(jīng)驗(yàn),C語(yǔ)言運(yùn)用經(jīng)驗(yàn)。