点击左侧 System Core 选择RCC
Mode下 High Speed Clock (HSE) 选择 CryStal/Ceramic Resonator 其他不用管
点击左侧SYS 下拉Debug栏 如果你用的是Jlink SW调试器 就选择 Serial Wire 其他的话自行百度
GPIOSeting (不同的开发版封装可能不同 具体参考自己开发板的用户手册) 另外 如果发现工程默认配置的引脚和你用户手册的引脚不相同的话不要慌 在右侧芯片那里复用一下你原理图上的引脚
其他的Seting 不用管直接默认就好
点击上方Clock Configuration 打开时钟树 点击HSE PLLCLK 按钮 分频一般情况下分别为1 4 2 主频的话根据自己开发板定
点击Peijct Manager 左侧的 Code Generator 勾选上图示选项
点击左侧Project 配置好项目名称 路径 等等
画圈部分:选择自己的IDE 我用的keil5 所以选择 MDK-ARM
大功告成!!!点击右上角GENERATE CODE
等待生成成功后 打开MDK-ARM文件夹 进入keil
在main.c 文件 main函数外定义两个数组 wBuff 和 rBuff 大小为512.
uint8_t wBuff[512]; //写缓冲区
uint8_t rBuff[512]; //读缓冲区
这两个缓冲区作用是什么?
用于存放你想写入的数据和你读取到的数据
先放上代码 进行分块讲解
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);
}
for (int i = 0 ; i < 512 ; i++ ) //填充写缓冲区
{
wBuff[i] = 0xBB; //无所谓想等于什么就等于什么
}
你想写入什么东西就往wBuff里放什么东西 为方便调试 for循环里令数组各位都=0xBB;
while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER);
HAL_SD_GetCardState(&hsd)这个接口是HAL库提供的获取SD卡状态的接口 若返回值为HAL_SD_CARD_TRANSFER 就代表sd卡处于准备传输状态
while循环的作用是若sd卡的状态不为准备传输状态就一直死等 若为准备传输状态就进行下一步操作
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参数都一样
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);
这样写也是为了方便调试
完事儿 生成一下 写入板子 进行调试
打两个断点 分别在读写语句
添加观察变量 rBuff 是否与写的数据一样
首先全速执行到断点处
然后单语句执行观察调完函数有没有卡在while死循环
执行完毕观察变量 rBuff 是否与写的数据一样
一摸一样 实验完毕 !
PS:如果要用DMA或者中断方式读写 CubeMX都已经配置完毕了 调用接口时有注意事项 要添加中断标志位 检查中断状态等等 具体参考stm32f4_hal_sd.c文件