大家好,我是MCU起航。
最近在玩STM32CUBE的USB功能,用起來還是挺方便的。只要配置一下,設(shè)備描述符、配置描述符、接口描述符什么的,都能給你自動生成,其中還包括比較復(fù)雜的報告描述符。
這次給大家演示一下如何用STM32CUBE的配置,自動生成一個USB鼠標(biāo)的過程。這里多說一句,USB是一套比較復(fù)雜的協(xié)議,單靠一兩個例程是不可能完全理解的。至少要找本書,再配著USB官網(wǎng)的各種協(xié)議啃幾天,才算入門。
所以這個例子起到的是一個拋磚引玉的過程,如果你真的感興趣,就去找相關(guān)資料學(xué)習(xí)。STM32CubeMX的便利,在很多方面都給了我們很大的幫助!當(dāng)然,如果有感興趣的想繼續(xù)學(xué)的,可以留言,我會試著寫一些這方面的文章。
首先,軟件版本我用的是STM32CubeMX的5.3.0,并不是最新版。為什么沒用最新的?最新版有個很惡心的bug,好像是打不開工程,記不清了。
打開STM32CUBE,選擇一個芯片。這里我選的是STM32F103C8T6。
其次,RCC這里外部高速時鐘,外部默認(rèn)都接8MHZ。
第三,SYS這里,調(diào)試接口選擇Serial Wire。我個人習(xí)慣用SW接口,你們隨意。
第四,GPIO這里,我把PA15設(shè)置為推挽輸出,默認(rèn)高電平。這是和我的硬件電路相關(guān)的。首先要明確的一點是,STM32F103C8的這個片子,只支持USB的FS模式,也就是全速(FULL SPEED)模式。
USB主機(jī)(也就是電腦)如何知道USB設(shè)備支持全速模式?只要在USB設(shè)備的D+數(shù)據(jù)線上接一個1.5K的上拉電阻即可。而我這里這個上拉電阻的電源端是接到了STM32的PA15上面。如圖:
所以,如果你的板子上,上拉電阻默認(rèn)接到VCC,這一步就不用管了。沒有的話,自己想辦法~~~
第五,Connectivity選項里,選擇USB,然后右側(cè)Device(FS)前面打勾,下面不用管。
第六,中間件(Middleware)這里,選擇USB。右側(cè)上面選擇Human Interface Device Class,也就是俗稱的HID。
下面要注意幾個地方!
VID和PID分別代表廠商(Vender)編號和產(chǎn)品(PID)編號,VID不能隨便用,要花錢向USB協(xié)會申請,所以這里僅供學(xué)習(xí)使用。PID還好,由廠商自己定義。
manufacturer_string是廠商字符串,product_string是產(chǎn)品字符串,configuration_string是配置字符串,interface_string是接口字符串,這四個是可以手動修改的。放心改,不要錢。我隨便改了兩個。
還有一個LANGID_STRING,它表示USB設(shè)備支持什么語言。我這里沒有動,默認(rèn)選擇英語。
7、修改時鐘。USB那里需要48M的時鐘,別的無所謂。照著改吧!
8、生成工程。工程名稱和路徑,不用說了,那個是基本的。主要是框住的這兩個位置,根據(jù)你的代碼習(xí)慣和編譯器(KEIL還是IAR)來進(jìn)行選擇。
9、修改代碼。打開工程,找到main.c,添加一些代碼。
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usbd_hid.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
uint8_t MouseData01[4] = {0,0,0,0};
extern USBD_HandleTypeDef hUsbDeviceFS;
/* USER CODE END PTD */
主函數(shù)里:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
MouseData01[0] = 0x01;
USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData01,sizeof(MouseData01));
HAL_Delay(1000);
MouseData01[0] = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData01,sizeof(MouseData01));
HAL_Delay(1000);
}
好了,保存、編譯、下載、上電。你會發(fā)現(xiàn),板子上電的時候電腦右下角彈出一個“發(fā)現(xiàn)新設(shè)備”的提示框。
然后你的屏幕上的光標(biāo)位置,每隔1秒,自動點一下鼠標(biāo)左鍵。
很多人到這里,其實是蒙的?。。?/p>
為什么?
自始至終,STM32CubeMX里,和主函數(shù)里沒出現(xiàn)鼠標(biāo)相關(guān)的函數(shù)(除了我們自定義的一個帶鼠標(biāo)字符的數(shù)組),怎么就出來一個鼠標(biāo)?
為什么不是鍵盤?
為什么不是優(yōu)盤? 這個我可以回答,因為你選的是HID,而不是存儲類設(shè)備。
為什么不是游戲手柄?
其實,你可以理解為,這是官方提供給我們的一個鼠標(biāo)例程。這里簡單說下USB設(shè)備上電的過程:
1、設(shè)備插入后,USB主機(jī)自動對設(shè)備進(jìn)行復(fù)位,使設(shè)備地址為零。
2、USB主機(jī)對地址為零的設(shè)備提問:你是個什么東西?
3、USB設(shè)備說:我的PID是XX,VID是XX,USB協(xié)議是2.0等等。
4、USB主機(jī)再次對設(shè)備進(jìn)行復(fù)位,然后給復(fù)位后的設(shè)備分配一個地址。
5、USB主機(jī)向新地址提問:你是個什么東西? USB設(shè)備回答:…
6、兩次回答一樣,說明USB設(shè)備的地址分配成功。USB主機(jī)繼續(xù)提問,獲取其它描述符。
7、USB設(shè)備,在向主機(jī)回復(fù)配置集合的時候,表明自己的身份:你好,我是個鼠標(biāo)!
也就是說,在配置集合中,有信息說明這個設(shè)備是鼠標(biāo),我們看下。在usb_hid.c文件中,有一個數(shù)組:USBD_HID_CfgFSDesc,其中一行:
單是這個還不夠,還要結(jié)合報告描述符。也在這個文件內(nèi),名字是HID_MOUSE_ReportDesc。內(nèi)容如下:
__ALIGN_BEGINstaticuint8_tHID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]__ALIGN_END= { 0x05,0x01, 0x09,0x02, 0xA1,0x01, 0x09,0x01, 0xA1,0x00, 0x05,0x09, 0x19,0x01, 0x29,0x03, 0x15,0x00, 0x25,0x01, 0x95,0x03, 0x75,0x01, 0x81,0x02, 0x95,0x01, 0x75,0x05, 0x81,0x01, 0x05,0x01, 0x09,0x30, 0x09,0x31, 0x09,0x38, 0x15,0x81, 0x25,0x7F, 0x75,0x08, 0x95,0x03, 0x81,0x06, 0xC0,0x09, 0x3c,0x05, 0xff,0x09, 0x01,0x15, 0x00,0x25, 0x01,0x75, 0x01,0x95, 0x02,0xb1, 0x22,0x75, 0x06,0x95, 0x01,0xb1, 0x01,0xc0 };
是不是很懵逼?這都是啥?怎么沒有注釋?
別問我,我也不知道。可能是研發(fā)人員懶,也可能是他們忘了。
無論是配置集合,還是報告描述符,這里都不做解釋,因為一兩篇文章根本說不完。這里只說一點,由于報告描述符的規(guī)定,鼠標(biāo)設(shè)備向電腦發(fā)送數(shù)據(jù)的時候,一般是發(fā)送4個字節(jié)的數(shù)據(jù)。
字節(jié)1:無符號字符型,低三位分別表示鼠標(biāo)的左、右、中鍵是否被按下,1按下,0抬起。
字節(jié)2:有符號字符型,表示鼠標(biāo)在x方向的移動。
字節(jié)3:有符號字符型,表示鼠標(biāo)在y方向的移動。
字節(jié)4:有符號字符型,表示鼠標(biāo)滾輪的移動。
所以,我在上面的代碼中循環(huán)將第一個字節(jié)的值設(shè)為0和1,就能看到屏幕上的光標(biāo)每隔一秒,觸發(fā)一下鼠標(biāo)左鍵。
好了,不知不覺說的有點多。還好大部分都是圖片,看起來不難理解??偨Y(jié)起來,就是個發(fā)送數(shù)據(jù)的過程。
還是那句話,USB協(xié)議比較復(fù)雜,只靠一兩篇文章是學(xué)不會的。完整例程我放到了公眾號后臺(單片機(jī)愛好者),回復(fù)關(guān)鍵詞:USB鼠標(biāo)例程,即可獲取下載鏈接。
-
usb
+關(guān)注
關(guān)注
60文章
8188瀏覽量
272893 -
STM32
+關(guān)注
關(guān)注
2293文章
11032瀏覽量
364914
發(fā)布評論請先 登錄
STM32CubeMX配置STM32G070RBT6TR時為什么無法使能PVD中斷?
使用STM32CubeMX進(jìn)行配置USB的時候,有哪些小的需要注意的細(xì)節(jié)?
STM32開發(fā)入門進(jìn)階必備!《STM32嵌入式系統(tǒng)開發(fā)—基于STM32CubeMX和HAL庫》新書發(fā)布!

請問如何使用STM32CubeMX修改STM32Cube_FW_MP2_V1.0.0固件中的項目例程引腳?
STM32CubeMX無法打開.ioc文件怎么解決?
STM32CubeMX生成的FreeRTOS源碼格式如何優(yōu)化?
使用STM32CubeMX生成CMake工程中的FLASH.ld被更改怎么解決?
STM32CubeMX用于STM32配置和初始化C代碼生成
工程師開發(fā)利器:STM32CubeMX 與 eDesignSuite 的協(xié)同開發(fā)

使用stm32cubeMX無法生成mdk工程文件?
STM32CubeMX的菜單介紹

評論