日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀]一、USB的“JoyStickMouse”例程結(jié)構(gòu)分析1、例程的結(jié)構(gòu)(1)底層結(jié)構(gòu)包括5個文件:usb_core.c(USB總線數(shù)據(jù)處理的核心文件),usb_init.c,usb_int.c(用于端點數(shù)據(jù)輸入輸入中斷處理),usb_mem.c(用于緩沖區(qū)操作)

一、USB的“JoyStickMouse”例程結(jié)構(gòu)分析

1、例程的結(jié)構(gòu)

(1)底層結(jié)構(gòu)

包括5個文件:usb_core.c(USB總線數(shù)據(jù)處理的核心文件),usb_init.c,usb_int.c(用于端點數(shù)據(jù)輸入輸入中斷處理),usb_mem.c(用于緩沖區(qū)操作),usb_regs.c(用于寄存器操作)。它們都包含了頭文件“usb_lib.h”。在這個頭文件中,又有以下定義:

#include"usb_type.h"

#include"usb_regs.h"

#include"usb_def.h"

#include"usb_core.h"

#include"usb_init.h"

#include"usb_mem.h"

#include"usb_int.h"

usb_lib.h中又包含了七個頭文件,其中usb_type.h中主要是用typedef為stm32支持的數(shù)據(jù)類型取一些新的名稱。usb_def.h中主要是定義一些相關的數(shù)據(jù)類型。

還有一個未包含在usb_lib.h中的頭文件,usb_conf.h用于USB設備的配置。

(2)上層結(jié)構(gòu)

上層結(jié)構(gòu)總共5個文件:hw_config.c(用于USB硬件配置)、usb_pwr.c(用于USB連接、斷開操作)、usb_istr.c(直接處理USB中斷)、usb_prop.c(用于上層協(xié)議處理,比如HID協(xié)議,大容量存儲設備協(xié)議)、usb_desc.c(具體設備的相關描述符定義和處理)。

可見,ST的USB操作庫結(jié)構(gòu)十分清晰明了,我先不準備直接閱讀源代碼。而是先利用MDK的軟件模擬器仿真執(zhí)行,先了解一下設備初始化的流程。

2、設備初始化所做的工作

(1)Set_System(void)

這個是main函數(shù)中首先調(diào)用的函數(shù),它位于hw_config.c文件中。它的主要功能是初始化時鐘系統(tǒng)、使能相關的外圍設備電源。

配置了JoyStickMouse所用到的5個按鍵,并且配置了兩個EXTI中斷,一個是用于把USB從掛起模式喚醒,還有一個用途未知。

(2)USB_Interrupts_Config();

這個是main函數(shù)中調(diào)用的第二個函數(shù),它也位于hw_config.c文件中。主要功能是配置USB所用到的中斷。

跟蹤到代碼中,主要設配置了USB低優(yōu)先級中斷和喚醒中斷,又有一個EXTI中斷功能未知。

(3)Set_USBClock()

這個是main函數(shù)中調(diào)用的第三個函數(shù),它也位于hw_config.c文件中。它的功能是配置和使能USB時鐘。

(4)USB_Init(void)

這個是main函數(shù)中調(diào)用的第四個函數(shù),它也位于usb_init.c文件中。它初始化了三個全局指針,指向DEVICE_INFO、USER_STANDARD_REQUESTS和DEVICE_PROP結(jié)構(gòu)體。

后面兩個是函數(shù)指針結(jié)構(gòu)體,里面都是USB請求實現(xiàn)、功能實現(xiàn)的函數(shù)指針。

voidUSB_Init(void)

{


pInformation=&Device_Info;


pInformation->ControlState=2;



pProperty=&Device_Property;



pUser_Standard_Requests=&User_Standard_Requests;




pProperty->Init();

}

這三個結(jié)構(gòu)體都是與具體設備枚舉和功能實現(xiàn)相關的,定義在usb_prop.c和usb_desc.c文件中。

DEVICE_PROPDevice_Property=


{


Joystick_init,


Joystick_Reset,


Joystick_Status_In,


Joystick_Status_Out,


Joystick_Data_Setup,


Joystick_NoData_Setup,


Joystick_Get_Interface_Setting,


Joystick_GetDeviceDescriptor,


Joystick_GetConfigDescriptor,


Joystick_GetStringDescriptor,


0,


0x40


};

