[APM32F4] 【APM32F411V Tiny Board测评】USB 接口与使用

[复制链接]
 楼主| 北方西门吹雪 发表于 2024-5-21 09:36 | 显示全部楼层 |阅读模式
1 APM32F411V的USB功能
APM32F411V一个重要的功能是USB接口,USB栈固化进了硬件层,通过函数调用就可以简单使用,而且同时支持DEVICE和HOST两种模式。通常支持Device模式的比较多,支持Host的少,这个就非常有用了。
USB协议其实还是比较复杂的,需要实现设备描述符,配置描述符,接口描述符,端点描述符的定义和通讯,然后才能开始数据通讯,在完成通讯后,再提供设备的类,主要是事先定义的音频,键盘,u盘等不同的设备。
其中,以设备描述符为例,需要定义以下参数
Capture.PNG
使用APM32F411V已经很好定义了,那么重点放在Endpoint的定义就可以快速开始设计和定义。
2 代码开发
主循环初始化USB口之后,就使用死循环不断访问usb的控制
  1. int main(void)
  2. {
  3.     /* Set the Vector Table base address at 0x08000000 */
  4.     NVIC_ConfigVectorTable(NVIC_VECT_TAB_FLASH, 0x0000);

  5.     USART_Config_T usartConfigStruct;

  6.     /* Init USB device */
  7.     USB_DeviceInit();

  8.     printf("USB Device HID Keyboard Application\r\n");

  9.     while (1)
  10.     {
  11.         USB_DevUserApplication();
  12.     }
  13. }

那么USB 模拟键盘的功能如下
  1. void USB_DevUserApplication(void)
  2. {
  3.     static uint8_t userAppState = USER_APP_INIT;
  4.     static uint8_t interval = 0;
  5.     static uint8_t report[8] = { 0 };
  6.     static uint8_t i = 4;
  7.    
  8.     switch (userAppState)
  9.     {
  10.         case USER_APP_INIT:
  11.             interval = USBD_HID_ReadInterval(&gUsbDeviceFS);

  12.             report[0] = 0;
  13.             report[1] = 0;
  14.             report[2] = 0;
  15.             report[3] = 0;
  16.             userAppState = USER_APP_RUN;
  17.             break;

  18.         case USER_APP_RUN:
  19.             if (!APM_PBGetState(BUTTON_KEY1))
  20.             {
  21.                 APM_DelayMs(10);
  22.                 if (!APM_PBGetState(BUTTON_KEY1))
  23.                 {
  24.                     if(i > 29)
  25.                     {
  26.                         i = 4;
  27.                         report[2] = KEYBOARD_ENTER;
  28.                         USBD_HID_TxReport(&gUsbDeviceFS, (uint8_t*)report, 8);
  29.                         APM_DelayMs(20);
  30.                         report[2] = 0;
  31.                         USBD_HID_TxReport(&gUsbDeviceFS, (uint8_t*)report, 8);
  32.                         APM_DelayMs(20);
  33.                     }
  34.                     
  35.                     report[2] = i;
  36.                     USBD_HID_TxReport(&gUsbDeviceFS, (uint8_t*)report, 8);
  37.                     
  38.                     APM_DelayMs(20);
  39.                     
  40.                     report[2] = 0;
  41.                     USBD_HID_TxReport(&gUsbDeviceFS, (uint8_t*)report, 8);
  42.                     
  43.                     i++;
  44.                     
  45.                     while(!APM_PBGetState(BUTTON_KEY1));
  46.                 }
  47.             }

  48.             APM_DelayMs(interval);
  49.             break;
  50.     }
  51. }
这个代码直接定义了Class,然后侦听Key1的按键操作,不断增加1,这样就是从a-z的ASCII码,输出到Host就可以作为键盘使用。
上述代码编译并下载到MCU,
3 功能模拟
3.1 连接再USB口
229271782.jpg
按下按键1就可以不断实现模拟的键盘输入
Animation.gif
3.2 增加USART输入功能,可以用调试口读取调试信息,这里输出功能说明,连接串口如下

Capture.PNG
4 小结
APM32F411V功能全面,开发友好,开发环境也非常好用,是一个性能价格都很能打的国产芯片,对比竞品形成压力,而且品质提升很多。



szt1993 发表于 2024-5-23 17:02 | 显示全部楼层
USB 接口与使用非常适合外设接入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

122

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部