chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

USB之STM32基礎(chǔ)(6)

電子設(shè)計(jì) ? 來源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-10-30 10:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本篇筆記主要介紹 STM32 相關(guān)的知識(shí)點(diǎn),畢竟之后的 CDC 教程是用 STM32 開發(fā)的。

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

不過限于篇幅,魚鷹不會(huì)面面俱到,只介紹和 CDC 相關(guān)的一些東西。

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

其實(shí)理解了前面的一些東西,你會(huì)發(fā)現(xiàn) STM32 中的 USB 知識(shí)和前面的大同小異,畢竟開發(fā)芯片的廠家也是按照 USB 標(biāo)準(zhǔn)來實(shí)現(xiàn)的,不會(huì)差到哪里去。

硬件基礎(chǔ)

首先,STM32F103 使用 PA11(USBDM,D-)和 PA12(USBDP,D+)完成數(shù)據(jù)的收發(fā)。但看過前面章節(jié)的道友應(yīng)該知道,全速 USB 在 D+ 引腳是需要有一個(gè)上拉電阻的,同時(shí)兩根數(shù)據(jù)線需要各自串聯(lián)一個(gè) 22 Ω的電阻。

這就是你需要的硬件基礎(chǔ),如果說你的開發(fā)板有 USB 接口,但是沒有這些條件,那么你的 USB 接口只能用于供電,無法進(jìn)行數(shù)據(jù)傳輸。

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

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

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

軟件基礎(chǔ)

現(xiàn)在看一看 STM32F103 的 USB 有哪些功能

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

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

CRC、NRZI 編解碼,這個(gè)可以讓你不必關(guān)心每一位是什么情況,你只需要處理底層給你的字節(jié)數(shù)據(jù)即可。

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

支持 USB 掛起和恢復(fù)操作,其實(shí)還支持設(shè)備遠(yuǎn)程喚醒操作,即由設(shè)備發(fā)起喚醒請(qǐng)求(比如鼠標(biāo)移動(dòng)后喚醒設(shè)備)。

后面有一個(gè)注意點(diǎn),就是 USB 和 CAN 共用 512 字節(jié)的緩存,也就是說同一時(shí)刻只能有一個(gè)外設(shè)可以工作,當(dāng)然你可以通過軟件在不同時(shí)刻使用不同的外設(shè)。

可以看看 USB 設(shè)備框圖,了解一下 USB 是由哪些結(jié)構(gòu)組成的。

為了實(shí)現(xiàn) USB 通信,有以下基礎(chǔ)步驟需要完成:

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

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

3、打開相應(yīng)中斷(一共有三個(gè)中斷)

低優(yōu)先級(jí)中斷是我們主要關(guān)注的,因?yàn)?USB 枚舉過程就在這個(gè)中斷完成,所以這個(gè)中斷必須開啟,其他兩個(gè)就看需求了。

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

5、之后所有的操作都在低優(yōu)先級(jí)中斷進(jìn)行(包括復(fù)位、枚舉、SOF 檢測等)。

以上步驟具體可以看魚鷹提供的例程實(shí)現(xiàn),不再多說。

USB 寄存器

USB 中有三類寄存器:端點(diǎn)寄存器、通用寄存器、緩沖區(qū)描述表,再加上和描述表對(duì)應(yīng)的緩沖區(qū)(數(shù)據(jù)收發(fā)緩存區(qū),USB 所有的數(shù)據(jù)傳輸都首先要經(jīng)過這里),我們要做的就是在合適的時(shí)候?qū)@些寄存器進(jìn)行相應(yīng)的操作即可。

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

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

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

還有可能寫 1 翻轉(zhuǎn),寫 0 無效,這時(shí)你會(huì)發(fā)現(xiàn)代碼中使用異或(^)來設(shè)置需要的位,非常巧妙。
總之,在學(xué)習(xí) USB 過程中,可以鍛煉你的位操作能力。

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

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

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

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

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

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

根據(jù)需要,依次安排描述表。比如 CDC 有三個(gè)端點(diǎn),前 16 個(gè)字節(jié)安排端點(diǎn) 0,負(fù)責(zé)描述發(fā)送緩存區(qū)的地址和大小,接收緩存區(qū)的地址和大?。ǚ乐菇邮諘r(shí)溢出)

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

按理應(yīng)該像上面分布空間的,但實(shí)際上你會(huì)發(fā)現(xiàn)分布如下:

