色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

USB之STM32基礎(6)

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-10-30 10:31 ? 次閱讀

本篇筆記主要介紹 STM32 相關的知識點,畢竟之后的 CDC 教程是用 STM32 開發的。

為了寫這一篇,魚鷹把 STM32 中文參考手冊 USB 相關的從頭到尾看了一遍,雖然以前就已經看過了,但這次看,收獲又是不同。

不過限于篇幅,魚鷹不會面面俱到,只介紹和 CDC 相關的一些東西。

要完成 USB 模擬串口(CDC)的實驗,STM32 手冊是必須細細閱讀的,不然代碼里面很多操作你是無法看懂的。

其實理解了前面的一些東西,你會發現 STM32 中的 USB 知識和前面的大同小異,畢竟開發芯片的廠家也是按照 USB 標準來實現的,不會差到哪里去。

硬件基礎

首先,STM32F103 使用 PA11(USBDM,D-)和 PA12(USBDP,D+)完成數據的收發。但看過前面章節的道友應該知道,全速 USB 在 D+ 引腳是需要有一個上拉電阻的,同時兩根數據線需要各自串聯一個 22 Ω的電阻。

這就是你需要的硬件基礎,如果說你的開發板有 USB 接口,但是沒有這些條件,那么你的 USB 接口只能用于供電,無法進行數據傳輸。

當然,STM32F103 的速度為全速 12 Mbit,換算成字節為 1.5 MB,除去 USB 協議的開銷(令牌、打包等),大概能達到 1 MB/s 速度。

魚鷹在測試給各位道友的 CDC 例程發現只能達到 100 KB 左右,原以為是主機沒有及時發送令牌包導致帶寬很低,后來發現 USB 設備發出的數據包只有幾個字節,而不是最大包 64B,才知道是發送的數據太少了,后來增加發送的數據量(一次往緩沖多寫幾百個字節),帶寬達到了 400~700KB,但離 1MB 還差了點。

通過邏輯分析儀查看才知道,主機發送 IN 令牌包時,設備有可能還沒準備好,浪費了帶寬,不過在看 STM32 資料中發現,對于批量傳輸(CDC 使用批量傳輸),可以使用雙緩沖提高傳輸量,估計用了雙緩沖,傳輸速率能達到 1MB/s,比串口的 115200 Bit/s 快的多,也穩定的多,畢竟人家可是自帶了 CRC 校驗和數據重傳功能的。

軟件基礎

現在看一看 STM32F103 的 USB 有哪些功能

第一點,支持 USB2.0 全速,而不是 2.0 高速 480Mbit/s。

有 1~8 個(雙向)端點,這是能完成組合設備的基礎,按照 CDC + DAP 組合設備來說,一共需要 1(控制傳輸)+ 2(CDC)+1(HID) = 4 個端點的,更不要說再模擬一個 U 盤了。

CRC、NRZI 編解碼,這個可以讓你不必關心每一位是什么情況,你只需要處理底層給你的字節數據即可。

支持雙緩沖,最大程度的利用 USB 的帶寬。

支持 USB 掛起和恢復操作,其實還支持設備遠程喚醒操作,即由設備發起喚醒請求(比如鼠標移動后喚醒設備)。

后面有一個注意點,就是 USB 和 CAN 共用 512 字節的緩存,也就是說同一時刻只能有一個外設可以工作,當然你可以通過軟件在不同時刻使用不同的外設。

可以看看 USB 設備框圖,了解一下 USB 是由哪些結構組成的。

為了實現 USB 通信,有以下基礎步驟需要完成:

1、打開 Port A 的外設時鐘(PA11 和 PA12)

2、打開 USB 時鐘(其實還需要設置 USB 時鐘頻率,一般 SystemInit 會替你完成,當 USB 時鐘打開后, PA11 和 PA12 引腳由 USB 接管,不歸 GPIO 控制)。

3、打開相應中斷(一共有三個中斷)

低優先級中斷是我們主要關注的,因為 USB 枚舉過程就在這個中斷完成,所以這個中斷必須開啟,其他兩個就看需求了。

4、配置 USB 寄存器,使 USB 可以正常工作。

5、之后所有的操作都在低優先級中斷進行(包括復位、枚舉、SOF 檢測等)。

以上步驟具體可以看魚鷹提供的例程實現,不再多說。

USB 寄存器

USB 中有三類寄存器:端點寄存器、通用寄存器、緩沖區描述表,再加上和描述表對應的緩沖區(數據收發緩存區,USB 所有的數據傳輸都首先要經過這里),我們要做的就是在合適的時候對這些寄存器進行相應的操作即可。

地址 0x 0x4000 5C00 開始為端點寄存器,因為有 8 個(雙向)端點,所以有 8 個寄存器管理。
之后的寄存器為通用寄存器,用于管理整個 USB 模塊的,具體可查看參考手冊。

以上寄存器有些位很特殊,比如可能寫 0 有效,寫 1 無效,所以有如下要求:

所以以往的讀 - 改 - 寫不能在這里使用,不然你這邊讀回了 0,但是硬件修改了變成 1,如果往回寫 0 ,那么就把硬件設置的 1 清除了,肯定會有影響,所以針對這種位,需要對不操作的位設置為 1 ,這樣就不會意外修改了。

