1 APM32F411V的USB功能
APM32F411V一个重要的功能是USB接口,USB栈固化进了硬件层,通过函数调用就可以简单使用,而且同时支持DEVICE和HOST两种模式。通常支持Device模式的比较多,支持Host的少,这个就非常有用了。
USB协议其实还是比较复杂的,需要实现设备描述符,配置描述符,接口描述符,端点描述符的定义和通讯,然后才能开始数据通讯,在完成通讯后,再提供设备的类,主要是事先定义的音频,键盘,u盘等不同的设备。
其中,以设备描述符为例,需要定义以下参数
使用APM32F411V已经很好定义了,那么重点放在Endpoint的定义就可以快速开始设计和定义。
2 代码开发
主循环初始化USB口之后,就使用死循环不断访问usb的控制
- int main(void)
- {
- /* Set the Vector Table base address at 0x08000000 */
- NVIC_ConfigVectorTable(NVIC_VECT_TAB_FLASH, 0x0000);
- USART_Config_T usartConfigStruct;
- /* Init USB device */
- USB_DeviceInit();
- printf("USB Device HID Keyboard Application\r\n");
- while (1)
- {
- USB_DevUserApplication();
- }
- }
那么USB 模拟键盘的功能如下
- void USB_DevUserApplication(void)
- {
- static uint8_t userAppState = USER_APP_INIT;
- static uint8_t interval = 0;
- static uint8_t report[8] = { 0 };
- static uint8_t i = 4;
-
- switch (userAppState)
- {
- case USER_APP_INIT:
- interval = USBD_HID_ReadInterval(&gUsbDeviceFS);
- report[0] = 0;
- report[1] = 0;
- report[2] = 0;
- report[3] = 0;
- userAppState = USER_APP_RUN;
- break;
- case USER_APP_RUN:
- if (!APM_PBGetState(BUTTON_KEY1))
- {
- APM_DelayMs(10);
- if (!APM_PBGetState(BUTTON_KEY1))
- {
- if(i > 29)
- {
- i = 4;
- report[2] = KEYBOARD_ENTER;
- USBD_HID_TxReport(&gUsbDeviceFS, (uint8_t*)report, 8);
- APM_DelayMs(20);
- report[2] = 0;
- USBD_HID_TxReport(&gUsbDeviceFS, (uint8_t*)report, 8);
- APM_DelayMs(20);
- }
-
- report[2] = i;
- USBD_HID_TxReport(&gUsbDeviceFS, (uint8_t*)report, 8);
-
- APM_DelayMs(20);
-
- report[2] = 0;
- USBD_HID_TxReport(&gUsbDeviceFS, (uint8_t*)report, 8);
-
- i++;
-
- while(!APM_PBGetState(BUTTON_KEY1));
- }
- }
- APM_DelayMs(interval);
- break;
- }
- }
这个代码直接定义了Class,然后侦听Key1的按键操作,不断增加1,这样就是从a-z的ASCII码,输出到Host就可以作为键盘使用。
上述代码编译并下载到MCU,
3 功能模拟
3.1 连接再USB口
按下按键1就可以不断实现模拟的键盘输入
3.2 增加USART输入功能,可以用调试口读取调试信息,这里输出功能说明,连接串口如下
4 小结
APM32F411V功能全面,开发友好,开发环境也非常好用,是一个性能价格都很能打的国产芯片,对比竞品形成压力,而且品质提升很多。
|