sujingliang · 1 天前

【Mini-F5375-OB开发板评测】2、TinyUSB实现HID USB键盘

image
TinyUSB是一个轻量级的开源USB库,专为嵌入式系统设计,提供了跨平台的USB Host/Device协议栈。TinyUSB可以参见:https://gitee.com/toumingyu/t...

MM32系列MCU一直都支持TinyUSB,并且在SDK软件包中一般提供TinyUSB例程。但是LibSamples_MM32F5370_V0.10.3软件包中没有提供TinyUSB例程,第三方库文件下也没有TinyUSB,甚至连USB的hal库文件也没有。OMG,但是还是提供了寄存器定义文件reg_usbfs.h。

根据MM32F5370数据手册来看MM32F5370肯定是支持USB的,所以只是没有提供库文件和例程。如果想使用USB功能,可以自己去实现。

image.png

但通过仅有的寄存器定义文件reg_usbfs.h实现一个USB驱动难度何其大。

于是在灵动微的官网上搜了一下,发现5270系列软件包提供了TinyUSB例程和USB HAL库,所以问题就变成了如何将5270的TinyUSB例程移植到5370。

一、移植hal_usbfs.c

从MM32F5270的HAL_Lib\src中拷贝一份hal_usbfs.c到MM32F5370的HAL_Lib\src

从MM32F5270的HAL_Lib\inc中拷贝hal_usbfs.h和hal_usbfs_bdt.h到MM32F5370的HAL_Lib\inc

将hal_usbfs.c加入工程,2个头文件加入include path
image.png
因为底层寄存器定义reg_usbfs.h不同需要对hal_usbfs.c进行一些修改,如:

USB_FS_TypeDef -> USBFS_TypeDef
#define USB_FS ((USB_FS_TypeDef )USB_FS_BASE) -> #define USBFS ((USBFS_TypeDef )USB_FS_BASE)
USB_FSIRQHandler -> USBFSIRQHandler

类似的情况还有很多,还有一些地方名称完全不同,需要按情况修改。

二、TinyUSB

从LibSamples_MM32F5270_V1.5.6\3rdPartySoftwarePorting下拷贝一份TinyUSB到LibSamples_MM32F5370_V0.10.3\3rdPartySoftwarePorting下

将TinyUSB目录中的以下文件加入工程
image.png

将TinyUSB的头文件路径加入include path
image.png

三、应用移植

从LibSamples_MM32F5270_V1.5.6\3rdPartySoftwarePorting\TinyUSB\Demos\TinyUSB_Device_HID_Comp下拷贝一些应用文件到工程根目录下

image.png

main文件

#include "tinyusb_device_hid_comp.h"
int main(void)
{
    PLATFORM_Init();
    TinyUSB_Device_HID_Comp_Sample();
    while (1)
    {
    }
}

以上完成了整个移植过程。
tinyusb_device_hid_comp.c中提供了完成HID USB键盘例程,
其中

static void send_hid_report(uint8_t report_id, uint32_t btn)
{
  // skip if hid is not ready yet
  if ( !tud_hid_ready() ) return;

  switch(report_id)
  {
    case REPORT_ID_KEYBOARD:
    {
      // use to avoid send multiple consecutive zero report for keyboard
      static bool has_keyboard_key = false;

      if ( btn )
      {
        uint8_t keycode[6] = { 0 };
        keycode[0] = HID_KEY_A;

        tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode);
        has_keyboard_key = true;
      }else
      {
        // send empty key report if previously has key pressed
        if (has_keyboard_key) tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, NULL);
        has_keyboard_key = false;
      }
    }
    break;

实现hid发送键盘report功能。

运行时,通过USB_MCM接入电脑,开发板会被识别为HID键盘,按下KEY1,会输出'a'字符给电脑。

四、源码

通过网盘分享的文件:MM32F5370_USB_HID_KEYBORD
链接: https://pan.baidu.com/s/17RM_... 提取码: nc4n

1、USB-HID_KEYBORD.rar解压到LibSamples_MM32F5370_V0.10.3\Samples\LibSamples
2、TinyUSB.rar解压到LibSamples_MM32F5370_V0.10.3\3rdPartySoftwarePorting

本文主要是完成了一个移植过程,可能还改了一些编译时报错的地方,但太琐碎,也不记得了,不能一一列出。

TinyUSB/Demos下还有其他4个USB demo,也可以考虑移植以下。
image.png

推荐阅读
关注数
0
文章数
6
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息