RT-Thread:U盘读写


前言

学习如何在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、传说支持热拔插,试了试貌似可以,但是没试多久就泼我一身冷水,有时候无法识别,要命的是只要有一次出现无法识别以后都不行了,必须重启才可以,完犊子!!!实际的项目是不可以出现这种问题的,所以干他…

总结

今天不敢躺尸,这传说的热拔插有点不可靠,得亲自上阵抓臭虫...

USB无法识别BUG解决方案传送门

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小破孩 != ERR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值