MiniEBKBoard 入门指南

第一部分、硬件概述

1.1 MiniEBKBoard实物概图

  • 图1.1MiniEBKBoard实物概图
    MiniEBKBoard 入门指南
  • 如图1.1所示MiniEBKBoard配置了3个6*6轻触按键,两个LED;引出了DC005和micro-usb;

1.2 MiniEBKBoard原理图

  • 图1.2MiniEBKBoard实物概图
    MiniEBKBoard 入门指南
  • MiniEBKBoard原理图如图1.2所示,如看不清可打开Doc目录下的PDF文档查阅

第二部分、软件工具

2.1 软件概述

在 /Software 目录下是常用的工具软件:

  1. MDK:常用编译器;
  2. STM32CubeMX:代码生成工具;

第三部分、实战训练

3.1 实例Eg1_GamePad

目标是实现GamePad:枚举成XY轴的平面坐标和8个按键的USB设备。

3.1.1硬件设计

  • 图1.3 LED原理图
    MiniEBKBoard 入门指南
  • 如图1.3是LED原理图,其中LED1与LED2分别;SW1则是按键,右侧H1是外接的Joystick口;

MiniEBKBoard 入门指南
图1.4 KEY原理图

如图1.4是KEY原理图,我们只要配置8个GPIO作为输入去检测按键信号;

3.1.2 软件设计

首先是初始化代码,我们通过STM32cubeMX软件去生成代码,具体配置请打开GamePad.ioc查阅,这里不再赘述;
我们的工程使用的是Keil-MDK编译器,生成的工程目录如图1.5

MiniEBKBoard 入门指南
图1.5 工程目录
其中

  • Application/MDK-ARM 存放的是启动代码;
  • Application/User/Core: main函数,中断Handler,MSP相关代码;
  • Application/User/USB_DEVICE/App:* USB设备应用代码;
  • Application/User/USB_DEVICE/Target: USB设备配置代码;
  • Drivers/STM32F1xx_HAL_Driver: HAL库驱动代码
  • Drivers/CMSIS: CMSIS相关代码
  • Middlewares/USB_Device_Library/ USB设备库代码,对应cubemx Middleware;
  • Customer: 这是我们自定义的代码;
  • Doc: 存放说明文本文档;

工程目录这里只做一次介绍,后面的样例目录大同小异。接下来我们配置一下USB的报告描述符,我们定位到
"Application/User/USB_DEVICE/App/ usbd_custom_hid_if.c"文件,
打开usbd_custom_hid_if.c文件,并找到数组变量CUSTOM_HID_ReportDesc_FS;
另外需要注意USBD_CUSTOM_HID_REPORT_DESC_SIZE,
这个宏是报告描述符实际数组大小,大小不对会导致枚举失败;
"#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 46"

通过报告描述符生成工具Dt2_4配置生成报告描述符,如下

__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
  /* USER CODE BEGIN 0 */
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x04,                    // USAGE (Joystick)
    0xa1, 0x01,                    // COLLECTION (Application)
    0xa1, 0x02,                    //     COLLECTION (Logical)
    0x09, 0x30,                    //     USAGE (X)
    0x09, 0x31,                    //     USAGE (Y)
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //     LOGICAL_MAXIMUM (255)
    0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)
    0x46, 0xff, 0x00,              //     PHYSICAL_MAXIMUM (255)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x02,                    //     REPORT_COUNT (2)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
    0x05, 0x09,                    //     USAGE_PAGE (Button)
    0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)
    0x29, 0x08,                    //     USAGE_MAXIMUM (Button 8)
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
    0x95, 0x08,                    //     REPORT_COUNT (8)
    0x75, 0x01,                    //     REPORT_SIZE (1)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
    0xc0,                          //               END_COLLECTION

  /* USER CODE END 0 */
  0xC0    /*     END_COLLECTION	             */
};

由上述描述符可以看出X,Y轴定义成无符号8位数,XY的描述占用2个字;按键一共有8个,每个大小描述是bit,8个bit即1个byte;因此XY坐标+8个按键=3个byte;我们需要上报3个byte的数据给主机(HOST)。
最后是应用程序的编写,在main函数中,我们通过HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&AD_DATA, N)启动ADC DMA采集两个坐标数据;
bubble_sort是冒泡排序算法,对XY采样到的数据进行排序后取中间值几个进行求平均以减少误差;

  • 公式:

X=((Xtemp-Xmin)255)/(Xmax-Xmin);
Y=((Ytemp-Ymin)
255)/(Ymax-Ymin);

这两个公式是坐标解析算法,即两点一线方程;
按键的解析就是操作对应的key变量对应的位:如按键1按下,把最低位置1;按键1弹起,把最低位清零即可;
这样组成报告描述符,通过USBD_CUSTOM_HID_SendReport上报给主机,如下

Joystick_Report[0] =Y;
Joystick_Report[1]=X;
Joystick_Report[2]=key;
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS,(u8*)&Joystick_Report, 3);

至此,软件设计完成。(对于没有基础的同学,还是建议多看代码,精力有限,恕难面面俱到)

3.1.3 下载验证

我们把固件程序下载进去可以,打开“设备与打印机”可以看到USB设备枚举成了一个Gamepad,如下图。
MiniEBKBoard 入门指南

图1.5 Gamepad设备
右键打开游戏控制器后,点击属性得到下图所示界面
MiniEBKBoard 入门指南
图1.6 游戏控制器
我们可以摇Joystick和按按键可以发现上图游戏控制器界面也跟着响应。

上一篇:(四)MkDocs学习——自定义主题


下一篇:vue.js音乐播放器