OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8965|回复: 12

CubeMX 6 +FreeRTOS+SD(DMA)+FATFS 可以mount,但是f_opent錯誤,返回錯誤碼為3,詳情如內

[复制链接]

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
发表于 2021-9-6 16:29:10 | 显示全部楼层 |阅读模式
10金钱
被 CubeMX 6 +FreeRTOS+SD+FATFS 搞死了!
板子是原子的H743+阿波羅底板

大概是這樣

f_mount(&fs, "0:", 0) ; 可以 mount 成功,但是不能 open 返回錯誤碼 3 FR_NOT_READY,
f_mount(&fs, "0:", 1) ; 不能 mount 成功, 返回錯誤碼 3 FR_NOT_READY,

所以,我想事實上,SD 的mount 是沒有成功的!


SD, FreeRTOS 全部都是 CubeMX 生成,SD 開啟 DMA
SD 的時鐘為 25MHz

據我所知, CubeMX 6 已經修正相關回調函數為空的問題!(已經查過,有正呼叫回調函數並把資料列隊)
不加入 FreeRTOS 到是很正常

在 ST 的官方論壇也有看到相關問題,但是沒有可以解決問題的回應

感謝您的協助,謝謝您!


最佳答案

查看完整内容[请看2#楼]

加入FreeRTOS 已經成功 應該只有兩個小坑要填 在 sd_diskio.c 裡面 第 260 line 附近,ret 這個變數沒有宣告 自己在適當的地方加入 uint8_t ret; 做個宣告就行! 另外就是,FATFS 的資訊應該是透過列隊傳遞 (Queue) 所以,牽涉到 FATFS 的命令,都要寫在 task 裡面 例如,如果在進入 task 前就 mount SD 卡,那麼就會找不到 device 如果有長檔名支援,記得要 Enable with dynamic working buffer on the STACK 時鐘 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
 楼主| 发表于 2021-9-6 16:29:11 | 显示全部楼层
加入FreeRTOS 已經成功
應該只有兩個小坑要填
在 sd_diskio.c 裡面
第 260 line 附近,ret 這個變數沒有宣告
自己在適當的地方加入 uint8_t ret; 做個宣告就行!

另外就是,FATFS 的資訊應該是透過列隊傳遞 (Queue)
所以,牽涉到 FATFS 的命令,都要寫在 task 裡面
例如,如果在進入 task 前就 mount SD 卡,那麼就會找不到 device

如果有長檔名支援,記得要 Enable with dynamic working buffer on the STACK

時鐘的話, SDMMC 的輸入時鐘 PLL1Q可以到 100MHz 然後  SDMMC clock divide factor =2

這樣就完成了!
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2021-9-6 17:55:32 | 显示全部楼层
建议先不要上rtos,先把fatfs+sd调通
回复

使用道具 举报

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
 楼主| 发表于 2021-9-6 18:10:07 来自手机 | 显示全部楼层
lpwithv 发表于 2021-9-6 17:55
建议先不要上rtos,先把fatfs+sd调通

沒rtos不會有問題說
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-9-7 01:36:31 | 显示全部楼层
上OS,参考下我们开发板的处理方式,很多地方要关闭OS任务切换的,不然很容易出问题
回复

使用道具 举报

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
 楼主| 发表于 2021-9-7 15:10:08 | 显示全部楼层
經過排查,應該是DMA 的問題(不管有沒有OS 都出現相同問題,之前我測試沒OS的應該是沒 DMA 的)
往上很多案例都是用 CubeMX 6.0 以下的 版本
那些版本 SDIO 裡面都會有 DMA 的設定,它們都成功了!
可是,CubeMX 6.2 中, SDIO 換成 SDMMC,但沒有 DMA 的設定(我找不到)
但是 FatFas 用了 DMA template
我想應該是這裡錯了?
如果是,CubeMX SDMMC 又沒提供 DMA 選項?
只能自己改?
回复

使用道具 举报

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
 楼主| 发表于 2021-9-7 15:40:00 | 显示全部楼层
KCLin 发表于 2021-9-7 15:10
經過排查,應該是DMA 的問題(不管有沒有OS 都出現相同問題,之前我測試沒OS的應該是沒 DMA 的)
往上很多案 ...

在 H743 CubeMX 的 SDMMC 不會有 DMA 選項,可能是已經內建之類的
"The SDMMC host interface embeds a dedicated DMA controller allowing high-speed transfers between the interface and the SRAM." - from STM32H743 datasheet.

可是在 FATFS 用了 DMA template 就是會錯誤,可能還要查一下!
然後 FreeRTOS 似乎強制要用 DMA
所以,這問題是避免不了了!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-9-8 01:50:33 | 显示全部楼层
KCLin 发表于 2021-9-7 15:10
經過排查,應該是DMA 的問題(不管有沒有OS 都出現相同問題,之前我測試沒OS的應該是沒 DMA 的)
往上很多案 ...

SDIO + DMA,然后再加OS,我记得是不太好搞定。你慢慢努力吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
 楼主| 发表于 2021-9-8 09:18:45 | 显示全部楼层
完成無 OS 的 DMA 了
原來,H7 系列與 SDMMC 內建 DMA,在 CubeMX 無選項,要在 MDMA 選取
詳情請見官方文件 "Getting started with STM32H7 Series SDMMC host controller" (google 一下應該就可以)
然後在 sd_diskio.c 還有兩個有關地方要注意,自動生成的是註解掉的,要把他們打開!

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

  10. /*
  11. * Some DMA requires 4-Byte aligned address buffer to correctly read/write data,
  12. * in FatFs some accesses aren't thus we need a 4-byte aligned scratch buffer to correctly
  13. * transfer data
  14. */
  15. /* USER CODE BEGIN enableScratchBuffer */
  16. #define ENABLE_SCRATCH_BUFFER 1//*/
  17. /* USER CODE END enableScratchBuffer */
复制代码


完成後在無OS 下掛載,開關,讀寫已經都正常了
給大家參考!
回复

使用道具 举报

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
 楼主| 发表于 2021-9-8 09:20:54 | 显示全部楼层
正点原子 发表于 2021-9-8 01:50
SDIO + DMA,然后再加OS,我记得是不太好搞定。你慢慢努力吧

沒辦法,CubeMX不用 DMA 就會出錯
然後,H7 的 DMA 設定跟之前的F,M系列不一樣
還好 無OS 的已經弄出來了
晚一點再來弄 FreeRTOS
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2020-6-24
在线时间
10 小时
发表于 2021-9-27 23:27:56 | 显示全部楼层
按照您的办法,还是无法返回错误 3
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2021-3-16
在线时间
0 小时
发表于 2023-3-28 14:15:15 | 显示全部楼层
楼主,例程可以发给我一个学习吗,我正准备在767上的FreeRTOS上移植一个fatfs+sd 功能,我的邮箱  xiezhf@163.com
回复

使用道具 举报

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
 楼主| 发表于 2023-4-3 13:38:11 | 显示全部楼层
對回文的大家,很抱歉,一方面因為我在台灣很少上來,一方面因為前一陣子都在話CAD,所以,這個樓相關的詳細內容,我已經忘記了@@
還有就是,前一陣子我有出現 mount 錯誤,是因為 SD 卡的容量太大,改成16g 的就沒問題,給大家參考

BTW,很高興今天上來不必用 VPN 了!
不知道是原子已經解決了這個問題,還是只有今天?!
希望以後上來都可以不要用 VPN (可以連大陸的免費 VPN 也不多呀)
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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