本帖最后由 sujingliang 于 2024-6-22 10:33 编辑
一、前言 非常荣幸能够获得这次宝贵的测评机会,我衷心感谢灵动微电子以及21IC给予我的这份信任与支持。昨天收到Mini-F5333评估开发板:这是一款资源丰富的开发板,归纳一下其资源: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协议栈。
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
2、选择开发平台:Windows,交叉编译工具:mdk,评估板:mini-f5330,build project
3、选择“Download Standalone Example Project”,建立一个单独的例程工程:
4、选择tinyusb->tud_hid_keyboard,Download Project
5、下载后得到mini-f5330_tud_hid_keyboard_mdk.zip Keil打开工程如下:
在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
Keycode[6]:一次可以同时输入6个字符; 例子中只对keycode[0] = HID_KEY_A;赋值,只输出一个”a”.
三、烧写 四、运行效果
|