那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何調試GD32虛擬串口的兩個BUG?

魚鷹談單片機 ? 來源:魚鷹談單片機 ? 2023-07-18 17:40 ? 次閱讀

最近魚鷹在搞調試器,折騰了好多天終于理解了 MDK 、下載算法、調試器、MCU 之間的關系。

簡單來說,就是,調試器作為 USB 轉 SWD 協議的轉換工具,MDK 通過 USB 驅動這個工具,下載算法包含了一些 MCU 內部 FLASH 擦除、編程代碼,和普通代碼不同的是,該代碼可以下載在任意位置運行。如果需要校驗,還會加入 CRC 校驗代碼,扇區檢測代碼。

MDK 首先通過調試器將算法寫入內部 RAM,然后把需要寫入的固件程序寫入 RAM,再由 MDK 控制(通過調試器) MCU 執行相應代碼(擦除或寫入扇區),通過 MCU 的寄存器和設定軟件斷點得到執行結果,如此來回搬運,就可完成固件下載。

說起來簡單,做起來很麻煩(調試器工具功能簡單,只做協議轉換,如何控制通過 MDK),這里點到為止,有時間會好好整理分享一下。

之后準備 USB 相關的工作,發現總是沒有滿意的 USB CORE 庫,官方的庫感覺還不錯,可惜被封裝了,看不到源碼,放棄。

之前魚鷹分享過虛擬串口的代碼,于是下載下來使用,發現竟然在 GD32 中用不了,當初明明 ST 測試沒問題的。

還以為是 GD 芯片問題,然后使用之前的 USB 雙緩沖讀卡器代碼,發現沒有問題。

只能在線調試比較差異,借助邏輯分析儀,總算解決了這兩個 BUG,順利自發自收。

cb537256-254e-11ee-962d-dac502259ad0.png

BUG 1

枚舉失敗。

通過邏輯分析儀發現,電腦發送控制幀給 USB 設備,竟然沒有任何回應,即沒有 NAK,也米有 STALL,更不用說 ACK 了。

cb75ba14-254e-11ee-962d-dac502259ad0.png

正常回應

cb8f9236-254e-11ee-962d-dac502259ad0.png

無回應

通過調試發現,該端點接收狀態為0,禁用狀態,再參考可用代碼,發現在復位之后,應該設置為接收有效才對。因此修改如下:

void USBD_Reset (void)
{
………………
……
  ……
EPxREG(0)=EP_CONTROL|EP_RX_VALID;// 除了設定端點類型外,還要使能接收
  DADDR = DADDR_EF | 0;                 /* Enable USB Default Address         */
}

很奇怪的是,ST 我以前測試是沒問題的,可能也是兩者之間的差異吧。。

BUG2

枚舉成功后,又出現另外一個問題,就是串口只能發送第一幀數據,第二次卡死……

經過邏輯分析儀發現,發送的數據會被 NAK。后來才發現下面的語句不滿足,直接沒有讀 USB 數據包,從而沒有恢復接收有效狀態,導致串口助手卡死。

cbad0dfc-254e-11ee-962d-dac502259ad0.png

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

那就是第一次收到的數據未讀唄,在 main() 函數里面發現根本沒進來,發現竟然一直在 USB 中斷執行……

void main()
 {
   while(1)
   {
    ……
     if (usb_rx_ch == -1)
            usb_rx_ch = USBD_CDC_ACM_GetChar();
    ……  
   }
}

然后看到這個標志一直在,未清除導致。

cbfbf354-254e-11ee-962d-dac502259ad0.png

但很奇怪的事,該代碼在 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
    RAM
    +關注

    關注

    8

    文章

    1369

    瀏覽量

    115019
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27649
  • 調試器
    +關注

    關注

    1

    文章

    306

    瀏覽量

    23833
  • GD32
    +關注

    關注

    7

    文章

    413

    瀏覽量

    24473

原文標題:關于 GD32 虛擬串口的兩個 BUG

