STM32F103 CubeMX 使用USB生成鼠标设备
- 1 配置cubeMX
- 1.1配置外部晶振,配置debug口
- 1.2 配置USB
- 1.3 配置芯片的时钟
- 1.4 生成工程
- 2. 编写代码
- 2.1 添加申明
- 2.2 main函数代码
1 配置cubeMX
1.1配置外部晶振,配置debug口
1.2 配置USB
1.3 配置芯片的时钟
需要注意,在使用USB设备的时候,一定要使用外部的高速时钟,
1.4 生成工程
2. 编写代码
2.1 添加申明
添加两个申明,这样可以将代码中使用到的函数,引入到main这个文件中来,
/* 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;;
/*** @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 */
}
这个鼠标是默认生成就是鼠标的设备,调试起来还是比较方便。