STM32H743 用CubeMX 搭建 SDMMC+MDAM+FATFS+FreeRTOS 模板

1 篇文章 0 订阅
1 篇文章 0 订阅

STM32H743搭建 DMA USB SDCard Reader

開發版:原子阿波羅 + H743 核心版
CubeMX 版本 6.2

因為 H743 SDMMC+MDAM+FATFS+FreeRTOS 的資料比較少,在此提供搭建過程,也作為筆記。
要注意的是

  1. 根據官方文件"Getting started with STM32H7 Series SDMMC host controller",H743 的 SDMMC 已經內建 DMA,所以,在CubeMX 不會出現 DMA 選項可以勾選 SDMMC 的 DMA 必須在 MDMA 勾選設定。在这里插入图片描述

  2. 在CubeMX,使用FreeRTOS ,會強制FATFS必須要使用 DMA,所以在FATFS的Advanced Setting選項裡必須把 Use dma template 打開在这里插入图片描述如果你有使用長檔名,記得要打開Enable LFN with dynamic working buffer on the STACK.S。MAX_SS 設定有時會引起錯誤,我的SD卡是用PC格式化,使用512可以。(下圖錯了,之前因為只對格式話與寫入測試,1024是沒問題的,但是,會無法讀出,使用512讀寫都沒問題)在这里插入图片描述

  3. 在 sd_disk_io.c 裡,有兩個有關 DMA 的定義要設為1

/*
* when using cacheable memory region, it may be needed to maintain the cache
* validity. Enable the define below to activate a cache maintenance at each
* read and write operation.
* Notice: This is applicable only for cortex M7 based platform.
*/
/* USER CODE BEGIN enableSDDmaCacheMaintenance */
#define ENABLE_SD_DMA_CACHE_MAINTENANCE  1 //*/
/* USER CODE END enableSDDmaCacheMaintenance */

/*
* Some DMA requires 4-Byte aligned address buffer to correctly read/write data,
* in FatFs some accesses aren't thus we need a 4-byte aligned scratch buffer to correctly
* transfer data
*/
/* USER CODE BEGIN enableScratchBuffer */
#define ENABLE_SCRATCH_BUFFER 1//*/
/* USER CODE END enableScratchBuffer */
  1. SDMMC時鐘源PLL1Q可以取100MHz, SDMMC clock divide factor =2在这里插入图片描述記得把SDMMC的 NVIC 打開在这里插入图片描述其他的部分大致上就跟一般在CubeMX設定FreeRTOS一樣。
  2. 最後產生代碼,在 sd_diskio.c 裡有個小bug, line 330 附近有個變數 ret 沒有宣告,自己在適當位置加入 uint8_t ret 就行。
  3. 所有的FATFS資料應該都是透過列隊傳遞,所以所有的FATFS都要在 task 裡面操作,例如,在進入task 之前先做 mount SD,那就會出錯找不到Device。

大致上這樣就可以完成,只要知道設定MDMA ,沒有大坑!

以下為測試結果
在这里插入图片描述

程式碼在
链接:https://pan.baidu.com/s/15LbgCtOKRReESLq61sgFLA
提取码:h743
在我的板子能跑。但是,後來我加了usbdevice以後,出現很多問題。所以我不敢保證他一定能跑。我試過在RTOS上跑,可以反覆讀寫。
因為我在台灣,很少上來,也很少積分無法用金錢。所以直接給大家連接,不用積分,如果對您有幫助,希望您也能秉直互助精神,我有問題時幫助我一下,謝謝您!

  • 31
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
STM32H743是一款高性能的微控制器,它内置了SDMMC控制器,可以用于SD卡和MMC卡的读写操作。下面是使用STM32CubeMX和RT-Thread Studio进行SDMMC配置的详细过程: 1. 打开STM32CubeMX,选择对应的芯片型号,打开SDMMC功能。 2. 配置SDMMC时钟,使其与SD卡或MMC卡的时钟匹配。 3. 配置SDMMC的数据线和命令线,使其与SD卡或MMC卡的接口匹配。 4. 生成代码并导入到RT-Thread Studio中。 5. 在RT-Thread Studio中编写SDMMC读写操作的代码,例如: ```c #include "stm32h7xx_hal.h" #include "drv_sdmmc.h" #define SDMMC_BLOCK_SIZE 512 SD_HandleTypeDef hsd1; int sdmmc_init(void) { hsd1.Instance = SDMMC1; hsd1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING; hsd1.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE; hsd1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE; hsd1.Init.BusWide = SDMMC_BUS_WIDE_1B; hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE; hsd1.Init.ClockDiv = 2; if (HAL_SD_Init(&hsd1) != HAL_OK) { return -1; } return 0; } int sdmmc_read(uint32_t block_addr, uint8_t *buf, uint32_t block_cnt) { if (HAL_SD_ReadBlocks(&hsd1, buf, block_addr, block_cnt, SDMMC_TIMEOUT) != HAL_OK) { return -1; } return 0; } int sdmmc_write(uint32_t block_addr, uint8_t *buf, uint32_t block_cnt) { if (HAL_SD_WriteBlocks(&hsd1, buf, block_addr, block_cnt, SDMMC_TIMEOUT) != HAL_OK) { return -1; } return 0; } ``` 以上代码中,sdmmc_init()函数用于初始化SDMMC控制器,sdmmc_read()函数用于读取SD卡或MMC卡中的数据,sdmmc_write()函数用于向SD卡或MMC卡中写入数据。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值