前言
学习如何在RT-Thread中让STM32F4读取U盘一、使用env进行配置
1、使能USB HOST设备
2、使用USB HOST组件
3、使能文件系统
4、scons --target=mdk5生成工程
二、测试生成的工程,并解决问题
1、编译工程,发现有以下错误,基本上都是各种未定义,其实这些是因为工程的底层未完善,需要用CubeMX进行配置生成我们需要的代码
2、安装STM32CubeMX和STM32F4的HAL包就可以创建一个工程,具体配置如下
3、生成工程代码,打开工程,打开stm32f4xx_hal_msp.c文件,这个文件就是存放一些初始化硬件的函数,可以发现以下有关于USB的初始化函数
/**
* @brief HCD MSP Initialization
* This function configures the hardware resources used in this example
* @param hhcd: HCD handle pointer
* @retval None
*/
void HAL_HCD_MspInit(HCD_HandleTypeDef* hhcd)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(hhcd->Instance==USB_OTG_FS)
{
/* USER CODE BEGIN USB_OTG_FS_MspInit 0 */
/* USER CODE END USB_OTG_FS_MspInit 0 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USB_OTG_FS GPIO Configuration
PA11 ------> USB_OTG_FS_DM
PA12 ------> USB_OTG_FS_DP
*/
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Peripheral clock enable */
__HAL_RCC_USB_OTG_FS_CLK_ENABLE();
/* USB_OTG_FS interrupt Init */
HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
/* USER CODE BEGIN USB_OTG_FS_MspInit 1 */
/* USER CODE END USB_OTG_FS_MspInit 1 */
}
}
/**
* @brief HCD MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param hhcd: HCD handle pointer
* @retval None
*/
void HAL_HCD_MspDeInit(HCD_HandleTypeDef* hhcd)
{
if(hhcd->Instance==USB_OTG_FS)
{
/* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */
/* USER CODE END USB_OTG_FS_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USB_OTG_FS_CLK_DISABLE();
/**USB_OTG_FS GPIO Configuration
PA11 ------> USB_OTG_FS_DM
PA12 ------> USB_OTG_FS_DP
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);
/* USB_OTG_FS interrupt DeInit */
HAL_NVIC_DisableIRQ(OTG_FS_IRQn);
/* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */
/* USER CODE END USB_OTG_FS_MspDeInit 1 */
}
}
4、将上述的两个函数复制到项目工程stm32f4xx_hal_msp.c文件中,发现提示错误,编译后结果和最初遇到的错误一样
5、提示的未定义,要么是项目工程中没有这个结构体,要么就是有什么宏控制它使得没有将结构体加到代码中,可以通过全局搜索这个结构体,或者使用一个比较快的办法,在CubeMX生成的工程中直接goto到这个结构体,找到他具体位置
6、在我们项目工程中也打开这个.h文件查找一下是否有这个结构体,结果发现如果展开stm32f4xx_hal_msp.c文件想在他下面找是找不到的(出现某个变量、函数、结构体等等未定义,就需要在这个.c文件下找是否有对应头文件,没有包含对应头文件肯定会报错的),我们只能在STM32_HAL文件夹下的stm32f4xx_hal_hcd.c中强行打开对应头文件,结果发现是有这个结构体的。
7、细心的朋友会发现stm32f4xx_hal_hcd.c中的代码都是暗灰的未加入到工程中,而在CubeMX生成的工程中却不是这样,说明此处必有鬼,很容易能发现有一个宏未定义导致
8、这个好办,直接去stm32f4xx_hal_conf.h中抓鬼,毫无意外,取消掉HAL_HCD_MODULE_ENABLED注释,重新编译一次试试,结果令人惊喜,编译通过!
三、下载运行
1、插上U盘发现他识别了,使用文件系统命令都是可以的
2、传说支持热拔插,试了试貌似可以,但是没试多久就泼我一身冷水,有时候无法识别,要命的是只要有一次出现无法识别以后都不行了,必须重启才可以,完犊子!!!实际的项目是不可以出现这种问题的,所以干他…