還有可能寫 1 翻轉,寫 0 無效,這時你會發現代碼中使用異或(^)來設置需要的位,非常巧妙。
總之,在學習 USB 過程中,可以鍛煉你的位操作能力。

上述兩類寄存器在參考手冊其實是比較詳盡的,但緩沖區描述表(描述表的作用就是描述端點發送和接收緩存區的地址和大?。┚惋@得晦澀難懂了,所以這里詳細說一下緩沖區描述表(以下表述可能有問題,需要各位自行驗證)。

首先,描述表的地址在 0x4000 6000,也就是說前面所說的 512 Byte 的基地址。但是按照參考手冊中的描述來看,這個空間大小應該是 512 Byte * 2,這是因為 USB 模塊尋址采用 16 位尋址的,而應用程序使用 32 位尋址,也就是說,按照我們的軟件角度,空間分布應該是這樣的:

低地址的兩個字節可以被我們訪問(有顏色部分),高地址的兩個字節不可訪問(但是按照雙緩沖描述來看,好像可以訪問到,以后在驗證一下)。

所以地址范圍應該有 1 KB 的空間,但只有一半是可以使用的。

還有一點就是這塊空間不僅用于存放 USB 傳輸的數據,還用來存放緩存區描述表,這個緩沖區描述表可以在這塊空間的任何一個位置,只要滿足 8 字節對齊即可,畢竟一個端點需要 16 字節記錄(這里可能會感到疑惑,為什么一個端點 16 字節,但卻是 8 字節對齊,這就是 16 位 和 32 訪問的區別,在 USB 寄存器中,USB 模塊通過 16 位訪問,所以寄存器里面的值都是按照 16 位來保存偏移的)。

這個表的基地址存放在 USB_BTABLE 寄存器中,一般設置為 0,表示這個表放在上述空間的開始處。

根據需要,依次安排描述表。比如 CDC 有三個端點,前 16 個字節安排端點 0,負責描述發送緩存區的地址和大小,接收緩存區的地址和大?。ǚ乐菇邮諘r溢出)

端點 1 和端點 2 供 CDC 使用,占用 32 字節。所以前 48 字節被描述表占用了,剩下的(1024 – 48)/ 2 就是數據緩沖區了。比如將端點 0 的發送緩沖區地址指向 0x18(相對地址 0x4000 6000 偏移,16 位訪問),大小為 64 字節,端點 0 的接收緩存區指向 0x58(寄存器 USB_ADDR0_RX 寫入的值,16 位訪問),大小為 64 字節(注意這里的值為 16 位尋址,即 USB 模塊的尋址,和應用層 32 位尋址不同,兩者之間需要轉化)。

按理應該像上面分布空間的,但實際上你會發現分布如下:

那么是否可以將端點 0 的緩存地址安排在 0x40006030 位置,而不是 0x40006060 呢,這樣就不會浪費那些空間了。

因為這個改動會較大,感興趣的可以嘗試一下。

當 USB 模塊寫入端點 0 的數據時,首先根據 USB_BTABLE 的值找到描述表的位置,然后再根據描述表第一個表項的 USB_ADDR0_RX 找到接收緩沖區的地址,最后寫入數據(寫入過程中會判斷是否超出限制,防止破壞其他緩沖區,這個通過 USB_COUNT0_Rx 判斷),當應用程序進行讀取上述地址的數據時,因為采用了 32 位訪問,所以對 USB_BTABLE 和 USB_ADDR0_RX 偏移地址 x2,這樣就可以找到我們需要的緩存地址,從而讀取到主機發給設備的數據,然后進行相應的處理。
設備發送同理。

具體實現可參考魚鷹給出的源代碼。

審核編輯 黃昊宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • usb
    usb
    +關注

    關注

    60

    文章

    7952

    瀏覽量

    264938
  • STM32
    +關注

    關注

    2270

    文章

    10904

    瀏覽量

    356423