USER_STANDARD_REQUESTSUser_Standard_Requests=


{


Joystick_GetConfiguration,


Joystick_SetConfiguration,


Joystick_GetInterface,


Joystick_SetInterface,


Joystick_GetStatus,


Joystick_ClearFeature,


Joystick_SetEndPointFeature,


Joystick_SetDeviceFeature,


Joystick_SetDeviceAddress


};

Usb_init()函數(shù)調(diào)用pProperty->Init()(實質(zhì)上就是Joystick_init)完成設備的初始化。

上層程序調(diào)用下次函數(shù)是常規(guī)性的操作。而下層函數(shù)(usb_init相對于usb_prop是輸入底層操作文件)調(diào)用上層文件函數(shù)我們稱之為回調(diào)。

回調(diào)函數(shù)的意義在于同一種操作模式、提供不同的回調(diào)函數(shù)則可以實現(xiàn)不同的功能。Windows中處理消息,好像也用到了這種模式。

回調(diào)函數(shù)的實現(xiàn)方法是函數(shù)指針數(shù)組。這是指針的高級應用。

這是函數(shù)的代碼:

voidJoystick_init(void)

{



Get_SerialNum();
//獲取設備序列號,轉(zhuǎn)變?yōu)閡nicode字符串


pInformation->Current_Configuration=0;



PowerOn();
//連接USB設備,實質(zhì)是能讓主機檢測到了。



_SetISTR(0);


wInterrupt_Mask=IMR_MSK;


_SetCNTR(wInterrupt_Mask);


bDeviceState=UNCONNECTED;

}

實質(zhì)上,代碼執(zhí)行到這里,開發(fā)板已經(jīng)可以響應主機發(fā)來的數(shù)據(jù)了。但我還是先把main()函數(shù)的代碼看完吧。

(5)SysTick_Config();

這個函數(shù)調(diào)用主要是為程序中用到的精確延時作配置。

3、進入主循環(huán)

進入主循環(huán)的工作就兩個:

Joystick_Send(JoyState())。

JoyState()用來獲取按鍵的狀態(tài)。

Joystick_Send(JoyState())用來把按鍵狀態(tài)發(fā)到主機。當然這里真正的發(fā)送工作并不是由該代碼完成的。它的工作只是將數(shù)據(jù)寫入IN端點緩沖區(qū),主機的IN令牌包來的時候,SIE負責把它返回給主機。

主要代碼如下:


UserToPMABufferCopy(Mouse_Buffer,GetEPTxAddr(ENDP1),4);
//從用戶復制四個字節(jié)到端點1緩沖區(qū),控制端點的輸入緩沖區(qū)。


SetEPTxValid(ENDP1);

4、中斷處理過程大致理解

(1)usb_istr()函數(shù)中的中斷處理簡單分析

有用的代碼大概以下幾段,首先是處理復位的代碼,調(diào)用設備結(jié)構(gòu)中的復位處理函數(shù)。


wIstr=_GetISTR();


if(wIstr&ISTR_RESET&wInterrupt_Mask)


{


_SetISTR((u16)CLR_RESET);//清復位中斷



Device_Property.Reset();


}

處理喚醒的代碼:


if(wIstr&ISTR_WKUP&wInterrupt_Mask)


{


_SetISTR((u16)CLR_WKUP);


Resume(RESUME_EXTERNAL);


}

處理總線掛起的代碼:


if(wIstr&ISTR_SUSP&wInterrupt_Mask)


{


if(fSuspendEnabled)


{


Suspend();


}


else


{




Resume(RESUME_LATER);


}



_SetISTR((u16)CLR_SUSP);


}

處理端點傳輸完成的代碼,這段是最重要的,它調(diào)用底層usb_int.c()文件中的CTR_LP()函數(shù)來處理端點數(shù)據(jù)傳輸完成中斷。


if(wIstr&ISTR_CTR&wInterrupt_Mask)


{


CTR_LP();


}

二、STM32處理器的USB接口

1、接口模塊的內(nèi)部結(jié)構(gòu)

在書上有一個很好的USB內(nèi)部接口模塊內(nèi)部結(jié)構(gòu)圖,比較好的解釋了各個模塊之間的關系,我這里試著用我自己的理解闡述一下吧。