那么是否可以將端點(diǎn) 0 的緩存地址安排在 0x40006030 位置,而不是 0x40006060 呢,這樣就不會(huì)浪費(fèi)那些空間了。

因?yàn)檫@個(gè)改動(dòng)會(huì)較大,感興趣的可以嘗試一下。

當(dāng) USB 模塊寫入端點(diǎn) 0 的數(shù)據(jù)時(shí),首先根據(jù) USB_BTABLE 的值找到描述表的位置,然后再根據(jù)描述表第一個(gè)表項(xiàng)的 USB_ADDR0_RX 找到接收緩沖區(qū)的地址,最后寫入數(shù)據(jù)(寫入過程中會(huì)判斷是否超出限制,防止破壞其他緩沖區(qū),這個(gè)通過 USB_COUNT0_Rx 判斷),當(dāng)應(yīng)用程序進(jìn)行讀取上述地址的數(shù)據(jù)時(shí),因?yàn)椴捎昧?32 位訪問,所以對(duì) USB_BTABLE 和 USB_ADDR0_RX 偏移地址 x2,這樣就可以找到我們需要的緩存地址,從而讀取到主機(jī)發(fā)給設(shè)備的數(shù)據(jù),然后進(jìn)行相應(yīng)的處理。
設(shè)備發(fā)送同理。

具體實(shí)現(xiàn)可參考魚鷹給出的源代碼。