收藏 人收藏

    評論

    相關推薦

    stm32h743iit6使用usb怎么配置dma搬運?

    目前用的是stm32h743iit6。在配置usb的界面看到了 但是生成的代碼里面沒有看到類似dma的字眼。是我配錯了嗎?
    發表于 07-02 07:52

    STM32G474RET6直接用USB燒錄程序不行,需要做些什么才能成功燒錄?

    申請了一塊STM32G474RET6的MCU,到手直接用USB燒錄程序不行,需要做些什么才能成功燒錄?
    發表于 05-29 06:08

    STM32F103C8T6在bootloader使用了USB中斷后,app區再使用usb中斷,直接不會跳轉到app區,怎么解決?

    主控是STM32F103C8T6,程序是我移植的之前寫bootloader和APP的代碼,是使用的串口IAP(在串口上使用一點問題沒有)。我現在遇到的情況是在boot loader使用了USB中斷
    發表于 05-21 08:00

    STM32USB和多個串口,如何實現USB轉多串口?

    STM32USB接口和多個UART,能否用STM32實現USB轉多個串口呢?關鍵問題在于如何實現PC側的USB驅動?知道的大俠們給個思路吧
    發表于 05-17 08:13

    STM32F107VCT6使用USB HOST OTG掛載U盤連續讀寫文件錯誤是怎么回事?如何解決?

    最近研究STM32F107VCT6USB HOST OTG驅動U盤,目前可以正確識別到U盤和掛載文件系統,但是聯系讀寫U盤內文件時會出現錯誤,導致沒法繼續讀取文件內容
    發表于 04-29 08:28

    使用STM32F429IIT6做開發時,USB枚舉成功但是打開失敗是怎么回事?

    您好,在使用STM32F429IIT6做開發時,總是出現USB串口設備能夠識別到,但是用串口助手打開時提示,串口被占用,我們通過增加堆棧大小的方法,有時可以解決這個問題,但是后續的調試中又會重新出現,堆??臻g有限,不能一直以增加堆棧的方式解決,請問這個有其他解決的辦法嗎?
    發表于 04-28 07:34

    STm32cubeMX生成STM32F412RGT6-USB_CDC工程初始化失敗的原因?

    請教用STm32cubeMX生成STM32F412RGT6-USB_CDC工程初始化失敗
    發表于 04-28 06:56

    stm32f730rbt6 cubemx配置內部USB HS PHY無法運行的原因?

    stm32f730rbt6 cubemx 配置 內部 USB HS PHY無法運行,改成FS正常的,說明芯片正常。應該是發生的代碼有問題,請指點方向。
    發表于 04-19 07:29

    STM32F407VET6USB主機,USB3300 HOST模式檢測不到設備插入是什么原因?

    我用STM32F407VET6USB主機,外接USB3300,代碼是STM32CubeMX生成,但是運行時,設備檢測不到U盤等外設的插入,不知道是不是硬件的問題,原理圖附上,有沒有懂
    發表于 04-02 06:57

    STM32042F6P6 USB接口被靜電損壞了怎么解決?

    STM32042F6P6 USB接口被靜電損壞,USB DP 和DM 已經接了 ESD器件USBLC6-2SC6,而且DP 和DM不能串接電阻,請問有更好的方法嗎?謝謝
    發表于 03-28 06:24

    使用STM32F103RCT6開發USB設備,STM32CubeMx生成代碼遇到的問題求解

    大家好,最近在使用STM32F103RCT6開發USB設備,使用的是STM32CubeMx生成的代碼,但查看代碼發現一個問題,HAL_PCD_MspInit函數中開啟了USB外設時鐘,
    發表于 03-21 08:30

    STM32F407ZGT6怎么用USB OTG口來接收模塊傳出的數據?

    STM32F407ZGT6怎么用USB OTG口來接收模塊傳出的數據,本人純小白求大神賜教
    發表于 03-15 08:28

    STM32F103C8T6在boot loader使用USB中斷后,app區再使用usb中斷不會跳轉到app區的原因?

    主控是STM32F103C8T6,程序是我移植的之前寫bootloader和APP的代碼,是使用的串口IAP(在串口上使用一點問題沒有)。我現在遇到的情況是在boot loader使用了USB中斷
    發表于 03-11 07:10

    STM32F302C8T6 USB斷開連接代碼停止運行是怎么回事?如何解決?

    STM32F302C8T6 USB斷開連接代碼停止運行
    發表于 03-08 07:34

    USB轉TTL線怎么把程序燒寫到stm32f103C8T6

    USB轉TTL線怎么把程序燒寫到stm32f103C8T6中? 將程序燒寫到STM32F103C8T6芯片中需要使用USB轉TTL線連接計算機和開發板,并使用適當的軟件來進行編程和燒
    的頭像 發表于 01-31 15:46 ?7341次閱讀
    主站蜘蛛池模板: 欧洲内射XXX高清| 一抽一出BGM免费3分钟| 99久久久免费精品免费| 女侠含泪巨臀迎合79| 成人精品视频网站| 小草影院免费| 久久强奷乱码老熟女| x69老师x日本| 亚洲国产在线观看免费视频| 久久是热频国产在线| xiah俊秀| 亚洲欧美精品无码一区二在线| 久久综合亚洲色hezyo| 被肉日常np高h| 亚洲日韩欧美国产中文在线| 男人桶女人j的视频在线观看 | 久久不射电影网| a在线观看免费视频| 午夜福利理论片高清在线| 旧里番ovaの催○セイ活指导| 俄罗斯1819y0u| 曰曰夜夜在线影院视| 少妇两个奶头喷出奶水了怎么办 | 国产精品九九久久| 最近日本字幕MV免费观看在线| 日本三区四区免费高清不卡| 狠狠色在在线视频观看| YELLOW在线观看高清视频免费| 羞羞在线观看| 人人草影院| 老少配xxxxx欧美| 国产亚洲精品久久精品录音| ppypp日本欧美一区二区| 亚洲欧美日韩人成| 三级网站视频| 女王羞辱丨vk| 久久精品电影| 国产女人视频免费观看| YELLOW视频在线观看大全| 中国比基尼美女| 亚洲国产精品自在自线观看 |