STM32F103 CubeMX 使用USB生成鼠标设备
- [1 配置cubeMX](#1 配置cubeMX)
-
- 1.1配置外部晶振,配置debug口
- [1.2 配置USB](#1.2 配置USB)
- [1.3 配置芯片的时钟](#1.3 配置芯片的时钟)
- [1.4 生成工程](#1.4 生成工程)
- [2. 编写代码](#2. 编写代码)
-
- [2.1 添加申明](#2.1 添加申明)
- [2.2 main函数代码](#2.2 main函数代码)
1 配置cubeMX
1.1配置外部晶振,配置debug口
1.2 配置USB
1.3 配置芯片的时钟
需要注意,在使用USB设备的时候,一定要使用外部的高速时钟,
1.4 生成工程
2. 编写代码
2.1 添加申明
添加两个申明,这样可以将代码中使用到的函数,引入到main这个文件中来,
c
/* USER CODE BEGIN Includes */
# include "usbd_hid.h"
extern USBD_HandleTypeDef hUsbDeviceFS;
/* USER CODE END Includes */
2.2 main函数代码
添加了完整的main函数的代码,
申明的函数 HID_Buffer 这是来表示鼠标发送的数据。
这里需要说明一下,鼠标发的数据是4个 8位的数据
第一个字节表示按键,bit0对应左键、bit1对应右键、bit3对应中键;0表示未按,1表示按下;
第二个字节表示x轴(即鼠标左右移动,0表示不动,正值表示往右移,负值表示往左移,范围-127~127,绝对值对应了移动量大小);
第三个字节表示y轴(即鼠标上下移动,0表示不动,正值表示往下移,负值表示往上移,范围-127~127,绝对值对应了移动量大小);
第四个字节表示鼠标滚轮(正值为往上滚动,负值为往下滚动,-127~127,绝对值对应了移动量大小)。
代码中的:HID_Buffer 也就对应了4个字节。
下面的计算公式就是对应的鼠标的移动,如果你需要调整移动的方向,则将 ( (ADC0_Value - 2048)) 这个调换位置就可以了,256的参数就是一个经验值,这个值越大,鼠标移动速度越快。反之亦然。
HID_Buffer[1] = (ADC0_Value - 2048)/256;
HID_Buffer[2] = (2048 - ADC1_Value)/256;;
c
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_ADC2_Init();
MX_USB_DEVICE_Init();
/* USER CODE BEGIN 2 */
uint8_t HID_Buffer[4] = {0};
uint16_t ADC0_Value = 0;
uint16_t ADC1_Value = 0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY);
ADC0_Value = (uint16_t)HAL_ADC_GetValue(&hadc1);
HAL_ADC_Start(&hadc2);
HAL_ADC_PollForConversion(&hadc2,HAL_MAX_DELAY);
ADC1_Value = (uint16_t)HAL_ADC_GetValue(&hadc2);
HAL_Delay(50);
HID_Buffer[1] = (ADC0_Value - 2048)/256;
HID_Buffer[2] = (2048 - ADC1_Value)/256;;
USBD_HID_SendReport(&hUsbDeviceFS,HID_Buffer,4);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
这个鼠标是默认生成就是鼠标的设备,调试起来还是比较方便。