STM32 USB學習筆記

2021-08-19 04:47:49 字數 2204 閱讀 4507

stm32 usb學習筆記

一、usb-fs-device firmware library

使用韌體庫開發程式,需要包含幾個檔案

從圖中可見,應用程式介面部分,有:usb_pwr, usb_conf, usb_desc, usb_istr, usb_prop, usb_endp六個檔案,在裝置驅動中有六個檔案:usb_core, usb_init, usb_sil, usb_int, usb_regs, usb_mem。

usb_regs:它提供了訪問usb裝置外圍介面暫存器的基本過程。

usb_int:處理正確傳輸服務程式,提供了usb協議事件和庫的聯絡

usb_mem:提供使用者儲存區和包儲存區的資料交換。

usb_init :設定在庫中要使用的初始化程式和全域性變數

usb_core: 實現在usb2.0協議第9章中的所有功能。

usb_sil :實現外圍介面的抽象層,它提供的過程實現端點的讀寫。

---------

usb_conf.h:define the btable and all endpoint addresses in the pma.

define the interrupt mask according to the needed events.

usb_desc :包括所有應用層的描述符。

usb_prop :為usb核提供的device_property、device_table、 user_standard_request 結構

usb_endp:

usb_istr:

usb_pwr:

例項除錯

usb_init(),裡面只呼叫了乙個函式,pproperty->init();這個函式是什麼呢?當右擊這個函式出現的快捷選單中,選擇 go to defined of init 時,無法找到這個函式。這是怎麼回事呢?實際上,向前面看,有乙個pproperty = &device_property,噢,原來把這個指標指向了device_property,那麼,再找一下它的定義,有乙個結構:

device_prop device_property =

;可見,這個init實際上就是mass_init函式了,這個函式裡有幾個呼叫,乙個是get_serialnum函式,裡面有這個

device_serial0 = *(__io uint32_t*)(0x1ffff7e8);

device_serial1 = *(__io uint32_t*)(0x1ffff7ec);

device_serial2 = *(__io uint32_t*)(0x1ffff7f0);

這裡用了絕對位址調,指向0x1ffff7e8以後的幾個位元組的內容,它放的是什麼呢?手冊中說了:unique device id register (96 bits)

下乙個是poweron函式,它是設定cntr、istr暫存器的,首先強制usb復位,再設定中斷。

還有乙個呼叫:usb_sil_init,它又重新設定了cntr暫存器的內容。

好了,初始化部分結束了。usb在處理時,輸入和輸出都採用中斷形式,可以使用的中斷有兩個0x8c和0x90,它是和can共用的。在0x8c處呼叫的是ctr_hp函式,在0x90處呼叫的是usb_istr函式。

usb_istr函式是根據cntr的設定,以及讀取istr的狀態來決定要執行的過程,還有根據對callback的定義,來執行相應的callback。其中ctr_lp是乙個主要過程。它主要根據傳輸方向及端點種類決定執行的三個過程,in0_process,setup0_process,out0_process。

對於ctr_hp函式,判斷中斷狀態,來執行ep2_out_callback(又呼叫了過程 mass_storage_out)或ep1_in_callback(它又呼叫了mass_storage_in),

can和usb共用中斷問題,可根據中斷暫存器狀態判斷處理,由於對這些位的讀出不影響其內容,因此不用儲存。

if (winterrupt_mask & _getistr())

usb_istr();

else  if ((can1->rf0r) & 0x1b)

修改mal_init、mal_getstatus、mal_write、mal_read

與具體儲存介質打交道的就是這三個函式,mal_init對介質進行初始化,mal_getstatus提供介質資訊,對於spi flash,要解除寫保護,才能實現格式化等寫入工作,

-----------------閒了再寫

from: 

STM32 USB學習整理3

這個檔案主要和 vcp 驅動有直接關係!很多部分都是空的內容,其中包含了一些引數的設定,需要注意的是 波特率的大小與usb速度沒有關係,波特率的設定會影響串列埠速度 usb虛擬串列埠相關配置引數 line coding linecoding u8 usart printf buffer usb us...

STM32 USB設計 硬體篇

stm32晶元內部整合了usb外設,大大減輕了usb電路的設計負擔,只需設計usb介面電路,就可以實現基於stm32晶元的電路板的usb通訊設計。本文將具體講述基於stm32f103rbt6晶元的usb設計 本文為硬體篇。首先,我們來認識一下stm32f103rbt6晶元。其中usb相關引腳為pa1...

STM32 USB 復合裝置實現

可實現用乙個usb介面實現多個usb裝置,如 hid msc hid cdc hid cdc msc等等 使用hal庫,以hid msc為例 具體步驟 目錄四 初始化使用 增加端點,同時修改fifo配置大小,stm32 usb fs fifo總大小為1.25kb,設定是使用的單位是32bit 原始碼...