为了便于交流共同学习,博主QQ群242629020(stm32-MCU认认真真交流群) 欢迎批评指导!!!电梯:https://jq.qq.com/?_wv=1027&k=5n1AfYq
使用的芯片:STM32F407ZGT6
使用的cubemx版本:V4.24
使用的cubemx支持包:F4 1.19
使用的MDK版本:MDK5.22
//-------------------------------先唠一会儿---------------------------------------------------------------
cubeMX这个软件好用是挺好用,但还是有一些隐藏的坑会让你很抓狂,这个功能我搞了2天才找到这个坑的位置,同样也是进行了无数次的baidu&Google。问题就是在于cubeMX生成的回调函数名称错误!
//-------------------------------------------------------------------------------------------------
1.先来看看引脚功能配置,看下图。
2.然后是时钟配置
3.SDIO配置
因篇幅所限,这里就列出需要修改的地方,我会在文章后头贴出cubemx配置的详细报告还会附上整个工程!
使能SDIO全局中断
使能SDIO发送接收DMA
4.接下来是配置FATFS
5.FreeRTOS配置
扩大堆栈
使能消息队列功能
扩大任务堆栈
6.生成代码
扩大堆栈
生成单独的C文件
cubeMX配置到此结束
//---------------------------------------------------------------------------------------------------------
接下来配置keil
这些都是CubeMX帮我们生成好的初始化文件
先看main.c
main.c中进行了SDIO功能的初始化
在sdio.c中我们可以看到这样的初始化
可能你会很奇怪,妈耶!怎么写完结构体后竟然没执行初始化动作! 我看到网上好多兄dei们都觉得这儿cubeMX做错了,其实它没错,cubemx只是把初始化那个语句放到了bsp_driver_sd.c文件中了
还有兄dei说cubemx帮我们生成了错误的DMA配置,这纯属瞎扯!
bsp_driver_sd.c是CubeMX帮我们自动生成好的FATFS底层操作驱动。
然后我们也不需要自己去调用BSP_SD_Init()这个函数,在freertos.c ->StartDefaultTask默认任务中进行了文件系统的初始化,在文件系统初始化函数中已经调用了BSP_SD_Init()这个函数了,调用了这个函数也就把SD driver初始化好了。
虽然SD driver初始化好了,你编译后下载到板子中SD卡仍然是无法工作,程序将会在f_oepn()的时候报错中,返回的错误告诉你FR_DISK_ERR :A hard error occurred in the low level disk I/O layer
这是因为cube帮我们生成好的sd_diskio.c中还有些问题,需要我们手动修改一下,就是这个坑!
在sd_diskio.c中我们看到cube帮我们自动生成了2个回调函数,回调函数中进行了操作系统的消息队列的操作,但是这2个回调函数是由BSP开头的,这个开头的回掉函数HAL库是无法直接识别到的,也就无法调用,无法调用底层就无法设置SD卡现在的状态。
所以我们要添加2个回调函数来调用这2个非标准的回调函数。我将这个操作加在了stm32f4xx_it.c这个文件中
最终成功实现了基于freertos的SD卡的读写操作。
fatfs的操作步骤:
f_mount
f_open
f_write/f_read
f_close
这些操作自己随便组合吧!
需要注意的地方:
1.SDIO模式在选择了4B数据线的情况下必须插入SD卡才能初始化通过,否则程序将上电就卡死在MX_SDIO_Init中!选择1B模式不会这样。
我的工程中写了一个SD卡读写的应用程序模块fatfs_app.c,我觉得用得挺方便,简化了fatfs的操作。
篇幅所限就补贴出来了。感兴趣的兄dei可以去下载我的整个工程,这里附上下载链接:
工程下载链接:
https://download.csdn.net/download/mryarnell/10397561
CubeMX配置详细报告:
https://download.csdn.net/download/mryarnell/10397572
为了便于交流共同学习,博主QQ群242629020(stm32-MCU认认真真交流群) 欢迎批评指导!!!电梯:https://jq.qq.com/?_wv=1027&k=5n1AfYq