[MM32软件] 【灵动微电子MM32F5330测评】7.基于tinyusb的USBHID键盘测试

[复制链接]
 楼主| yuyy1989 发表于 2024-7-3 21:32 | 显示全部楼层 |阅读模式
从官网下载的LibSamples_MM32F5330中没有USB的驱动代码,MM32官方在论坛里发过MM32F5270的USB驱动视频教程,看视频才知道还有MindSDK。
先介绍一下MindSDK,MindSDK(mm32-mcu-sdk)是由灵动官方的软件团队开发和维护的基于灵动微控制器的软件开发平台。MindSDK包含灵动微控制器所必须的芯片头文件、启动程序、连接命令脚本等源码,以及灵动微控制器外设模块的驱动程序源码,以及大量便于用户使用的软件组件源码和开发工具。
地址https://mindsdk.mindmotion.com.cn/
第一次使用需要注册个账号,选择你使用的操作系统、IDE和开发板,然后点击BUILD PROJECT
微信截图_20240702222648.png
生成成功后在Build Dashboard中就可以看到生成的工程了,点击打开
微信截图_20240702222716.png
点击Download Board Package下载
微信截图_20240702222942.png
下载下来的文件中包含了USB例程,打开tud_hid_keyboard这个例程
微信截图_20240703195144.png
编译并烧录,用数据线连接开发板,这个程序会一直输出a
微信截图_20240703195402.png
接下来改造一下这个程序,用开发板上的按键控制输出,按键1按下输出Hello World!,按键2按下输出MM32F5330,按键3按下复制,按键4按下粘贴,修改的过程中发现MindSDK生成的工程中的库和官网上下的还不一样,文件名一样里面的类型定义却不完全一样,希望官方后面能统一一下
微信截图_20240703200926.png 微信截图_20240703201331.png
原来的按键处理方法要改成这样

  1. enum
  2. {
  3.     LED_NO_1 = 0,
  4.     LED_NO_2,
  5.     LED_NO_3,
  6.     LED_NO_4,
  7.     LED_NUM,
  8. };

  9. enum
  10. {
  11.     KEY_NO_1 = 0,
  12.     KEY_NO_2,
  13.     KEY_NO_3,
  14.     KEY_NO_4,
  15.     KEY_NUM,
  16. };

  17. GPIO_Type *led_ports[] = {GPIOB,GPIOB,GPIOC,GPIOC};
  18. uint16_t led_pins[] = {GPIO_PIN_11,GPIO_PIN_10,GPIO_PIN_7,GPIO_PIN_6};

  19. GPIO_Type *key_ports[] = {GPIOC,GPIOC,GPIOB,GPIOB};
  20. uint16_t key_pins[] = {GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_1,GPIO_PIN_2};
  21. const uint8_t key_press_states[] = {1,0,0,0};
  22. uint8_t key_press_counts[KEY_NUM];
  23. uint8_t key_pressed = 0xFF;
  24. char *key_msg1 = "Hello World!\n";
  25. char *key_msg2 = "MM32F5330\n";
  26. uint8_t key_send_index = 0;
  27. const uint8_t conv_table[128][2] =  { HID_ASCII_TO_KEYCODE };

  28. void APP_LedInit(void)
  29. {
  30.     uint8_t i = 0;
  31.     GPIO_Init_Type cfg;
  32.     RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOB, true);
  33.     RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOC, true);
  34.     cfg.PinMode = GPIO_PinMode_Out_PushPull;
  35.     cfg.Speed = GPIO_Speed_50MHz;
  36.     while(i < LED_NUM)
  37.     {
  38.         cfg.Pins = led_pins[i];
  39.         GPIO_Init(led_ports[i],&cfg);
  40.         GPIO_SetBits(led_ports[i],led_pins[i]);
  41.         i += 1;
  42.     }
  43. }

  44. void APP_LedOnOff(uint8_t led,uint8_t on)
  45. {
  46.     if(on)
  47.         GPIO_ClearBits(led_ports[led], led_pins[led]);
  48.     else
  49.         GPIO_SetBits(led_ports[led], led_pins[led]);
  50. }

  51. void APP_KeysInit(void)
  52. {
  53.     GPIO_Init_Type cfg;
  54.     RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOB, true);
  55.     RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOC, true);

  56.     cfg.PinMode = GPIO_PinMode_In_PullUp;
  57.     cfg.Pins = GPIO_PIN_5;
  58.     GPIO_Init(GPIOC,&cfg);
  59.     cfg.Pins = GPIO_PIN_1|GPIO_PIN_2;
  60.     GPIO_Init(GPIOB,&cfg);
  61.    
  62.     cfg.PinMode = GPIO_PinMode_In_Floating;
  63.     cfg.Pins = GPIO_PIN_4;
  64.     GPIO_Init(GPIOC,&cfg);
  65.     memset(key_press_counts,0,KEY_NUM);
  66. }

  67. void APP_KeyStateCheck(void)
  68. {
  69.     uint8_t i = 0;
  70.     while(i < KEY_NUM)
  71.     {
  72.         if(GPIO_ReadInDataBit(key_ports[i], key_pins[i]) == key_press_states[i])
  73.         {
  74.             if(key_press_counts[i] < 0xFF)
  75.                 key_press_counts[i] += 1;
  76.         }
  77.         else
  78.             key_press_counts[i] = 0;
  79.         if(key_press_counts[i] == 20)
  80.         {
  81.             APP_LedOnOff(i,1);
  82.             key_send_index = 0;
  83.             key_pressed = i;
  84.         }
  85.         i += 1;
  86.     }
  87. }