首先在總線端(與D+、D-相連的那一端),通過模擬收發(fā)器與SIE連接。SIE使用48MHz的專用時鐘。

與SIE相關的的有三大塊:CPU內(nèi)部控制、中斷和端點控制寄存器,掛起定時器(這個好像是USB協(xié)議的要求,總線在一定時間內(nèi)沒有活動,SIE模塊能夠進入SUSPEND狀態(tài)以節(jié)約電能),還有包緩沖區(qū)接口模塊。

說到包緩沖區(qū)接口模塊,這個對應的含義是,USB設備應該提供USB包緩沖區(qū)。這塊緩沖區(qū)同時受到SIE和CPU核心的控制,用于CPU與SIE共享達到數(shù)據(jù)傳輸?shù)哪康摹?/p>

所以CPU通過APB1總線接口訪問,SIE通過包緩沖區(qū)接口模塊訪問,中間通過Arbiter來協(xié)調(diào)訪問。

當然我們關注的中心點是控制、中斷和端點控制寄存器。我們通過這些寄存器來獲取總線傳輸?shù)臓顟B(tài),控制各個端點的狀態(tài),并可以產(chǎn)生中斷來讓CPU處理當前的USB事件。

CPU可以通過APB1總線接口來訪問這些寄存器。它們使用的都是PCLK1時鐘。

2、USB模塊的寄存器認識

(1)
控制寄存器CNTR

傳輸完成中斷允許位。CTRM,1有效,如果SIE置位傳輸完成標志,則相應的數(shù)據(jù)傳輸完成中斷發(fā)生。

第15位

包緩沖區(qū)溢出中斷允許位

錯誤中斷允許位

喚醒中斷允許位。WKUPM。1有效,如果喚醒請求標志位置位,則產(chǎn)生喚醒中斷。

掛起中斷允許位。SUSPM,1有效,當總線掛起標志置位時,發(fā)生掛起中斷。

復位中斷允許位。RESETM。1有效,軟件強制復位和總線復位信號,都能觸發(fā)復位中斷。

幀首中斷允許位

期望幀首中斷允許位。ESOFM。它的含義是沒有收到幀首信號,允許發(fā)生中斷。

第8位




向主機發(fā)送的喚醒請求,RESUME。1有效,主機收到該信號,將喚醒設備。這個由軟件置位。

第4位

強制掛起控制,F(xiàn)SUSP。1有效。與由于總線無活動引起掛起的效果相同。

低功耗模式。前提是先進入掛起狀態(tài)。由軟件設置,一般又硬件復位(被喚醒后自動清零)。

斷電模式控制位。PDWN。此位為1時,USB模塊關閉。

強制復位控制。FRES。與總線上的復位信號產(chǎn)生相同的效果。也能產(chǎn)生復位中斷.

第0位。

(2)
中斷狀態(tài)寄存器ISTR

這個寄存器主要是反映USB模塊當前的狀態(tài)的。第15-8為與控制寄存器的中斷允許是意義對應的。相應的標志位置位,且中斷未屏蔽,則向CPU發(fā)出對應的中斷。

CTR標志,數(shù)據(jù)傳輸完成后硬件置1.

PMAOVR標志

ERR標志

WKUP請求,總線檢測到主機喚醒請求時由硬件置位。

SUSP請求標志位。

RESET請求標志位。

SOF幀首標志

ESOF,期待幀首標志。



DIR傳輸方向,此位由硬件控制。IN時為0,OUT為1.

第4位。

發(fā)生數(shù)據(jù)傳輸?shù)亩它c的地址。

(3)USB設備地址寄存器

第7位,EF,USB模塊允許位。如果EF=0,則USB模塊將停止工作。

第6-0位。USB當前使用的地址。復位時為0.

(4)
端點狀態(tài)和配置寄存器,8個寄存器,支持8個雙向端點和16個單向端點。

CTR_RX,正確接收標志位。

第15位。

DTOG_RX,用于檢測的數(shù)據(jù)翻轉(zhuǎn)位。一般由硬件自動設置,軟件寫1可使其手動翻轉(zhuǎn)。

STAT_RX,占據(jù)兩位。

00表示該端點不可用,無回應。

01表示響應STALL

