硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5064|回复: 16
收起左侧

[SD/SDIO] 求一个STM32H7 SDMMC1+FATFS + FreeRTOS 的工程 基于cubemx导出的

[复制链接]

1

主题

20

回帖

23

积分

新手上路

积分
23
发表于 2020-7-5 14:54:36 | 显示全部楼层 |阅读模式
已经卡在SDMMC这里几天了。事情是这样。
用硬汉的提供的代码是可以正常读写文件的。但是cubemx导出的代码总是在初始化SDMMC时 进入HardFault

另:关于FAT的数据都放在了 AXI SRAM 。并且关掉了DCache
#define  USE_SD_TRANSCEIVER           0U
RCC时钟 SDMMC设置成了160M 。

论坛上的关于STM32H7 的帖子都翻了一遍。还是没能解决。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2020-7-5 15:01:38 | 显示全部楼层
SDMMC+FatFs+DMA问题
http://www.armbbs.cn/forum.php?m ... 4962&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

20

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-7-5 15:47:05 | 显示全部楼层
eric2013 发表于 2020-7-5 15:01
SDMMC+FatFs+DMA问题
http://www.armbbs.cn/forum.php?mod=viewthread&tid=94962&fromuid=58
(出处: 硬汉 ...

他的情况比我好些。
f_mount没有问题,返回FR_OK。------------------我这边 是没问题的。
但是列文件或读写文件时均显示错误“2”,即“FR_INT_ERR”。
附件中有ioc文件,方便使用cubemx打开。
、、-------他这还有返回,不错了,我直接HardFault 进入while (1); 死掉

搞不懂 为何cubemx 出来的直接bug.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2020-7-5 15:48:56 | 显示全部楼层
ddr130 发表于 2020-7-5 15:47
他的情况比我好些。
f_mount没有问题,返回FR_OK。------------------我这边 是没问题的。
但是列文件 ...

二楼连接的工程是基于CubeMX导出的SDMMC1+FATFS

对比下你的。
回复

使用道具 举报

1

主题

20

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-7-5 16:21:03 | 显示全部楼层
eric2013 发表于 2020-7-5 15:48
二楼连接的工程是基于CubeMX导出的SDMMC1+FATFS

对比下你的。

二楼的工程 我这边测试是正常的,可以读写。
现在发现可能是freertos的问题,一旦加入 就会异常。。
不懂怎么办了。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2020-7-5 16:24:38 | 显示全部楼层
ddr130 发表于 2020-7-5 16:21
二楼的工程 我这边测试是正常的,可以读写。
现在发现可能是freertos的问题,一旦加入 就会异常。。
不 ...

这就简单多了,

第1步:在FreeRTOS的工程里面注释到所有任务创建,测试是否正常
第2步:启动FreeRTOS,仅开启一个启动任务测试。
第3步:全部开启,测试是否正常。

思路就是这个样子的,剩下你再溜溜。
回复

使用道具 举报

1

主题

20

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-7-5 22:29:24 | 显示全部楼层
eric2013 发表于 2020-7-5 16:24
这就简单多了,

第1步:在FreeRTOS的工程里面注释到所有任务创建,测试是否正常

经过一些测试 基本可以确定是加入了freertos后产生的问题。
由于在加入操作系统后,fatfs硬件初始化不能在系统非运行状态开始。因为加入了队列和信号量调度。
所以 fat相关的操作只能放在任务里执行。

目前问题出现在初始化完卡后,进行第一扇区的读取,也就是
BSP_SD_ReadBlocks_DMA 操作时,触发了HAL_SD_IRQHandler 之后 产生了 HardFault

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2020-7-5 22:33:09 | 显示全部楼层
ddr130 发表于 2020-7-5 22:29
经过一些测试 基本可以确定是加入了freertos后产生的问题。
由于在加入操作系统后,fatfs硬件初始化不能 ...

请务必安装我说的三步测试,非常重要,而且是非常好的测试方式,可以方便的找到问题所在:

第1步:在FreeRTOS的工程里面注释到所有任务创建,测试是否正常
第2步:启动FreeRTOS,仅开启一个启动任务测试。
第3步:全部开启,测试是否正常。
回复

使用道具 举报

1

主题

20

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-7-6 11:07:58 | 显示全部楼层
eric2013 发表于 2020-7-5 22:33
请务必安装我说的三步测试,非常重要,而且是非常好的测试方式,可以方便的找到问题所在:

第1步:在F ...

第1步,在不改代码的情况下,不可能读写SD卡。只有freertos 运行起来后才可以进入卡的初始化。以下是代码

第2步,在任务里跑fat  会在DMA读卡时 进入 HardFault,1.尝试降低SDMMC的CLK时钟,将分频提高 无效,
2.总线宽度将4B改成1B  无效
第2步没有解决。目前第3没有必要了。


timebase soure 选择了TIM6
systick 用做freertos的时钟。

初步判断可能 DMA访问AXI SRAM 和某些外设冲突?


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2020-7-6 11:12:32 | 显示全部楼层
ddr130 发表于 2020-7-6 11:07
第1步,在不改代码的情况下,不可能读写SD卡。只有freertos 运行起来后才可以进入卡的初始化。以下是代码 ...

其实很简单的,你搞的有点吃力了。
就帮你这么多吧,剩下自己想办法解决吧。
回复

使用道具 举报

6

主题

126

回帖

144

积分

初级会员

积分
144
发表于 2020-7-6 11:15:07 | 显示全部楼层
ddr130 发表于 2020-7-5 16:21
二楼的工程 我这边测试是正常的,可以读写。
现在发现可能是freertos的问题,一旦加入 就会异常。。
不 ...

把堆栈给足了,1024以上,试试。
我记得前段时间有个朋友搞SD卡是这样的,文件系统吃内存。
回复

使用道具 举报

10

主题

140

回帖

170

积分

初级会员

积分
170
发表于 2020-7-6 11:20:25 | 显示全部楼层
只有freertos 运行起来后才可以进入卡的初始化???

硬件初始化完毕之后再运行FreeRTOS不可以吗?
回复

使用道具 举报

1

主题

20

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-7-6 11:38:11 | 显示全部楼层
eric2013 发表于 2020-7-6 11:12
其实很简单的,你搞的有点吃力了。
就帮你这么多吧,剩下自己想办法解决吧。

感谢你的支持。
不知道为何,我贴的图不见显示。以下是SD卡初始化代码,是cubemx生成的。
DSTATUS SD_initialize(BYTE lun)
{
Stat = STA_NOINIT;

  /*
   * check that the kernel has been started before continuing
   * as the osMessage API will fail otherwise
   */
#if (osCMSIS <= 0x20000U)
  if(osKernelRunning())   此处,只有当OS运行状态,才会执行。否则返回 STA_NOINIT
#else
  if(osKernelGetState() == osKernelRunning)
#endif
  {
#if !defined(DISABLE_SD_INIT)

    if(BSP_SD_Init() == MSD_OK)
    {
      Stat = SD_CheckStatus(lun);
    }

#else
    Stat = SD_CheckStatus(lun);
#endif

    /*
    * if the SD is correctly initialized, create the operation queue
    * if not already created
    */

    if (Stat != STA_NOINIT)
    {
      if (SDQueueID == NULL)
      {
#if (osCMSIS <= 0x20000U)
      osMessageQDef(SD_Queue, QUEUE_SIZE, uint16_t);
      SDQueueID = osMessageCreate (osMessageQ(SD_Queue), NULL);
#else
      SDQueueID = osMessageQueueNew(QUEUE_SIZE, 2, NULL);
#endif
      }

      if (SDQueueID == NULL)
      {
        Stat |= STA_NOINIT;
      }
    }
  }

  return Stat;
}

回复

使用道具 举报

1

主题

20

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-7-6 11:40:05 | 显示全部楼层
role_2099 发表于 2020-7-6 11:15
把堆栈给足了,1024以上,试试。
我记得前段时间有个朋友搞SD卡是这样的,文件系统吃内存。

这个型号的芯片 RAM是非常充裕,不会吝惜
以下是我的设置,应该是够用的
Heap Size  0x2000
Stack Size  0x2000
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2020-7-6 11:44:14 | 显示全部楼层
ddr130 发表于 2020-7-6 11:40
这个型号的芯片 RAM是非常充裕,不会吝惜
以下是我的设置,应该是够用的
Heap Size  0x2000

要加大任务栈,而不是系统栈。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2020-7-6 11:49:06 | 显示全部楼层
ddr130 发表于 2020-7-6 11:38
感谢你的支持。
不知道为何,我贴的图不见显示。以下是SD卡初始化代码,是cubemx生成的。
DSTATUS SD_i ...

别用CubeMX生成了,CubeMX做的FatFS多任务机制太繁琐了。

你当前就做一件事情,老老实实用原始版FreeRTOS,不要加CubeMX搞的CMSIS -RTOS V1封装层。

然后手动将SD卡驱动添加到FreeRTOS,测试下是否正常。

另外你实在搞不定就先别弄了,近期我正常做GUIX教程和第3版emWin教程,会做H7个各种RTOS带FatFS的模板,届时你参考下即可。

就帮你这么多吧。




回复

使用道具 举报

1

主题

20

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-7-6 12:05:45 | 显示全部楼层
eric2013 发表于 2020-7-6 11:44
要加大任务栈,而不是系统栈。

硬汉一语中的。问题解决了。
通过增大freertos 的任务堆栈,增加到2048 Words 已解决问题。
才疏学浅,自以为fatfs相关的变量都定义为全局量,不需要多大的堆栈[默认128 Words]。
总结一下:
cubemx 生成的STM32H7  sdmmc1 + FATFS + Freertos 只需改以下部分
#define  USE_SD_TRANSCEIVER           0U  
FAT操作相关的任务把堆栈加大,就可以。

感谢 以上网友的回复。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 07:35 , Processed in 0.368585 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表