文章出處:【微信號:emOsprey,微信公眾號:魚鷹談單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    什么是GD32

    是不同的產品,不可能所有東西都沿用STM32,有些自主開發的東西還是有區別的。相同的地方我們就不說了,下面我給大家講一下不同的地方。二、區別1、內核GD32采用二代的M3內核,STM32主要采用一代M3內核,下圖是ARM公司的M3內核勘誤表,GD使用的內核只有752419
    發表于 08-12 07:46

    GD32與STM32有何區別

    所有東西都沿用STM32,有些自主開發的東西還是有區別的。相同的地方我們就不說了,下面我給大家講一下不同的地方。二、區別1、內核GD32采用二代的M3內核,STM32主要采用一代M3內核,下圖是ARM公司的M3內核勘誤表,GD使用的內核只有752419這一
    發表于 08-13 07:21

    「必看干貨」淺談GD32與STM32之間的區別

    GD32與STM32的啟動時間存在差異,為了讓GD32 MCU更準確復位(不修改可能無法復位)。12.串口通信不同點: GD32在連續發送數據的時候每
    發表于 09-26 14:28

    GD32 DMA串口通訊DEMO的相關資料推薦

    GD32 DMA串口通訊GD32 USART0 DMA發送與接收不定長數據GD32E230簡介GD32E230采用DMA進行
    發表于 12-10 06:26

    淺析stm32f103&gd32的u***虛擬串口+打印類printer組合設備

    stm32f103&gd32的u***虛擬串口+打印類printer組合設備@TOCstm32f103&gd32的u***虛擬
    發表于 01-26 06:27

    GD32串口回環的設置解析

    GD32串口IO該怎樣去設置呢?GD32串口接收該怎樣去設置呢?
    發表于 02-28 06:33

    GD32替換STM32?這些坑你別踩...

    STM32還是要高的。6、串口GD在連續發送數據的時候每兩個字節之間會有一Bit的Idle,而STM32沒有,如下圖。GD
    發表于 03-31 10:51

    兩個實用的串口調試助手

    電子發燒友網站提供《兩個實用的串口調試助手.zip》資料免費下載
    發表于 07-22 15:22 ?8次下載

    虛擬串口VSPD

    虛擬串口,對于程序調試很有用,可以建立兩個互聯的虛擬串口調
    發表于 01-08 12:03 ?46次下載

    GD32 DMA串口通訊DEMO

    GD32 DMA串口通訊GD32 USART0 DMA發送與接收不定長數據GD32E230簡介GD32E230采用DMA進行
    發表于 11-26 19:36 ?74次下載
    <b class='flag-5'>GD32</b> DMA<b class='flag-5'>串口</b>通訊DEMO

    stm32f103&gd32的usb虛擬串口,打印類printer組合設備

    stm32f103&gd32的usb虛擬串口+打印類printer組合設備@TOCstm32f103&gd32的usb虛擬
    發表于 12-02 16:06 ?55次下載
    stm32f103&<b class='flag-5'>gd32</b>的usb<b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>,打印類printer組合設備

    關于GD32虛擬串口兩個BUG

    最近在搞調試器,折騰了好多天,終于理解了MDK、下載算法、調試器、MCU之間的關系。
    的頭像 發表于 07-25 09:55 ?1669次閱讀
    關于<b class='flag-5'>GD32</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>的<b class='flag-5'>兩個</b><b class='flag-5'>BUG</b>

    GD32和AT32哪個好?

    創科技(Atmel的中國合資公司)開發。這種型號都具有自己的特點和優缺點,選擇哪一更好取決于你的具體需求。 GD32GD32是GigaDevice Semiconductor推
    的頭像 發表于 08-16 11:32 ?2637次閱讀

    GD32與STM32兼容嗎?

    GD32與STM32兼容嗎? GD32與STM32是兩個不同的微控制器系列,是由兩個不同的公司設計和生產的。GD32系列是由國內的長沙國芯微
    的頭像 發表于 08-16 11:32 ?3038次閱讀

    GD32 串口接受異常的幾個原因

    前面我們介紹過GD32 485發送時出現異常的最常見原因,有小伙伴反饋想要知道GD32 串口接受異常的可能原因,今天我們就來安排。
    的頭像 發表于 01-18 09:57 ?4407次閱讀
    <b class='flag-5'>GD32</b> <b class='flag-5'>串口</b>接受異常的幾個原因
    卡迪拉娱乐| 大发888网页登录帐号| 百家乐娱乐分析软件v| 德州百家乐21点桌| 世界顶级赌场酒店| 云顶国际娱乐网| 百家乐官网真人视屏游戏| 百家乐官网汝河路| 段风水24宿| 大世界百家乐娱乐城| 百家乐免费注册| 网球比赛比分直播| 大发百家乐官网游戏| 至尊百家乐官网吕文婉| 属羊的和属猪的做生意| 自贡百家乐赌场| 1368棋牌游戏平台| 澳门百家乐官网上下限| 太子百家乐官网的玩法技巧和规则 | 百家乐官网桌子定制| 百家乐大西洋| 太阳城网址| 百家乐官网赌场代理荐| 百家乐赢钱公式冯耕| 大发888新址 | 大发888游戏出纳| 汤阴县| 试玩百家乐官网的玩法技巧和规则| 澳门百家乐现场真人版| 大发888真钱注册| 澳门百家乐官网秘积| 大三巴娱乐城开户| 网络百家乐官网公式打法| 哪个百家乐技巧平台信誉好| 1737棋牌游戏中心| 百家乐官网赌场公司| 七胜百家乐赌场娱乐网规则 | 太阳城百家乐网址--| 新利国际开户| 百家乐官网园首选去澳| 网络百家乐赌博视频|