[MM32硬件]

【灵动微电子MM32F5330测评】1.USB HID 键盘功能实现

[复制链接]
2578|1
手机看帖
扫描二维码
随时随地手机跟帖
sujingliang|  楼主 | 2024-6-22 10:31 | 显示全部楼层 |阅读模式
本帖最后由 sujingliang 于 2024-6-22 10:33 编辑

一、前言
非常荣幸能够获得这次宝贵的测评机会,我衷心感谢灵动微电子以及21IC给予我的这份信任与支持。昨天收到Mini-F5333评估开发板:
图片1.jpg
微信图片_20240622102506.jpg
这是一款资源丰富的开发板,归纳一下其资源:
1、核心处理器:
Mini-F5333搭载了MM32F5333D7PV微控制器,这款微控制器采用了由安谋科技授权的Armv8-M架构“星辰”STAR-MC1处理器。
最高工作频率可达180MHz,为各种应用提供了强大的处理能力。
2、存储资源:
内置了128KB Flash和32KB SRAM,这些存储空间对于大多数嵌入式应用开发来说都是足够的。
所有Flash和SRAM都配置了ECC(错误检查和纠正),确保了数据的完整性和可靠性。
3、外设接口与模块:
集成了丰富的I/O端口和外设模块,包括ADC(模数转换器)、DAC(数模转换器)、模拟比较器、定时器、UART(通用异步收发传输器)等。
这些外设接口为开发者提供了广泛的连接和扩展能力,适用于各种复杂的嵌入式系统。
4、通信接口:
配备了I2C、I3C、CAN、SPI、UART等通信接口,支持多种通信协议和数据传输方式。
这些通信接口使得Mini-F5333能够轻松与其他设备或系统进行通信和数据交换。
5、其他特性:
提供了低功耗定时器,适合对功耗要求敏感的应用场景。
集成了USB 2.0全速Device/Host控制器,为USB设备提供了方便的连接选项。

二、基于Mini-F5333+TinyUSB现实USB HID 键盘功能
TinyUSB是一个轻量级的开源USB库,专为嵌入式系统设计,提供了跨平台的USB Host/Device协议栈。
图片2.jpg

USB Device和USB Host是USB(Universal Serial Bus,通用串行总线)技术中的两个重要概念,它们分别代表了USB设备中的从设备和主设备。
USB HID键盘是一种基于USB Human Interface Device(HID)类协议的键盘设备。HID定义了与人体交互的设备如何与计算机通信的规范。HID设备通过USB的控制管道和中断管道与主机通信。控制管道用于传输USB描述符、类请求代码以及供查询的消息数据等;中断管道则用于传输从设备到主机的输入数据。HID设备的报告描述符用于描述设备如何向主机报告数据。可以处理各种类型的数据。

USB协议复杂度较高,自己实现不太现实,利用TinyUSB可以大大降低开发难度。但是自己移植TinyUSB也是需要花费一些力气的,幸好灵动微电子官方已经做好了移植,那就不需要重新造轮子了。

1、访问mindsdk online platform网站,
地址是:https://mindsdk.mindmotion.com.cn

图片3.png
2、选择开发平台:Windows,交叉编译工具:mdk,评估板:mini-f5330,build project
图片4.png

3、选择“Download Standalone Example Project”,建立一个单独的例程工程:

图片5.png
4、选择tinyusb->tud_hid_keyboard,Download Project
图片6.png

5、下载后得到mini-f5330_tud_hid_keyboard_mdk.zip
Keil打开工程如下:
图片7.png

在tusb_config.h 文件
//------------- CLASS -------------//
#define CFG_TUD_HID 1
#define CFG_TUD_CDC 0
#define CFG_TUD_MSC 0
#define CFG_TUD_MIDI 0
#define CFG_TUD_VENDOR 0


Main.c
int main(void)
{

BOARD_Init();
tusb_init();

while (1)
{
hid_task();
tud_task();
}

}

这是一个标准的TinyUSB程序,主要需要调用下面2个函数:

tusb_init(); // initialize tinyusb stack

tud_task();// tinyusb device task

hid_task();是需要实现的HID设备任务,对下载的例程略微修改了一下,去掉了按键输入的判断,不断地重复发送”a
void hid_task(void)
{
if ( tud_suspended() )
{
// Wake up host if we are in suspend mode
// and REMOTE_WAKEUP feature is enabled by host
tud_remote_wakeup();
}else
{
// Send the 1st of report chain, the rest will be sent by tud_hid_report_complete_cb()
send_hid_report(REPORT_ID_KEYBOARD, btn);
}
}

send_hid_report函数:
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;

// case REPORT_ID_MOUSE:
// {
// int8_t const delta = 5;

// // no button, right + down, no scroll, no pan
// tud_hid_mouse_report(REPORT_ID_MOUSE, 0x00, delta, delta, 0, 0);
// }
// break;

default: break;
}
}

tud_hid_keyboard_report(uint8_t report_id, uint8_t modifier, uint8_t keycode[6])

参数report_id为REPORT_ID_KEYBOARD时HID为键盘。
modifier是控制按键:1个字节表示8个控制按键Left Control、Left Shift、Left Alt、Left Window、Right Control、Right Shift、Right Alt、Right Window

图片8.png
Keycode[6]:一次可以同时输入6个字符;
例子中只对keycode[0] = HID_KEY_A;赋值,只输出一个”a”.

三、烧写
图片9.png
微信图片_20240622102540.jpg
四、运行效果

图片10.png





使用特权

评论回复
Bowclad| | 2024-6-27 18:24 | 显示全部楼层
可以模拟成鼠标吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

14

帖子

0

粉丝