娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年11月05日(星期二)

正在發生

2020年11月05日 | 使用STM32的USB模塊中后對USB緩沖區的認識

發布者:平和思緒 來源: eefocus關鍵字:STM32  USB模塊  USB緩沖區 手機看文章 掃描二維碼
隨時隨地手機看文章

最近在使用STM32的USB模塊開發個項目,還以為挺簡單,結果搞了快兩天才把USB的包緩沖區的訪問搞定,在此做個小總結吧。


STM32的USB模塊包緩沖區有512B,但是在STM32的參考手冊中的存儲器映像中卻表明0x40006000-0x400063ff,整整多了512B,怎么會這樣呢,同時在嘗試著編程時也遇到了一個問題:


在usb_core.c文件的Setup0_Process(void)這個函數中,有這么一段:


uint16_t offset = 1; 

if (pInformation->ControlState != PAUSE)

  {

    pInformation->USBbmRequestType = *pBuf.b++; /* bmRequestType */

    pInformation->USBbRequest = *pBuf.b++; /* bRequest */

    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */

    pInformation->USBwValue = ByteSwap(*pBuf.w++); /* wValue */

    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */

    pInformation->USBwIndex  = ByteSwap(*pBuf.w++); /* wIndex */

    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */

    pInformation->USBwLength = *pBuf.w; /* wLength */

  }  


這其中又不太明白為什么需要pBuf.w += offset;而且后面的解釋也不太懂 /* word not accessed because of 32 bits addressing */

,我于是在這段之前加入調試以顯示收到什么數

        #ifdef DEBUG

        UARTSend_String("***  端點0收到SETUP數據  ***rn");

        for(offset=0;offset<16;offset++)

        {

                UARTSend_Hex(*pBuf.b++);

        }

        #endif

結果串口調試顯示如下:

***  USB總線復位  ***

***  USB總線CTR置位  ***

***  進入端點0  ***

***  端點0收到SETUP包  ***

***  端點0收到SETUP數據  ***

0x80 0x06 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x00


本來應該顯示0x80 0x06 0x00 0x01 0x00 0x000x40 0x00才對,不太明白怎么0x80 0x06和0x00 0x01 后面多了兩個 0x00 ,難道USB模塊還會將收到的數據跳著放嗎?


 后來反復看參考手冊,問了些人,才知道原來STM32的USB緩沖區是一個雙端口的RAM,CPU一端需要使用32位方式訪問,但USB模塊一端使用16位方式訪問。也就是說每個USB模塊中的地址*2才能對應到控制器中的實際地址,這樣每四個字節地址空間后兩個字節地址空間是空的。所以上面串口調試顯示的數據每正確兩個字節就會多出兩個字節的0x00。


這里也對STM32的USB庫函數中對緩沖區的操作函數做個說明:


在usb_men.c文件有這么一個函數


void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)


  uint32_t n = (wNBytes + 1) >> 1;/* /2*/

  uint32_t i;

  uint32_t *pdwVal;

  pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr);

  for (i = n; i != 0; i--)

  {

    *(uint16_t*)pbUsrBuf++ = *pdwVal++;

    pbUsrBuf++;

  }


它的作用是將緩沖區中的數據拷貝到你所定義的uint8_t Receive_Buffer[];數組中。其它地方都好理解,這里說說


  pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr);

  for (i = n; i != 0; i--)

  {

    *(uint16_t*)pbUsrBuf++ = *pdwVal++;

    pbUsrBuf++;

  }


首先是pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr);這里wPMABufAddr * 2之所以要*2就是前面所述的USB模塊中的地址*2才能對應到控制器中的實際地址,在取得對應端點的緩沖區首地址后,將其(uint32_t*)強制指向uint32_t型,這樣每次*pdwVal++,pdwVal的地址都增加4個字節,并且每次都會有四個字節的數據讀出。


在for循環中,*(uint16_t*)pbUsrBuf++ = *pdwVal++;這句重點說說,++與指針*同優先級,結合順序為至右向左結合,因此相當于*((uint16_t*)pbUsrBuf++),先*(uint16_t*)pbUsrBuf賦值只取*pdwVal++的32位數據的前16位,然后再將pbUsrBuf加上1個字節。到這里,前面定義的uint8_tReceive_Buffer[];數組中就有兩個數組變量被賦值了,但這時地址還指增加一個字節,因此還需要pbUsrBuf++;讓其指向Receive_Buffer[];的下下個數組變量。一次循環,知道讀出所有數據。


關鍵字:STM32  USB模塊  USB緩沖區 引用地址:使用STM32的USB模塊中后對USB緩沖區的認識

上一篇:stm32 usb數據緩沖區疑問
下一篇:關于stm32的USB學習筆記之USB_HW.c

推薦閱讀

1、業界|服務機器人: 日本最有價值的科技創業公司稱,5年內“每個人都有機器人據彭博社報道,日本最有價值的科技創業公司Preferred Networks的創始人西川徹(Toru Nishikawa)說“我們希望在五年內將這些機器人推向市場并看到它們被使用,”Nishikawa 也曾告訴日經新聞。“十年太久不能等了。”今年在日本消費電子展Ceatec上,Preferred Networks展...
  《憲章報》報道,10月31日,國家電力公司(NEPCO)和日本國際協力機構(JICA)簽署項協議,合作進行電力部門技術研究,特別是在電池設備的儲能技術領域,以提高電網的效率和可靠性。   根據協議,日本國際協力機構將通過聯合任務組向約旦電力部門提供技術援助。國家電力公司總經理表示,該協議將支持國家電力公司增強可再生能源項目運營能力,并...
