使用CubeMX軟件傻瓜式的配置,一鍵生成USB的HID驅(qū)動(dòng)。
一、USB鼠標(biāo)
1、CubeMX配置
①、選擇相對(duì)應(yīng)的芯片
?②、配置時(shí)鐘和Debug和debug
?
?
?③、配置USB
?
?④、生成代碼
?????????最好把這個(gè)也勾上,勾上以后每個(gè)外設(shè)配置不再都給你塞到main.c里,而是建一個(gè).c.h,這樣感覺(jué)舒服多了
2、編寫(xiě)應(yīng)用層代碼
????????USB協(xié)議還是挺復(fù)雜的,原理和底層我也搞不清楚,這東西也不是看幾篇文章學(xué)個(gè)一兩天就能搞明白的,我寫(xiě)這個(gè)也主要是為了好玩,沒(méi)有深層去理解。
我們用的鼠標(biāo)主要就四個(gè)屬性:鍵位(左鍵、右鍵、中鍵),左右移動(dòng)、上下移動(dòng)、滑輪
這四個(gè)屬性用一個(gè)長(zhǎng)度為4的數(shù)組一并包含進(jìn)來(lái):
? /*
? ? *MouseData[0]:低0位:左鍵 低1位:右鍵 低2位:中鍵
? ? *MouseData[1]:1~127:右 ?--127~-1:左
? ? *MouseData[2]:1~127:下 ?--127~-1:上
? ? *MouseData[3]:1~127:上 ?--127~-1:下 ?(滑輪)
? */
? char MouseData[4] = {0, 0, 0, 0};
發(fā)送這些信息用這個(gè)函數(shù):
USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData,sizeof(MouseData));
主要代碼:
memcpy(MouseDataT, MouseData, sizeof(MouseData));
? ? key = KEY_Scan(1); ? //支持連續(xù)按下
? ? switch(key)
? ? {
? ? ? case KEY0_PRES:
? ? ? ? MouseData[0] |= 0x01;
? ? ? ? break;
? ? ? case KEY1_PRES:
? ? ? ? MouseData[1] = 21;
? ? ? ? break;
? ? ? case WKUP_PRES:
? ? ? ? MouseData[3] = -12;
? ? ? ? break;
? ? ? default:
? ? ? ? MouseData[0] = 0;
? ? ? ? MouseData[1] = 0;
? ? ? ? MouseData[2] = 0;
? ? ? ? MouseData[3] = 0;
? ? }
? ? //如果有變化,發(fā)送
if(MouseData[0]!=MouseDataT[0]||MouseData[1]!=MouseDataT[1]||MouseData[2]!=MouseDataT[2]||MouseData[3]!=MouseDataT[3])
? ? {
? ? ? USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData,sizeof(MouseData));
? ? }
二、USB鍵盤(pán)
1、CubeMX配置同鼠標(biāo),這里不啰嗦了
2、在mouse的基礎(chǔ)上修改為keyboard的
參考:基于STM32CUBE的USB鍵盤(pán)例程 | MCU起航 (mcublog.cn)
主要就是以下幾點(diǎn):
①、鼠標(biāo)描述符換成鍵盤(pán)描述符,描述符大小也要改變
②、接口協(xié)議
③、端點(diǎn)發(fā)送的數(shù)據(jù)包長(zhǎng)度
④、增加一個(gè)輸出端點(diǎn)描述符 (按我的理解是,可以返回鍵盤(pán)指示燈的狀態(tài)的,嘗試了很久,還是不知道怎么返回,)
3、應(yīng)用程序
/*
? ? *keyBoardData[0]:特殊鍵
? ? *keyBoardData[1]:預(yù)留
? ? 普通按鍵可以一起按下 ?4:a
? ? *keyBoardData[2]:
? ? *keyBoardData[3]:
? ? *keyBoardData[4]:
? ? *keyBoardData[5]:
? ? *keyBoardData[6]:
? ? *keyBoardData[7]:
? */
u8 keyBoardData[8] = {0,0,0,0,0,0,0,0};
extern USBD_HandleTypeDef hUsbDeviceFS;
static void keyboard_key_test()
{
? ? u8 keyBoardDataEmpty[8] = {0,0,0,0,0,0,0,0};
? ? u8 key = KEY_Scan(1); ? //支持連續(xù)按下
? ? switch(key)
? ? {
? ? ? case KEY0_PRES:
? ? ? ? keyBoardData[2] = 4;
? ? ? ?
? ? ? ? break;
? ? ? case KEY1_PRES:
? ? ? ? keyBoardData[2] = 5;
? ? ? ? break;
? ? ? case WKUP_PRES:
? ? ? ? keyBoardData[2] = 6;
? ? ? ? break;
? ? ? default:
? ? ? ? keyBoardData[2] = 0;
? ? }
? ? USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&keyBoardData,sizeof(keyBoardData));
? ? HAL_Delay(15);
? ? USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&keyBoardDataEmpty,sizeof(keyBoardDataEmpty));
? ? HAL_Delay(15);
}
三、程序代碼
代碼我已上傳
期待有伙伴能解決我的疑惑
mouse DEMO:(60條消息) stm32USB鼠標(biāo)demo-單片機(jī)文檔類(lèi)資源-CSDN文庫(kù)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-819340.html
keyboard DEMO:(60條消息) stm32USB鍵盤(pán)demo-嵌入式文檔類(lèi)資源-CSDN文庫(kù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-819340.html
到了這里,關(guān)于教你STM32做USB鼠標(biāo)、鍵盤(pán)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!