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功能全面,开发友好,开发环境也非常好用,是一个性能价格都很能打的国产芯片,对比竞品形成压力,而且品质提升很多。
|