硬汉嵌入式论坛

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

[SD/SDIO] 请教stm32h750VBT6+freertos+lwip+fatfs在sdmmc2上的问题

[复制链接]

7

主题

22

回帖

43

积分

新手上路

积分
43
发表于 2024-8-15 18:24:38 | 显示全部楼层 |阅读模式
软硬件:请教stm32h750VBT6+freertos+lwip+fatfs ;  stm32cubemx-V6.12.0 + STM32Cube_FW_H7_V1.11.2 配置工程; Keil MDK ;开启cache;


问题:使用了sdmmc2接口TF卡,3.3V;  目前可以读取TF卡本身的容量等信息,可以读取卡上的txt文件内容;
只有写txt文件不行,一运行就死在写函数f_write(),带板仿真f_write() 函数,单步执行能返回,返回后居然跑到f_mount()函数中去了,???这是什么情况?
然后串口(lpuart)打印信息也挂了,f_open()函数之后的串口打印会死掉,打印不全;
调了两天了,头大~~~,

=======fatfs测试代码=============


uint8_t retSD ;//SEC_RAM_D1;    /* Return value for SD */
char SDPath[4];   /* SD logical drive path */
FATFS SDFatFS ;    /* File system object for SD logical drive */
FIL SDFile ;       /* File object for SD */
UINT fnum ;

ALIGN_32BYTES (char WriteBuffer[128] SEC_RAM_D1);
ALIGN_32BYTES (char ReadBuffer[128] SEC_RAM_D1);

void fatfs_test()
{
       
        memcpy(WriteBuffer,"This is a write test.",sizeof("This is a write test."));
        memset(ReadBuffer,0,sizeof(ReadBuffer));
  retSD = f_mount(&SDFatFS,(TCHAR const*)SDPath,1);
  //retSD = f_mount(&SDFatFS,"0:",1);
  kprintf2("\nmount1=%d ", retSD);
  if(FR_OK==retSD){
    //printf_sdcard_info(); //test OK
    //retSD = f_open(&SDFile, "test1.txt",  FA_WRITE |FA_READ );//FA_OPEN_APPEND);// read test ok
    retSD = f_open(&SDFile, "test2.txt",  FA_CREATE_ALWAYS |FA_WRITE );//write test
      if ( retSD == FR_OK )
      {
        kprintf2("\nopenOK "); //串口打印出问题了,上面f_open()执行后,这里只能打印1、2个字符;说明f_open()可以执行但中间出来什么问题,影响了lpuart打印信息;
        //retSD = f_write(&SDFile, WriteBuffer, sizeof(WriteBuffer), &fnum);  
        retSD = f_write(&SDFile, WriteBuffer, 20, &fnum);  //全速执行会死在里面,单步可执行出来,但会跳到上面的f_mount()函数中,诡异。
        kprintf2("\nWrite=%d,%d", retSD,fnum);

        //retSD = f_read(&SDFile, ReadBuffer, 32, &fnum); //OK
        //kprintf2("\nread=%d,%d:%s", retSD,fnum,ReadBuffer); //这里因为f_open()的影响,实际上时打印不出来的,通过仿真看到ReadBuffer中的32个字符都正确;
                               
        f_close(&SDFile);
        kprintf2("\nWrite=%d,%d", retSD,fnum);
        retSD = f_mount(NULL,(TCHAR const*)SDPath,1);
        kprintf2("\nmount2=%d ", retSD);
      }else
      {
        f_close(&SDFile);
        kprintf2("Failed to open=%d ",retSD);
      }
  }
}



void StartDefaultTask(void const * argument)
{
  /* init code for LWIP */
  kprintf2("\nDefaultTask...");
  MX_LWIP_Init();
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  fatfs_test();
  for(;;)
  {
          osDelay(1);
  }
}

=======end of fatfs测试代码=============
========MPU:============

  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER3;
  MPU_InitStruct.BaseAddress = 0x24000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  HAL_MPU_ConfigRegion(&MPU_InitStruct);

=======end of MPU===============

说明:
1、stm32H750vbt6中的sdmmc1与sdmmc2是不同的,sdmmc1的DMA是MDMA可以在cubemx中设置的,sdmmc2的DMA是IDMA全傻瓜用户无法干预,cubemx中无设置; 详见用户手册55.2节或者page2400/3319;
2、freertos开启后,fatfs中Advanced settings中“Use dma template”会强制enable;
3、freertos中 configTOTAL_HEAP_SIZE  ((size_t)(32768+8192));
4、s启动文件中:

  Stack_Size        EQU     0x4000
  Heap_Size     EQU     0x2000

===================================

请站长与路过的大神们看看,指点迷津,多谢!!!

PS: 这个项目中cubmx先配置其它紧要外设,最后sdmmc1引脚冲突,剩下sdmmc2了就用了; 事先没了解两个口的差异,想当然以为完全一样;今天试了一下,先配置sdmmc1,其它9个uart,eth,QSPI也能配通,如果实在调不通,只能改板用sdmmc1了。
多谢!!!
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2024-8-15 20:37:56 | 显示全部楼层

我使用的也是 sdmmc2 , 读写完全没有问题

