日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

基于STM32CubeMX的USB鼠標(biāo)例程

單片機(jī)愛好者 ? 來源:MCU起航 ? 作者:單片機(jī)愛好者 ? 2020-05-06 14:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大家好,我是MCU起航。

最近在玩STM32CUBE的USB功能,用起來還是挺方便的。只要配置一下,設(shè)備描述符、配置描述符、接口描述符什么的,都能給你自動生成,其中還包括比較復(fù)雜的報(bào)告描述符。

這次給大家演示一下如何用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)的。首先要明確的一點(diǎn)是,STM32F103C8的這個片子,只支持USB的FS模式,也就是全速(FULL SPEED)模式。

USB主機(jī)(也就是電腦)如何知道USB設(shè)備支持全速模式?只要在USB設(shè)備的D+數(shù)據(jù)線上接一個1.5K的上拉電阻即可。而我這里這個上拉電阻的電源端是接到了STM32的PA15上面。如圖:

所以,如果你的板子上,上拉電阻默認(rèn)接到VCC,這一步就不用管了。沒有的話,自己想辦法~~~

第五,Connectivity選項(xiàng)里,選擇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秒,自動點(diǎn)一下鼠標(biāo)左鍵。

很多人到這里,其實(shí)是蒙的?。?!

為什么?

自始至終,STM32CubeMX里,和主函數(shù)里沒出現(xiàn)鼠標(biāo)相關(guān)的函數(shù)(除了我們自定義的一個帶鼠標(biāo)字符的數(shù)組),怎么就出來一個鼠標(biāo)?

為什么不是鍵盤?

為什么不是優(yōu)盤? 這個我可以回答,因?yàn)槟氵x的是HID,而不是存儲類設(shè)備。

為什么不是游戲手柄?

其實(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é)合報(bào)告描述符。也在這個文件內(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ā)人員懶,也可能是他們忘了。

無論是配置集合,還是報(bào)告描述符,這里都不做解釋,因?yàn)橐粌善恼赂菊f不完。這里只說一點(diǎn),由于報(bào)告描述符的規(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)左鍵。

好了,不知不覺說的有點(diǎn)多。還好大部分都是圖片,看起來不難理解??偨Y(jié)起來,就是個發(fā)送數(shù)據(jù)的過程。

