[应用相关] STM32 + FATFS + freeRTOS 读U盘

[复制链接]
2615|9
 楼主| l63t89 发表于 2024-3-31 13:58 | 显示全部楼层 |阅读模式
cubeMX配置
1.配置RCC,选择外部时钟,因为配置时钟树时,内部时钟不满足USB48M的要求

488096608fb6072496.png

配置时钟树
194446608fb741774b.png

配置USB_OTG_FS(任务量不大FS够用了)
418046608fb87dc13f.png





 楼主| l63t89 发表于 2024-3-31 13:58 | 显示全部楼层
配置USB_HOST 对于U盘选择大容量储存器
481366608fb9754edf.png
 楼主| l63t89 发表于 2024-3-31 13:59 | 显示全部楼层
配置FATFS,在完成上一步配置后这个勾选才能选上

其中有两项需要修改:1.选择中文编码方式  2.支持长文件名,选择放在堆区还是栈区


212826608fba8e3924.png
 楼主| l63t89 发表于 2024-3-31 13:59 | 显示全部楼层
接下来就是FREERTOS操作系统的配置了,版本选择V1,V2我的KEIL总是报错没办法

它会默认有一个初始化文件系统的任务

关键的地方!!!因为FATFS文件系统的原因,它默认分配的128Words的栈空间太小了,程序会莫名其妙的卡住

所以要把它改大一点,视情况而定。

程序莫名卡住,首先想到是不是分配的栈不够,我已经被太阳晒黑了,希望这不是新鲜事了

第二个任务是一个LED闪烁
231246608fbb9b78ac.png
 楼主| l63t89 发表于 2024-3-31 13:59 | 显示全部楼层
方便调试打开USART1
963736608fbcade3a0.png
 楼主| l63t89 发表于 2024-3-31 13:59 | 显示全部楼层
两个灯GPIO的配置,我就不贴图了

最后一步分配好栈的大小和堆的大小
818076608fbdb15497.png
 楼主| l63t89 发表于 2024-3-31 14:00 | 显示全部楼层
代码
1.方便调试我们需要printf函数

①添加stdio.h头文件

/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
②重定向printf到USART,添加fputc函数

/* USER CODE BEGIN 0 */
int fputc(int ch,FILE* file)
{
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
        return ch;
}
/* USER CODE END 0 */
 楼主| l63t89 发表于 2024-3-31 14:00 | 显示全部楼层
找到StartDefaultTask函数,写如下代码测试U盘读取
  1. void StartDefaultTask(void const * argument)
  2. {
  3.   /* init code for FATFS */
  4.   MX_FATFS_Init();

  5.   /* init code for USB_HOST */
  6.   MX_USB_HOST_Init();

  7.   /* USER CODE BEGIN 5 */
  8.         osDelay(1000); //!!必须要有这个延时,不然f_mount不会成功
  9.         int res = f_mount(&USBHFatFS,USBHPath,1);//挂载U盘
  10.                    //USBHFatFS、USBHPath这两个参数系统在fatfs.c里面已经定义好了,直接用
  11.         if(res == FR_OK)
  12.         {
  13.                 printf("f_mount SUCCESSFUL: %s\r\n",USBHPath);
  14.         }
  15.         else
  16.         {
  17.                 printf("f_mount ERROR: %d\r\n",res);
  18.         }
  19.        
  20.         osDelay(1000);
  21.         res = f_open(&USBHFile,"0:/123.txt",FA_READ);//打开文件
  22.         if(res == FR_OK)
  23.         {
  24.                 printf("f_open SUCCESSFUL\r\n");
  25.         }
  26.         else
  27.         {
  28.                 printf("f_open ERROR: %d\r\n",res);
  29.         }
  30.         char buffer[10] = { 0 };
  31.         res = f_read(&USBHFile,buffer,10,NULL);
  32.         printf("f_read buffer = %s\r\n",buffer);
  33.   /* Infinite loop */
  34.   for(;;)
  35.   {
  36.                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
  37.     osDelay(500);
  38.                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
  39.     osDelay(500);
  40.                 if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
  41.                         break;
  42.   }
  43.        
  44.   /* USER CODE END 5 */
  45. }
 楼主| l63t89 发表于 2024-3-31 14:00 | 显示全部楼层
中国龙芯CDX 发表于 2024-3-31 22:57 | 显示全部楼层
CUBEmx非常简单实用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

1077

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部