近期一个在研的项目中MCU使用64p F405,主要利用其FS OTG端口作为Host访问外接的U盘,另一个HS OTG端口作为Device 构造一个虚拟串口,实际使用的是Full Speed。
开发中的USB驱动代码完全复制ST提供的Demo, 库函数为V2.1, 但是发现了如下问题:
1. 如何节省掉 PA9 和 PB13 引脚,在ST的Demo中,这两个引脚是用于接Vusb的,那么简单的注释掉VBUS_SENSING_ENABLED就可以 办到吗?
至少PB13还是不能作为外中断使用,单步看PB13的配置并没有受到USB初始化的影响。进一步跟踪程序发现问题与 OTG_HS_GCCFG 寄存器的配置有关,按照F4的手册,其中有3个相关联的标志位:
GCCFG.18: VBUSASEN // Enable the VBUS sensing “A” device (USB Host)
GCCFG.19: VBUSBSEN // Enable the VBUS sensing “B” device (USB peripheral)
GCCFG.21: NOVBUSSENS // VBUS sensing disable
在 usb_core.c 中有对其赋值, 3个位都赋值为'1',经试验将 VBUSBSEN为赋值为0,那么 PB13可以使用了, 且不影响虚拟串口使用。
usb_core.c 中的 gccfg.b.vbussensingB=1 这是关键语句,将其改为 gccfg.b.vbussensingB=0,即可。
如果不想改动usb_core.c 可以在USB的初始化函数后,外加一个补丁:
USBD_Init(&USB_OTG_dev_HS, USB_OTG_HS_CORE_ID, &USR_desc_HS, &USBD_CDC_cb_HS,&USR_HS_cb );// 虚拟串口初始化
USB_OTG_dev_HS.regs.GREGS->GCCFG &= ~0x00080000; // 补丁
似乎将 GCCFG.21: NOVBUSSENS 置为1,并不能彻底解放 PB13.
比较有意思的是在 IAR 6.5的调试环境中,并不能看到有 NOVBUSSENS 位出现,难道是F4中并没有NOVBUSSENS 位?
详见下图右侧的调试窗口。 |