昨天晚上,國產大眾 ID.4 正式亮相,這臺 MEB 要走量的車型,將同時一汽 - 大眾和上汽大眾分別生產,目前在準備拉量的過程,預計 2021 年上市發售,第一季度交付。很重要的地方在于,這個定價從之前的預期下處在一個相對合理的范疇,打出來 25 萬以內的價格。 圖 1 ID.4 CROZZ 的價格 01、不同的版本配置和大眾的核心賣點在 MEB 的海外版...
1、LCD控制器打開S3C2440數據手冊可以看到LCD控制器硬件組成框圖如下2、LCD時序圖對此圖做簡單描述:LCD控制器主要由REGBANK,LCDCDMA,VIDPRCS,TIMEGEN等寄存器組成,如果不是用的三星的LCD,LPC3600和LCC3600就不用管它,它們專門為三星的LCD設計的。REGBANK由17個可編程的寄存器和一個256X16調色板內存組成,他們用來配置LCD控制器LCDCDMA是一個專用的...

史海拾趣

問答坊 | AI 解惑

網絡攝像機各方面問題解答

關鍵字:網絡攝像機 1.什么是網絡攝像機?   答:在裝有網絡攝像機的遠處通過因特網進行遠程監視的網絡統合管理、儲存影像。是將網絡服務器、控制軟件( TCP/UDP)和電子郵件等功能集于一體的網絡設備。 2.網絡攝像機與普通的可視 ...…

查看全部問答∨

榨干你的示波器——連載2(轉帖)

本文轉自 越測越開心 的博客,其原文地址如下: http://forum.eet-cn.com/BLOG_ARTICLE_2670.HTM 本系列博文由我們的老用戶H3C北京公司常羽飛特別供稿 (2)讓我一眼看穿你的心肝脾肺腎你準備測一個信號,這個信號很重要,你想對它有個全面 ...…

查看全部問答∨

關于samba配置的問題

目前移植samba到mips中,現在用smbclient已經可以看到windows中的共享的目錄,但是用smbmount去將目錄掛在到系統中時,提示沒有目錄,具體信息如下: # smbclient -L //192.168.1.188 load_client_codepage: filename /usr/samba/lib/codepages/c ...…

查看全部問答∨

用pci插槽擴展出來的并口能否用于單片機試驗版的下載

用pci插槽擴展出來的并口能否用于單片機試驗版的下載,如題! 買了一塊單片機試驗版,89s52,使用的是并口的下載線,可是主板上沒有并口,欲買一塊擴展卡,不知是否可行…

查看全部問答∨

急急急!!!!!!!!!!!ISP不能讀取ID

我手里有個周立功2132的arm7板子,今天做GPIO輸出實驗-單路LCD控制,用的是LPC2000 Flash Utility2.2.1(philips),但是不能讀ID,請問是怎么回事?我是菜鳥,請大家告訴以下!!!!!!…

查看全部問答∨

LED顯示屏亮度控制方法

有兩種控制LED亮度的方法.一種是改變流過LED的電流,一般LED管允許連續工作電流在20毫安左右,除了紅色LED有飽和現象外,其它LED亮度基本上與流過的電流成比例;另一種方法是利用人眼的視覺惰性,用脈寬調制方法來實現灰度控制,也就是周期性改變光脈沖寬 ...…

查看全部問答∨

LCD顯示偶爾偏移的問題

2440的板,一般開機后顯示都很正常,但偶爾開機后,顯示會整體向上或向下偏移個20-50行左右.我們的產品要經過高溫老化,在50.c的爐里跑兩天,這個時候最容易發生這情況。 請問有遇到過同樣情況的兄弟嗎? 這個是因為我驅動參數設置的不好嗎?還是 ...…

查看全部問答∨

提前曝光,自制STM8S的C編譯器

目前只完成了賦值語句以及遞增、遞減語句功能。 源程序1:#include <stm8s903k3.h> long *p; long *pp; foo() { char a = PA_DDR; int  n; long m; a++;     n += 0x100;     m -= 0x001201; & ...…

查看全部問答∨

求助,

我要做一個高分辨率A/D轉換器的設計,用ad650做了一個壓頻轉換電路,但是可能是由于焊接或者是什么的原因輸出的波形特別的不穩,單片機可能無法實現計數。誰能幫我解決一下這個問題啊,,,,…

查看全部問答∨

為什么在程序中加了math頭文件后,程序還是識別不了里面的庫函數,例如sinf。急急....

本人是新手,接觸VxWorks時間不長。本人在Tornado的開發環境中編譯沒有任何問題。單下載到DSP上就報錯 說無法識別math里面的庫函數。程序中也加了頭文件,不知問題出在哪里,還請各位大神幫幫忙。很急很急。…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 恭城| 江达县| 尼木县| 昌黎县| 巴青县| 涟水县| 江达县| 共和县| 昌黎县| 开原市| 淳安县| 喀喇| 高阳县| 盐山县| 伊春市| 兰西县| 清水河县| 磴口县| 高阳县| 宜宾市| 璧山县| 田东县| 达州市| 偃师市| 舒城县| 台安县| 大名县| 永兴县| 张家港市| 东海县| 道孚县| 原阳县| 开鲁县| 吴川市| 乌拉特前旗| 微博| 剑川县| 德兴市| 旅游| 茂名市| 离岛区|