你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32H7S78-DK评测】使用FatFs文件系统读取SD卡文件

[复制链接]
BinWin 发布时间:2024-8-19 23:43
    STM32H7S78-DK板载WM8904耳放,有SD卡槽有屏幕,合计着做个播放器。首先读一下SD卡。

    鉴于该芯片从零配置较为复杂,第一步使用FatFs_uSD_RTOS例程进行修改做验证。导入工程后没有ioc文件,因此不能使用cubemx来编辑工程,遂手动添加。
    增加串口打印,便于之后打印调试信息。从原理图找出调试器连接的串口号
      b.png
     手动添加,需要配置串口参数,GPIO参数,重定向函数。分别如下
      
  1. static void MX_UART4_Init(void)
  2. {

  3.   /* USER CODE BEGIN UART4_Init 0 */

  4.   /* USER CODE END UART4_Init 0 */

  5.   /* USER CODE BEGIN UART4_Init 1 */

  6.   /* USER CODE END UART4_Init 1 */
  7.   huart4.Instance = UART4;
  8.   huart4.Init.BaudRate = 115200;
  9.   huart4.Init.WordLength = UART_WORDLENGTH_8B;
  10.   huart4.Init.StopBits = UART_STOPBITS_1;
  11.   huart4.Init.Parity = UART_PARITY_NONE;
  12.   huart4.Init.Mode = UART_MODE_TX_RX;
  13.   huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  14.   huart4.Init.OverSampling = UART_OVERSAMPLING_16;
  15.   huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  16.   huart4.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  17.   huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  18.   if (HAL_UART_Init(&huart4) != HAL_OK)
  19.   {
  20.     Error_Handler();
  21.   }
  22.   if (HAL_UARTEx_SetTxFifoThreshold(&huart4, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  23.   {
  24.     Error_Handler();
  25.   }
  26.   if (HAL_UARTEx_SetRxFifoThreshold(&huart4, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  27.   {
  28.     Error_Handler();
  29.   }
  30.   if (HAL_UARTEx_EnableFifoMode(&huart4) != HAL_OK)
  31.   {
  32.     Error_Handler();
  33.   }
  34.   /* USER CODE BEGIN UART4_Init 2 */

  35.   /* USER CODE END UART4_Init 2 */

  36. }
复制代码
  1. void HAL_UART_MspInit(UART_HandleTypeDef* huart)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  4.   RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  5.   if(huart->Instance==UART4)
  6.   {
  7.   /* USER CODE BEGIN UART4_MspInit 0 */

  8.   /* USER CODE END UART4_MspInit 0 */

  9.   /** Initializes the peripherals clock
  10.   */
  11.     PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART234578;
  12.     PeriphClkInit.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_PCLK1;
  13.     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  14.     {
  15.       Error_Handler();
  16.     }

  17.     /* Peripheral clock enable */
  18.     __HAL_RCC_UART4_CLK_ENABLE();

  19.     __HAL_RCC_GPIOD_CLK_ENABLE();
  20.     /**UART4 GPIO Configuration
  21.     PD1     ------> UART4_TX
  22.     PD0     ------> UART4_RX
  23.     */
  24.     GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_0;
  25.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  26.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  27.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  28.     GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
  29.     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  30.   /* USER CODE BEGIN UART4_MspInit 1 */

  31.   /* USER CODE END UART4_MspInit 1 */

  32.   }

  33. }
复制代码
  1. 使用cubeIDE
  2. __io_putchar(int ch)
  3. {
  4.   HAL_UART_Transmit(&huart4, (uint8_t *)&ch, 1, 0xffff);
  5.   return ch;
  6. }
复制代码
      代码修改完还是不能打印出信息的。需要IDE也作下配置,如下
       c.png
       添加输入输出头文件stdio后,就可以试试程序如何了。
       d.png
       以上没有问题,接下来看文件系统。例程已经添加了FatFS,插入SD卡运行程序会在根目录创建STM32.TXT文件,并且写入一串字符。嗯,我已经测试,这是没有问题的。那要改成我需要的显示文件列表。SD卡我已经拷贝了一些歌曲文件,f_opendir(),f_mount(),f_readdir()等接口函数直接操作就行了。记得安富莱电子专门有做测试程序,拷贝过来适应下,对其开源表示感谢。
      
  1. static void ViewRootDir(void)
  2. {
  3.         FRESULT result;
  4.         uint32_t cnt = 0;
  5.         FILINFO fno;


  6.         /* 挂载文件系统 */
  7.         result = f_mount(&fs, DiskPath, 0);        /* Mount a logical drive */
  8.         if (result != FR_OK)
  9.         {
  10.                 printf("挂载文件系统失败 (%s)\r\n", FR_Table[result]);
  11.         }

  12.         /* 打开根文件夹 */
  13.         result = f_opendir(&DirInf, DiskPath); /* 如果不带参数,则从当前目录开始 */
  14.         if (result != FR_OK)
  15.         {
  16.                 printf("打开根目录失败  (%s)\r\n", FR_Table[result]);
  17.                 return;
  18.         }

  19.         printf("属性        |  文件大小 | 短文件名 | 长文件名\r\n");
  20.         for (cnt = 0; ;cnt++)
  21.         {
  22.                 result = f_readdir(&DirInf, &FileInf);                 /* 读取目录项,索引会自动下移 */
  23.                 if (result != FR_OK || FileInf.fname[0] == 0)
  24.                 {
  25.                         break;
  26.                 }

  27.                 if (FileInf.fname[0] == '.')
  28.                 {
  29.                         continue;
  30.                 }

  31.                 /* 判断是文件还是子目录 */
  32.                 if (FileInf.fattrib & AM_DIR)
  33.                 {
  34.                         printf("(0x%02d)目录  ", FileInf.fattrib);
  35.                 }
  36.                 else
  37.                 {
  38.                         printf("(0x%02d)文件  ", FileInf.fattrib);
  39.                 }

  40.                 f_stat(FileInf.fname, &fno);

  41.                 /* 打印文件大小, 最大4G */
  42.                 printf(" %10d", (int)fno.fsize);


  43.                 printf("  %s\r\n", (char *)FileInf.fname);        /* 长文件名 */
  44.         }

  45.     /* 打印卡速度信息 */
  46.     if(hsd1.SdCard.CardSpeed == CARD_NORMAL_SPEED)
  47.     {
  48.         printf("Normal Speed Card <12.5MB/S, MAX Clock < 25MHz, Spec Version 1.01\r\n");
  49.     }
  50.     else if (hsd1.SdCard.CardSpeed == CARD_HIGH_SPEED)
  51.     {
  52.         printf("High Speed Card <25MB/s, MAX Clock < 50MHz, Spec Version 2.00\r\n");
  53.     }
  54.     else if (hsd1.SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED)
  55.     {
  56.         printf("UHS-I SD Card <50MB/S for SDR50, DDR50 Cards, MAX Clock < 50MHz OR 100MHz\r\n");
  57.         printf("UHS-I SD Card <104MB/S for SDR104, MAX Clock < 108MHz, Spec version 3.01\r\n");
  58.     }


  59.         /* 卸载文件系统 */
  60.          f_mount(NULL, DiskPath, 0);
  61. }
复制代码
     函数末尾还判断了SD卡的速度等级。我这个卡和厂家配送的一摸一样,看看如何。不出意外的话还是出意外了。
      e.png
     中文乱码了。这个应该能够通过修改文件编码格式来解决,不过网上看了下,可以添加编译参数代替修改编辑器。验证了下确实可以。
添加的内容为 -fexec-charset=GBK,还是修改编码的意思。
      f.png
     接下来直接使用有歌曲列表的SD卡来测试,看看意外如何了
       g.png
      很明显,还是意外了,不过问题我也看出来了。应该是长文件命名没有支持吧。然后紧急打开文件名支持,宏定义修改即可
       h.png
      料想这次应该没毛病了。结果,新的意外又出现了。
       i.png
       还好是我能hold住的问题,这文件看着也像是很接近了,看看ffconfig文件有啥没改好的。结果查看,发现code page指向了日文,难怪文字显示的内容参杂中文,这次总算没有意外了。
      j.png k.png
    满是意外的过程也说明尽管使用了例程还是有很多细节容易忽略,接下来计划添加解码器的驱动到工程里来。

      




收藏 评论0 发布时间:2024-8-19 23:43

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版