審核編輯 黃昊宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    8331

    瀏覽量

    280147
  • STM32
    +關(guān)注

    關(guān)注

    2301

    文章

    11096

    瀏覽量

    369995
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32N6 開箱實(shí)驗(yàn):如何快速上手最強(qiáng)大的STM32系列?

    STM32N6是有史以來功能最強(qiáng)大的STM32系列STM32N6嵌入了意法半導(dǎo)體專有的Neural-ART加速器和運(yùn)行頻率為800MHz的ArmCortex-M55內(nèi)核,提供了迄今為止最高
    的頭像 發(fā)表于 09-17 10:37 ?4235次閱讀
    <b class='flag-5'>STM32N6</b> 開箱實(shí)驗(yàn):如何快速上手最強(qiáng)大的<b class='flag-5'>STM32</b>系列?

    CherryUSB +STM32F103C8 example usb cdc device不識(shí)別是怎么回事?

    stm32f103c8t6 配置cdc,使用cubeMX 配置生成xxx_msp.c 為什么 放開 CONFIG_USBDEV_SETUP_LOG_PRINT 發(fā)現(xiàn) usb 中斷 一直未能進(jìn)入 ____usbd_event_ep0_setup_complete_hand
    發(fā)表于 09-10 07:03

    使用USB轉(zhuǎn)TTL串口板和ST-LINK調(diào)試下載器給STM32單片機(jī)下載程序

    本文詳細(xì)介紹如何使用ST-LINK/V2和USB轉(zhuǎn)TTL串口板為STM32單片機(jī)下載程序,包括STM32啟動(dòng)模式、JTAG與SWD接口對(duì)比、驅(qū)動(dòng)安裝及官方軟件STM32ST-LINKU
    的頭像 發(fā)表于 06-20 17:26 ?1466次閱讀
    使用<b class='flag-5'>USB</b>轉(zhuǎn)TTL串口板和ST-LINK調(diào)試下載器給<b class='flag-5'>STM32</b>單片機(jī)下載程序

    STM32F103C6T6 DCAC逆變器原理圖

    STM32F103C6T6 DCAC逆變器原理圖
    發(fā)表于 05-19 17:48 ?2次下載

    stm32f103c8t6主控芯片無人機(jī)原理圖

    stm32f103c8t6主控芯片無人機(jī)原理圖
    發(fā)表于 04-29 17:02 ?2次下載

    stm32哪個(gè)系列芯片支持2個(gè)USB,主設(shè)備,且usb可以支持標(biāo)準(zhǔn)的uvc協(xié)議,哪里可以下載usb開發(fā)庫?

    stm32哪個(gè)系列芯片支持2個(gè)USB,主設(shè)備,且usb可以支持標(biāo)準(zhǔn)的uvc協(xié)議,哪里可以下載usb開發(fā)庫
    發(fā)表于 04-27 08:16

    意法半導(dǎo)體推出STM32WBA6系列MCU新品

    ??????最近,意法半導(dǎo)體(ST)重磅升級(jí)STM32WBA產(chǎn)品系列,推出STM32WBA6系列新品,能夠在單芯片上同時(shí)支持藍(lán)牙低功耗(Bluetooth LE)和IEEE 802.15.4標(biāo)準(zhǔn)的器件。
    的頭像 發(fā)表于 03-21 09:40 ?1552次閱讀
    意法半導(dǎo)體推出<b class='flag-5'>STM32WBA6</b>系列MCU新品

    STM32 USB傳輸?shù)綄?duì)端的時(shí)間是多少?為什么usb會(huì)丟幀?

    目前使用的stm32l452這款芯片,USB2.0,F(xiàn)ull speed設(shè)備,目前通過中斷傳輸1000HZ傳輸imu數(shù)據(jù),目前使用的是PMA 1.想問下大概USB傳輸?shù)綄?duì)端的時(shí)間是多少,目前看imu
    發(fā)表于 03-10 08:02

    stm32f105rct6usb插在電腦上,然后再上電,模擬u盤內(nèi)的文件就會(huì)缺失,這個(gè)是什么情況呢?

    請(qǐng)問一下各位大佬,我使用stm32f105rct6,用USB文件系統(tǒng),先上電,再插上USB,模擬U盤內(nèi)的.csv文件數(shù)量是正確的。但是,我先把usb插在電腦上,然后再上電,模擬u盤內(nèi)的
    發(fā)表于 03-07 07:57

    STM32H533的USB沒有啟動(dòng)起來是怎么回事?

    有關(guān)USB配置,同樣的配置在STM32H503上就能正常運(yùn)行,可以通過USB助手發(fā)現(xiàn),在STM32H533就沒有任何反應(yīng),通過STM32Cu
    發(fā)表于 03-07 06:44

    《工程師指南 USB Type-C》電子書免費(fèi)下載!

    在當(dāng)今快速發(fā)展的科技時(shí)代,USB Type-C 技術(shù)正迅速成為電子設(shè)備連接的主流標(biāo)準(zhǔn)。無論您是硬件工程師、電子愛好者,還是對(duì)前沿技術(shù)充滿好奇的科技達(dá)人,這份《工程師指南 USB Type-C
    的頭像 發(fā)表于 02-06 12:06 ?1249次閱讀
    《工程師指南<b class='flag-5'>之</b> <b class='flag-5'>USB</b> Type-C》電子書免費(fèi)下載!

    STM32G474RCT6 STM32G0B1VET6 微控制器 IC MCU 32BIT FLASH LQFP

    STM32G474RCT6 混合信號(hào)微控制器 (MCU) 結(jié)合了運(yùn)行頻率為170MHz的32位Arm? Cortex?-M4內(nèi)核(帶FPU和DSP指令)。另外還結(jié)合了3種不同的硬件加速器:ART
    發(fā)表于 12-31 11:59

    STM32WB55RG開發(fā)(2)----STM32CubeProgrammer燒錄

    程序接口(UART、USB DFU、I2C、SPI和CAN)讀取、寫入及驗(yàn)證器件內(nèi)存。 STM32CubeProgrammer的功能廣泛,可以對(duì)STM32內(nèi)部存儲(chǔ)器(如Flash、RAM和OTP)以及外部存儲(chǔ)器進(jìn)行編程。
    的頭像 發(fā)表于 12-16 15:52 ?2694次閱讀
    <b class='flag-5'>STM32</b>WB55RG開發(fā)(2)----<b class='flag-5'>STM32</b>CubeProgrammer燒錄

    STM32H503開發(fā)(2)----STM32CubeProgrammer燒錄

    STM32CubeProgrammer (STM32CubeProg) 是一款用于編程STM32產(chǎn)品的全功能多操作系統(tǒng)軟件工具。 它提供了一個(gè)易用高效的環(huán)境,通過調(diào)試接口(JTAG和SWD)和自舉程序接口(UART、
    的頭像 發(fā)表于 11-28 09:25 ?3397次閱讀
    <b class='flag-5'>STM32</b>H503開發(fā)(2)----<b class='flag-5'>STM32</b>CubeProgrammer燒錄

    stm32 GPIO中斷配置教程

    理解GPIO中斷 在STM32中,GPIO中斷允許微控制器在引腳狀態(tài)變化時(shí)(如從低到高或從高到低)立即響應(yīng),而無需不斷輪詢引腳狀態(tài)。這對(duì)于處理外部事件(如按鈕按下、傳感器信號(hào)等)非常有用。 2. 硬件準(zhǔn)備 STM32開發(fā)板(如STM3
    的頭像 發(fā)表于 11-19 15:53 ?4135次閱讀