| 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 模拟键盘的功能如下
 
 这个代码直接定义了Class,然后侦听Key1的按键操作,不断增加1,这样就是从a-z的ASCII码,输出到Host就可以作为键盘使用。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;
    }
}
上述代码编译并下载到MCU,
 3 功能模拟
 3.1 连接再USB口
 
   按下按键1就可以不断实现模拟的键盘输入
 
   3.2 增加USART输入功能,可以用调试口读取调试信息,这里输出功能说明,连接串口如下
 
 
   4 小结
 APM32F411V功能全面,开发友好,开发环境也非常好用,是一个性能价格都很能打的国产芯片,对比竞品形成压力,而且品质提升很多。
 
 
 
 
 |