STM32 + FATFS + freeRTOS 读U盘

一、cubeMX配置

1.配置RCC,选择外部时钟,因为配置时钟树时,内部时钟不满足USB48M的要求

STM32 + FATFS + freeRTOS 读U盘_第1张图片

2.配置时钟树 

STM32 + FATFS + freeRTOS 读U盘_第2张图片

3.配置USB_OTG_FS(任务量不大FS够用了),

STM32 + FATFS + freeRTOS 读U盘_第3张图片

4.配置USB_HOST 对于U盘选择大容量储存器

STM32 + FATFS + freeRTOS 读U盘_第4张图片

5.配置FATFS,在完成上一步配置后这个勾选才能选上

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

STM32 + FATFS + freeRTOS 读U盘_第5张图片

6.接下来就是FREERTOS操作系统的配置了,版本选择V1,V2我的KEIL总是报错没办法

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

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

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

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

第二个任务是一个LED闪烁

 

STM32 + FATFS + freeRTOS 读U盘_第6张图片

7.方便调试打开USART1

STM32 + FATFS + freeRTOS 读U盘_第7张图片

8.两个灯GPIO的配置,我就不贴图了

9.最后一步分配好栈的大小和堆的大小

STM32 + FATFS + freeRTOS 读U盘_第8张图片

二、代码

1.方便调试我们需要printf函数

①添加stdio.h头文件

/* USER CODE BEGIN Includes */
#include 
/* 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 */

2.找到StartDefaultTask函数,写如下代码测试U盘读取

void StartDefaultTask(void const * argument)
{
  /* init code for FATFS */
  MX_FATFS_Init();

  /* init code for USB_HOST */
  MX_USB_HOST_Init();

  /* USER CODE BEGIN 5 */
	osDelay(1000); //!!必须要有这个延时,不然f_mount不会成功
	int res = f_mount(&USBHFatFS,USBHPath,1);//挂载U盘
                   //USBHFatFS、USBHPath这两个参数系统在fatfs.c里面已经定义好了,直接用
	if(res == FR_OK)
	{
		printf("f_mount SUCCESSFUL: %s\r\n",USBHPath);
	}
	else
	{
		printf("f_mount ERROR: %d\r\n",res);
	}
	
	osDelay(1000);
	res = f_open(&USBHFile,"0:/123.txt",FA_READ);//打开文件
	if(res == FR_OK)
	{
		printf("f_open SUCCESSFUL\r\n");
	}
	else
	{
		printf("f_open ERROR: %d\r\n",res);
	}
	char buffer[10] = { 0 };
	res = f_read(&USBHFile,buffer,10,NULL);
	printf("f_read buffer = %s\r\n",buffer);
  /* Infinite loop */
  for(;;)
  {
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
    osDelay(500);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
    osDelay(500);
		if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
			break;
  }
	
  /* USER CODE END 5 */ 
}

三、结果

STM32 + FATFS + freeRTOS 读U盘_第9张图片

有问题可以在下面留言

你可能感兴趣的:(STM32 + FATFS + freeRTOS 读U盘)