STM32F4 SD卡单块读写(CubeMX+Keil+HAL库+SDIO)不含文件系统

SD卡单块读写

    • 一、使用CubeMX生成keil工程模板
      • 1.1打开CubeMX软件 新建工程
      • 1.2配置工程
        • 1.2.1配置RCC
        • 1.2.2 配置SYS
        • 1.2.3 配置SDIO
        • 1.2.4 配置时钟树
        • 1.2.5生成keil工程模板
    • 二、调用HAL库接口
      • 2.1.定义读写数据缓冲区
      • 2.2调用读写接口
        • 2.2.1for循环的作用是填充wBuff
        • 2.2.3while是在干什么?
        • 2.2.4HAL_SD_WriteBlocks和HAL_SD_ReadBlocks接口参数
        • 2.2.5 if语句的作用
    • 三、调试
    • 博客仅供参考 有问题可以在评论区留言 或者私信我 大家一起探讨一下。

一、使用CubeMX生成keil工程模板

1.1打开CubeMX软件 新建工程

STM32F4 SD卡单块读写(CubeMX+Keil+HAL库+SDIO)不含文件系统_第1张图片
等待一段时间…

1.2配置工程

1.2.1配置RCC

点击左侧 System Core 选择RCC
Mode下 High Speed Clock (HSE) 选择 CryStal/Ceramic Resonator 其他不用管
在这里插入图片描述

1.2.2 配置SYS

点击左侧SYS 下拉Debug栏 如果你用的是Jlink SW调试器 就选择 Serial Wire 其他的话自行百度
STM32F4 SD卡单块读写(CubeMX+Keil+HAL库+SDIO)不含文件系统_第2张图片

1.2.3 配置SDIO

不一一赘述 对比图片配置
STM32F4 SD卡单块读写(CubeMX+Keil+HAL库+SDIO)不含文件系统_第3张图片
DMA Setting
STM32F4 SD卡单块读写(CubeMX+Keil+HAL库+SDIO)不含文件系统_第4张图片

GPIOSeting (不同的开发版封装可能不同 具体参考自己开发板的用户手册) 另外 如果发现工程默认配置的引脚和你用户手册的引脚不相同的话不要慌 在右侧芯片那里复用一下你原理图上的引脚
STM32F4 SD卡单块读写(CubeMX+Keil+HAL库+SDIO)不含文件系统_第5张图片
其他的Seting 不用管直接默认就好

1.2.4 配置时钟树

点击上方Clock Configuration 打开时钟树 点击HSE PLLCLK 按钮 分频一般情况下分别为1 4 2 主频的话根据自己开发板定
STM32F4 SD卡单块读写(CubeMX+Keil+HAL库+SDIO)不含文件系统_第6张图片

1.2.5生成keil工程模板

点击Peijct Manager 左侧的 Code Generator 勾选上图示选项
STM32F4 SD卡单块读写(CubeMX+Keil+HAL库+SDIO)不含文件系统_第7张图片
点击左侧Project 配置好项目名称 路径 等等
画圈部分:选择自己的IDE 我用的keil5 所以选择 MDK-ARM
STM32F4 SD卡单块读写(CubeMX+Keil+HAL库+SDIO)不含文件系统_第8张图片
大功告成!!!点击右上角GENERATE CODE
等待生成成功后 打开MDK-ARM文件夹 进入keil

二、调用HAL库接口

2.1.定义读写数据缓冲区

在main.c 文件 main函数外定义两个数组 wBuff 和 rBuff 大小为512.

	uint8_t wBuff[512]; //写缓冲区
	uint8_t rBuff[512]; //读缓冲区

这两个缓冲区作用是什么?
用于存放你想写入的数据和你读取到的数据

2.2调用读写接口

先放上代码 进行分块讲解

for (int i = 0 ; i < 512 ; i++ ) //填充写缓冲区
{
	wBuff[i] = 0xBB; //无所谓想等于什么就等于什么
}
while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER); //如果不处于传输状态就一直死等
if (HAL_SD_WriteBlocks(&hsd,wBuff,0x0,1,0xff))
{
	while(1);
}
while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER); //如果不处于传输状态就一直死等
if (HAL_SD_ReadBlocks(&hsd,rBuff,0x0,1,0xff))
{
	while(1);
}
2.2.1for循环的作用是填充wBuff
for (int i = 0 ; i < 512 ; i++ ) //填充写缓冲区
{
	wBuff[i] = 0xBB; //无所谓想等于什么就等于什么
}

你想写入什么东西就往wBuff里放什么东西 为方便调试 for循环里令数组各位都=0xBB;

2.2.3while是在干什么?
while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER);

HAL_SD_GetCardState(&hsd)这个接口是HAL库提供的获取SD卡状态的接口 若返回值为HAL_SD_CARD_TRANSFER 就代表sd卡处于准备传输状态
while循环的作用是若sd卡的状态不为准备传输状态就一直死等 若为准备传输状态就进行下一步操作

2.2.4HAL_SD_WriteBlocks和HAL_SD_ReadBlocks接口参数
HAL_SD_WriteBlocks(&hsd,wBuff,0x0,1,0xff)HAL_SD_ReadBlocks(&hsd,rBuff,0x0,1,0xff)

HAL_SD_WriteBlocks函数共有五个参数
1.&hsd 不用变 在sd卡初始化的时候生成的此变量 为sd卡句柄
2.wBuff 你要写的数据
3.要写的块的地址
4.要写的快的数量
5、timeout 超时时间
HAL_SD_ReadBlocks和HAL_SD_WriteBlocks参数都一样

2.2.5 if语句的作用
if (HAL_SD_WriteBlocks(&hsd,wBuff,0x0,1,0xff))
{
	while(1);
}

要明白if的作用要先知道 HAL_SD_WriteBlocks和HAL_SD_ReadBlocks的返回值
如果 读/写 成功 return 0;
如果 读/写 失败 return 1;
可以简单理解为这样 如果读写失败的话if语句成立 就会进入while(1);
这样写也是为了方便调试
完事儿 生成一下 写入板子 进行调试

三、调试

打两个断点 分别在读写语句
STM32F4 SD卡单块读写(CubeMX+Keil+HAL库+SDIO)不含文件系统_第9张图片
添加观察变量 rBuff 是否与写的数据一样
首先全速执行到断点处
然后单语句执行观察调完函数有没有卡在while死循环
执行完毕观察变量 rBuff 是否与写的数据一样
STM32F4 SD卡单块读写(CubeMX+Keil+HAL库+SDIO)不含文件系统_第10张图片
一摸一样 实验完毕 !

博客仅供参考 有问题可以在评论区留言 或者私信我 大家一起探讨一下。

PS:如果要用DMA或者中断方式读写 CubeMX都已经配置完毕了 调用接口时有注意事项 要添加中断标志位 检查中断状态等等 具体参考stm32f4_hal_sd.c文件

你可能感兴趣的:(项目笔记,stm32,单片机,arm)