還是那句話,USB協(xié)議比較復(fù)雜,只靠一兩篇文章是學(xué)不會的。完整例程我放到了公眾號后臺(單片機(jī)愛好者),回復(fù)關(guān)鍵詞:USB鼠標(biāo)例程,即可獲取下載鏈接。

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

    關(guān)注

    60

    文章

    8480

    瀏覽量

    286044
  • STM32
    +關(guān)注

    關(guān)注

    2313

    文章

    11195

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    如何在 STM32Cube CMake 工程中添加源文件

    STM32CubeMX 能夠很方便的導(dǎo)出 CMake 工程。例如,如下圖所示在 STM32CubeMX的 ToolChain/IDE 中選擇 Cmake。CMake 工程可以很容易被
    發(fā)表于 04-15 16:07 ?0次下載

    基于 X-Cube-FreeRTOS_Heap4 和 CubeMX 生成 UCPD 項(xiàng)目介紹

    1. 前言某客戶反映參考我們的文檔 AN5418《How to build a simple USB-PD sink applicationwith STM32CubeMX》去配置 FreeRTOS
    發(fā)表于 04-15 15:59 ?0次下載

    LAT1574_如何在 STM32Cube CMake 工程中添加源文件

    STM32CubeMX 能夠很方便的導(dǎo)出 CMake 工程。例如,如下圖所示在 STM32CubeMX的 ToolChain/IDE 中選擇 CmakeCMake 工程可以很容易被
    發(fā)表于 03-11 10:46 ?0次下載

    基于 X-Cube-FreeRTOS_Heap4 和 CubeMX 生成 UCPD 項(xiàng)目介紹

    某客戶反映參考我們的文檔 AN5418《How to build a simple USB-PD sink applicationwith STM32CubeMX》去配置 FreeRTOS 生成
    發(fā)表于 01-04 11:18 ?0次下載

    請問RT-Thread與stm32cubemx聯(lián)合開發(fā)的原理是什么?

    在使用RT-Thread與stm32cubemx聯(lián)合開發(fā)的原理是什么,cubemx在其中主要起到了哪些功能呢?
    發(fā)表于 10-11 15:49

    STM32cubeMX生成配置rt-thread引用問題求解

    如題,本人小白,剛接觸rt-thread,STM32F1/4簡便配置起見利用cubeMX自動生成,測試幾次后直接蒙了,不知道哪些文件是rt-thread項(xiàng)目必須的,網(wǎng)上說法也五花八門,說代碼屏蔽某些
    發(fā)表于 09-12 07:21

    意法半導(dǎo)體:STM32CubeMX將不再集成到STM32CubeIDE中

    從2025年11月發(fā)布的版本開始,我們將僅以 獨(dú)立 版本的形式提供 STM32CubeIDE 和 STM32CubeMXSTM32CubeMX將不再集成到STM32CubeIDE
    的頭像 發(fā)表于 09-01 17:18 ?3944次閱讀

    使用STM32CubeMX的時候創(chuàng)建的工程已經(jīng)使用的板載資源如何去掉?

    在使用STM32CubeMX的時候創(chuàng)建的工程已經(jīng)使用的板載資源如何去掉?在基于開發(fā)板進(jìn)行工程創(chuàng)建的時候會把板載資源直接初始化,后面想要用不同的功能配置,如何把初始配置去掉?
    發(fā)表于 07-22 07:13

    對于在STM32CubeMx使用FMC中的NAND FLASH里面配置這些時間有什么說明嗎?

    對于在STM32CubeMx使用FMC中的NAND FLASH里面配置這些時間有什么說明嗎?
    發(fā)表于 07-21 07:07

    stm32cubemx上的g031j6的管腳和數(shù)據(jù)手冊不一致,請問哪個是正確的呢?

    stm32cubemx上的g031j6的管腳和數(shù)據(jù)手冊不一致,請問哪個是正確的呢?
    發(fā)表于 07-10 06:39

    STM32N657X0Q為什么無法通過SPI驅(qū)動st7796板子?

    求助大家,一般來說要想驅(qū)動lcd外設(shè)應(yīng)該在stm32cubemx里配置什么,我的lcd可以正常供電但是就是燒錄程序后僅黑屏一瞬間然后繼續(xù)白屏,我感覺是沒有在stm32cubemx里配置好,有沒有大神解答一下
    發(fā)表于 06-19 07:21

    STM32CubeMX配置STM32G070RBT6TR時為什么無法使能PVD中斷?

    STM32CubeMX 配置STM32G070RBT6TR時無法使能PVD中斷
    發(fā)表于 06-18 07:59

    STM32CubeMX配置STM32G070RBT6TR時無法使能PVD中斷怎么辦?

    STM32CubeMX 配置STM32G070RBT6TR時無法使能PVD中斷
    發(fā)表于 06-16 06:32

    基于stm32和mpu9250的usb hid鍵盤、鼠標(biāo)、游戲控制器實(shí)例打包下載

    基于stm32和mpu9250的usb hid鍵盤、鼠標(biāo)、游戲控制器實(shí)例打包,推薦下載!
    發(fā)表于 05-29 21:44

    基于stm32和mpu9250的usb hid鍵盤、鼠標(biāo)、游戲控制器

    基于stm32和mpu9250的usb hid鍵盤、鼠標(biāo)、游戲控制器 項(xiàng)目實(shí)例下載! 純分享帖,需要者可點(diǎn)擊附件免費(fèi)獲取完整資料~~~【免責(zé)聲明】本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請
    發(fā)表于 05-23 20:53
    修文县| 巴中市| 湖北省| 阿合奇县| 南阳市| 泸西县| 高要市| 莱西市| 香港 | 诏安县| 茶陵县| 漠河县| 宣威市| 信丰县| 榆林市| 界首市| 绥芬河市| 彝良县| 牙克石市| 陆丰市| 景洪市| 北川| 包头市| 江源县| 洛扎县| 加查县| 五家渠市| 新乐市| 台南市| 大埔区| 保山市| 蕲春县| 兰考县| 崇阳县| 明溪县| 诏安县| 清镇市| 临猗县| 宜宾县| 霍林郭勒市| 车险|