你按照如下配置的 mpu 试试看, 另外你的 sd 写入函数里面也需要增加 cache 无效化处理哟

            MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
            MPU_InitStruct.BaseAddress      = 0x24000000;
            MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
            MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
            MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;     // 貌似关键是需要把这个关闭即可
            MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
            MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
            MPU_InitStruct.Number           = MPU_REGION_NUMBER1;
            MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
            MPU_InitStruct.SubRegionDisable = 0x00;
            MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
            
            HAL_MPU_ConfigRegion(&MPU_InitStruct);
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-8-16 09:43:59 | 显示全部楼层
1、SDMMC1我们默认也是用的IDMA
2、很重要的一点,你的程序里面是仅开了0x24000000,没有使用TCM RAM吧。

然后就是用楼上坛友的方式,配置0x24000000为WT透写模式试试。
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2024-8-16 17:27:21 | 显示全部楼层
hpdell 发表于 2024-8-15 20:37
我使用的也是 sdmmc2 , 读写完全没有问题

你按照如下配置的 mpu 试试看, 另外你的 sd 写入函数里面也 ...

多谢!测试了一下,没改善。 请问您有没有sdmmc2+DMA+freertos+fatfs的最小工程可以给我参考一下,多谢!
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2024-8-16 17:32:26 | 显示全部楼层
eric2013 发表于 2024-8-16 09:43
1、SDMMC1我们默认也是用的IDMA
2、很重要的一点,你的程序里面是仅开了0x24000000,没有使用TCM RAM吧。
...

多谢站长!我看了一下map文件,确实没有0x20000000开始的内存被使用。修改scatter与MDK设置,重新编译使用0x20000000开始的内存;

uint8_t retSD SEC_RAM_D1;    /* Return value for SD */
char SDPath[4] SEC_RAM_D1;   /* SD logical drive path */
FATFS SDFatFS SEC_RAM_D1;    /* File system object for SD logical drive */
FIL SDFile SEC_RAM_D1;       /* File object for SD */
UINT fnum SEC_RAM_D1;
这些放在0x24000000区内, 重新编译没有改善。
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2024-8-16 17:41:13 | 显示全部楼层
下午用stm32cubemx新建了一个最小系统: sdmmc2+DMA+freertos+fatfs + lpuart串口打印;重新测试了一下,没有改善。
f_mount可以执行,f_open()不行,仿真了一下跑死的地方: f_open() --> dir_find(dp) ---> mov_window() ---> disk_read() --->sd_diskio.c中的 sd_read() 函数,如果单步执行,这个函数可以返回RES_OK;如果全速执行,会死在里面:

    /* Fast path cause destination buffer is correctly aligned */
  ret = BSP_SD_ReadBlocks_DMA((uint32_t*)buff, (uint32_t)(sector), count);

    if (ret == MSD_OK) {
#if (osCMSIS < 0x20000U)
    /* wait for a message from the queue or a timeout */
    event = osMessageGet(SDQueueID, SD_TIMEOUT);

    if (event.status == osEventMessage)
    {.....}
}
还没找到原因
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2024-8-16 17:56:14 | 显示全部楼层
回顾了一下:
1、mount之后可以读取卡的容量等信息,说明硬件电路是没问题的;
2、stm32H7的问题,大多都是MPU,cache,heap,stack问题,cubemx导出的工程源码一般问题不大;这是总方向,虽然仿真跟踪到底层,但还是觉得找问题方向错了;
3、串口打印是个大问题,可能是解决问题的关键;mount后串口打印信息正常,f_open后,串口打印1、2个字符就不能打印了,一直没琢磨这是怎么回事? 有大神遇到过这种问题吗? 请给提点,多谢!
4、我把串口打印放到内存中,0x24000000起始,或者0x20000000起始,都不能解决f_open后串口打印失败的问题;
fputc                                    0x20000001   Thumb Code    22  debuguart.o(.ramfunc)
kprintf                                  0x20000017   Thumb Code     2  debuguart.o(.ramfunc)
kprintf2                                 0x20000019   Thumb Code    18  debuguart.o(.ramfunc)
kprintf3                                 0x2000002b   Thumb Code    14  debuguart.o(.ramfunc)
Long Thumb to Thumb Veneer to vprintf    0x2000003d   Thumb Code    10  anon$$obj.o(Veneer$$Code)
memp_memory_RX_POOL_base                 0x20000048   Data        6275  ethernetif.o(.Rx_PoolSection)
defaultTaskHandle                        0x200018cc   Data           4  freertos.o(.data)
myTaskUart1TxHandle                      0x200018d0   Data           4  freertos.o(.data)
=================================
请路过的大神们指导,多谢!!!
   
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-8-17 10:32:30 | 显示全部楼层
sam2022 发表于 2024-8-16 17:56
回顾了一下:
1、mount之后可以读取卡的容量等信息,说明硬件电路是没问题的;
2、stm32H7的问题,大多都 ...

现在的问题基本上就可以锁定为你的SDMMC2无法正常使用,

这样试试,问题简化下,创建个裸机工程,仅SDMMC2的FatFS,看看正常不,这样问题就容易排查了。
回复

使用道具 举报

7

主题

22

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2024-8-21 11:25:26 | 显示全部楼层
多谢站长指点!我试试
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2024-11-5 17:35:13 | 显示全部楼层
请问,这个问题解决了?
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2025-3-3 23:09:17 | 显示全部楼层
请问,这个问题解决了?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 20:42 , Processed in 0.053602 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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