10響應NAK

11表示端點有效,可接收數(shù)據(jù)。

SETUP標志。收到SETUP令牌包時置位。用戶收到數(shù)據(jù)后需檢查次位。

第11位。

EP_TYPE,兩位,表示端點類型。

00表示批量端點。

01表示控制端點

10表示等時端點。

11表示中斷端點。

EP_KIND,端點特殊類型。在EP_TYP

本站聲明: 本文章由作者或相關機構(gòu)授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

2025年8月13日 – 提供超豐富半導體和電子元器件?的業(yè)界知名新品引入 (NPI) 代理商貿(mào)澤電子 (Mouser Electronics) 即日起開售Asahi Kasei Microdevices (AKM) 的...

關鍵字: 數(shù)模轉(zhuǎn)換器 USB 無線揚聲器

物聯(lián)網(wǎng)與智能化設備快速普及,供電方式的選擇直接影響設備部署的靈活性、成本與可靠性。PoE(以太網(wǎng)供電)與USB供電作為兩大主流技術,分別在工業(yè)網(wǎng)絡、智能家居、消費電子等領域占據(jù)關鍵地位。本文將從設備適配性、傳輸距離、功率...

關鍵字: PoE USB

在無線技術的發(fā)展歷程中,部署的簡便性往往是成功的關鍵。像Wi-Fi、藍牙和早期的蜂窩技術,只有在集成變得簡單、無縫且實惠時,才能實現(xiàn)大規(guī)模的應用。而如今,Wi-Fi HaLow——一種專為物聯(lián)網(wǎng)(IoT)設計的遠距離、低...

關鍵字: 物聯(lián)網(wǎng) Wi-Fi USB

2025年8月5日 – 專注于引入新品的全球電子元器件和工業(yè)自動化產(chǎn)品授權代理商貿(mào)澤電子 (Mouser Electronics)即日起開售Microchip Technology的新款AVR? SD 8位MCU。AVR...

關鍵字: MCU 工業(yè)自動化 USB

隨著高解析度音頻應用的不斷發(fā)展和廣泛部署,諸如USB與I2S之間等不同專業(yè)接口之間的高品質(zhì)音頻轉(zhuǎn)換需求日益增長,由此帶來了實現(xiàn)高性能、高實時性與高靈活性的新挑戰(zhàn)。為此,邊緣AI和智能音頻專家XMOS攜手其全球首家增值分銷...

關鍵字: SoC USB 處理器

【2025年7月24日, 德國慕尼黑訊】全球功率系統(tǒng)和物聯(lián)網(wǎng)領域的半導體領導者英飛凌科技股份公司(FSE代碼:IFX / OTCQX代碼:IFNNY)近日推出新型英飛凌ID Key系列,進一步擴展其通用串行總線(USB)...

關鍵字: 控制器 USB 非易失性存儲器

其他電腦(比如安卓手機/平板電腦)的屏幕壞了,你可能想在安排維修之前緊急訪問一些東西。你可以使用android的USB OTG功能(是的,幾乎每個android都支持這個功能,你可以將鼠標和鍵盤連接到它)。

關鍵字: USB 鼠標 Android 樹莓派

M5Stack Cardputer非常適合作為硬件密碼管理器。它很小巧,有一個內(nèi)置鍵盤,一個SD卡插槽,運行在帶有本地USB支持的ESP32-S3上。屏幕使其易于使用,并且由于USB HID,它可以直接在登錄字段中鍵入密...

關鍵字: 密碼管理器 M5Stack Cardputer USB

【2025年7月10日, 德國慕尼黑訊】全球功率系統(tǒng)和物聯(lián)網(wǎng)領域的半導體領導者英飛凌科技股份公司(FSE代碼:IFX / OTCQX代碼:IFNNY)為CIS的新款USB 5 Gbit/s和10 Gbit/s攝像頭提供E...

關鍵字: 控制器 USB 圖像信號處理器

Holtek 針對USB應用推出HT82B45R低速USB OTP MCU,符合USB 2.0低速規(guī)范,支持鍵盤用的高阻抗碳膜技術(Carbon Membrane)。HT82B45R結(jié)合低功耗設計、彈性I/O配置、內(nèi)建L...

關鍵字: MCU USB 看門狗定時器
關閉