来了解一下键盘HID消息格式
微信截图_20240703202828.png
微信截图_20240703202836.png
实现发送方法
  1. void APP_SendKeyMsg(void)
  2. {
  3.     uint8_t keycode[6] = { 0 };
  4.     if ( !tud_hid_ready() )
  5.         return;
  6.     if(tud_suspended())
  7.         tud_remote_wakeup();
  8.     switch(key_pressed)
  9.     {
  10.         case KEY_NO_1:
  11.             if(key_send_index/2 < strlen(key_msg1))
  12.             {
  13.                 if(key_send_index%2 == 0)
  14.                 {
  15.                     keycode[0] = conv_table[key_msg1[key_send_index/2]][1];
  16.                     tud_hid_keyboard_report(REPORT_ID_KEYBOARD, conv_table[key_msg1[key_send_index/2]][0]?KEYBOARD_MODIFIER_LEFTSHIFT:0, keycode);
  17.                 }
  18.                 else
  19.                     tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, NULL);
  20.                 key_send_index += 1;
  21.             }
  22.             else
  23.                 key_pressed = 0xFF;
  24.             break;
  25.         case KEY_NO_2:
  26.             if(key_send_index/2 < strlen(key_msg2))
  27.             {
  28.                 if(key_send_index%2 == 0)
  29.                 {
  30.                     keycode[0] = conv_table[key_msg2[key_send_index/2]][1];
  31.                     tud_hid_keyboard_report(REPORT_ID_KEYBOARD, conv_table[key_msg2[key_send_index/2]][0]?KEYBOARD_MODIFIER_LEFTSHIFT:0, keycode);
  32.                 }
  33.                 else
  34.                     tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, NULL);
  35.                 key_send_index += 1;
  36.             }
  37.             else
  38.                 key_pressed = 0xFF;
  39.             break;
  40.         case KEY_NO_3:
  41.             keycode[0] = HID_KEY_C;
  42.             tud_hid_keyboard_report(REPORT_ID_KEYBOARD, KEYBOARD_MODIFIER_LEFTCTRL, keycode);
  43.             key_pressed = 0xFF;
  44.             break;
  45.         case KEY_NO_4:
  46.             keycode[0] = HID_KEY_V;
  47.             tud_hid_keyboard_report(REPORT_ID_KEYBOARD, KEYBOARD_MODIFIER_LEFTCTRL, keycode);
  48.             key_pressed = 0xFF;
  49.             break;
  50.         default:
  51.             tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, NULL);
  52.             APP_LedOnOff(LED_NO_1,0);
  53.             APP_LedOnOff(LED_NO_2,0);
  54.             APP_LedOnOff(LED_NO_3,0);
  55.             APP_LedOnOff(LED_NO_4,0);
  56.             break;
  57.     }
  58. }

  59. void APP_MyTask(void)
  60. {
  61.     APP_KeyStateCheck();
  62.     APP_SendKeyMsg();
  63. }

运行效果
WeChat_20240703213045 00_00_00-00_00_30.gif WeChat_20240703213056 00_00_00-00_00_30.gif

elephant00 发表于 2024-7-4 14:42 | 显示全部楼层
感谢大神的分享
chenjun89 发表于 2024-7-4 19:24 来自手机 | 显示全部楼层
可以做个小键盘,实现组合按键的功能。
tpgf 发表于 2024-7-19 08:26 | 显示全部楼层
tinyusb和我们常用的usb的区别是什么呢
paotangsan 发表于 2024-7-19 09:43 | 显示全部楼层
这种通讯方式需要外接专用的芯片吗
renzheshengui 发表于 2024-7-19 20:00 | 显示全部楼层
如何保证tinyusb连接的稳定性能呢
keaibukelian 发表于 2024-7-19 21:39 | 显示全部楼层
为什么usb键盘的使用寿命不如ps键盘长呢
heimaojingzhang 发表于 2024-7-19 22:45 | 显示全部楼层
目前所有芯片都能支持tinyusb的通讯方式吗
guanjiaer 发表于 2024-7-19 23:51 | 显示全部楼层
tinyusb所需要的引脚和常用的没有区别吧
shenxiaolin 发表于 2024-7-22 17:03 | 显示全部楼层
感谢分享,辛苦了,做USB还是很困难的。
shenxiaolin 发表于 2024-7-29 21:09 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

161

主题

814

帖子

10

粉丝
快速回复 返回顶部 返回列表