硬件:野火挑战者stm32f429开发版
rt-thread版本:4.0.3 build Mar 2 2020
参考示例:https://www.rt-thread.org/document/site/application-note/driver/usb/an0046-rtthread-driver-usbh/
ENV的基本配置步骤就是按照参考示例里边的教程做的,做的过程中遇到了一下几个问题:
1. 野火 F429 bsp 工程中 board 的 Kconfig 没有 BSP_USING_USBH 配置选项,从其他bsp中抄一下
menuconfig BSP_USING_USBH bool "Enable USB Host" select RT_USING_USB_HOST default n if BSP_USING_USBH menuconfig RT_USBH_MSTORAGE bool "Enable Udisk Drivers" default n if RT_USBH_MSTORAGE config UDISK_MOUNTPOINT string "Udisk mount dir" default "/" endif endif endmenu
2. 野火F429 开发版的硬件连接为“USB_OTG_HS” 驱动中对应的方式为 “USB_OTG_FS” 更改CubeMx 配置,打开相应引脚,野火开发版对应如下:
PB12 -> USB_OTG_HS_ID (不知道作用)
PB14 -> USB_OTG_HS_DM (usb D- 信号)
PB15 -> USB_OTG_HS_DP (usb D+ 信号)
由于引脚不同,需要更改STM32 USB的外设驱动,在原来的驱动上做了如下更改:添加HS的中断回调函数,原来只有FS的中断回调函数
void OTG_HS_IRQHandler(void) /* 添加中断函数*/ { rt_interrupt_enter(); HAL_HCD_IRQHandler(&stm32_hhcd_fs); rt_interrupt_leave(); }
static rt_err_t stm32_hcd_init(rt_device_t device)
{
HCD_HandleTypeDef *hhcd = (HCD_HandleTypeDef *)device->user_data;
// hhcd->Instance = USB_OTG_FS;
// hhcd->Init.Host_channels = 8;
// hhcd->Init.speed = HCD_SPEED_FULL;
hhcd->Init.dma_enable = DISABLE;
// hhcd->Init.phy_itface = HCD_PHY_EMBEDDED;
hhcd->Init.Sof_enable = DISABLE;
hhcd->Instance = USB_OTG_HS;
hhcd->Init.Host_channels = 12;
hhcd->Init.speed = HCD_SPEED_FULL;
hhcd->Init.phy_itface = USB_OTG_EMBEDDED_PHY;
hhcd->Init.low_power_enable = DISABLE;
hhcd->Init.vbus_sensing_enable = DISABLE;
hhcd->Init.use_external_vbus = DISABLE;
RT_ASSERT(HAL_HCD_Init(hhcd) == HAL_OK);
HAL_HCD_Start(hhcd);
#ifdef USBH_USING_CONTROLLABLE_POWER
rt_pin_mode(USBH_POWER_PIN, PIN_MODE_OUTPUT);
rt_pin_write(USBH_POWER_PIN, PIN_LOW);
#endif
return RT_EOK;
}
3. 比较坑的一点,由于是在自己做着玩,就把板子上的SD卡,W25Q128Flash 这俩都挂上文件系统了,当u盘插上之后能识别出来,也能打印出参考示例里边的种提示“found part[0], begin: 393216, size: 3.827GB”,但是用ls查看就是读取不了目录;
- 刚开始以为是挂载目录的问题,因为我是在w25q128文件系统下创建了一个目录挂载的,折腾了一会挂载目录,发现不是这里问题
- 紧接着怀疑是 “DFS_FILESYSTEMS_MAX ” 这个宏配置的问题,折腾了一下发现也不是这里问题
- 最后跟踪代码发现是由于 “RT_DFS_ELM_DRIVES” 这个宏导致的,这个值默认是2,我挂载了SD卡,挂载了W25Q128之后在挂载别的就不行了,然后把这个值改大点就可以了
,说折腾是因为调试这些都是需要全部编译代码,mdk编译速度太慢了