STM32+HAL:SDIO+DMA模式读写SD卡详解
创作时间:
作者:
@小白创作中心
STM32+HAL:SDIO+DMA模式读写SD卡详解
引用
CSDN
1.
https://blog.csdn.net/m0_60372743/article/details/138328162
一、准备工作
有关CUBEMX的初始化配置,参见相关文档。
二、所用工具
- 芯片:STM32F407ZGT6
- IDE:MDK-Keil软件
- 库文件:STM32F4xxHAL库
三、实现功能
实现用SDIO+DMA读写SD卡内容
四、HAL库配置
- 开启SDIO
- 模式配置为1bit,开启DMA传输,开启中断
- Clock transition on which the bit capture is made(时钟跳变沿捕获数据配置):数据捕获边沿设置,可设置为上升沿/下降沿
- SDIO Clock divider bypass(时钟分频器旁路使能):使能该参数时,SDIO_CLK=SDIOCLK;否则SDIO_CLK频率由时钟分频因子决定
- SDIO Clock output enable when the bus is idle(空闲模式时钟输出使能):节能模式,此实验不使能
- SDIO hardware flow control(硬件流控):设置是否使能SDIO的硬件流控,此处不使能
- SDIOCLK clock divide factor(时钟分频因子):当不使能时钟分频器旁路时,SDIO_CLK=SDIOCLK / (2+时钟分频因子)
- 开启串口通信
至此,HAL库配置完毕
五、Keil填写代码
- SD.h
#ifndef __SD_H__
#define __SD_H__
#include "sdio.h"
#include "stdio.h"
void SDCard_TestRead(void);
void SDCard_TestWrite(void);
void SDCard_ShowInfo(void);
void SDCard_EraseBlocks(uint8_t BlockAddrStart,uint8_t BlockAddrEnd);
void SDCard_Write_DMA(uint8_t *TX, uint32_t BlockCount, uint32_t BlockAddr);
void SDCard_Read_DMA(uint8_t *RX,uint32_t BlockCount,uint32_t BlockAddr);
#endif
- SD.c
篇幅有限,仅提供SD.c核心代码
/**
* @brief SD卡DMA写入函数
* @param uint8_t *TX: 写入数据数组(若要存入负数,需提前加一个数值,典型值为127,此时数据范围为-127 ~ 128)
* @param BlockCount: 写入的总片数
* @param BlockAddr: 起始写入的片数
*/
void SDCard_Write_DMA(uint8_t *TX, uint32_t BlockCount, uint32_t BlockAddr)
{
HAL_SD_WriteBlocks_DMA(&hsd, TX, BlockAddr, BlockCount); //存入TX数组数据到sd卡
}
/**
* @brief SD卡DMA读取函数
* @param uint8_t *RX: 读取数据数组(若已存入负数,需在打印时减一个数值,典型值为127,此时数据范围为-127 ~ 128)
* @param BlockCount: 读取的总片数
* @param BlockAddr: 起始读取的片数
*/
void SDCard_Read_DMA(uint8_t *RX, uint32_t BlockCount, uint32_t BlockAddr)
{
HAL_SD_ReadBlocks_DMA(&hsd, RX, BlockAddr, BlockCount); //读取sd卡数据到RX数组
}
/**
* @brief SD卡擦除函数
* @param BlockAddrStart: 擦除开始块数
* @param BlockAddrEnd: 擦除结束块数
*/
void SDCard_EraseBlocks(uint8_t BlockAddrStart,uint8_t BlockAddrEnd)
{
printf("\r\n*** Erasing blocks ***\r\n");
if(HAL_SD_Erase(&hsd, BlockAddrStart, BlockAddrEnd)==HAL_OK) //擦除数据
printf("Erasing blocks,OK\r\n");
else
printf("Erasing blocks,fail\r\n");
HAL_SD_CardStateTypeDef cardState=HAL_SD_GetCardState(&hsd);
printf("GetCardState()= %d\r\n", cardState); //打印当前sd卡数据状态
while(cardState != HAL_SD_CARD_TRANSFER)
{
HAL_Delay(1);
cardState=HAL_SD_GetCardState(&hsd);
}
printf("Blocks %d-%d is erased.\r\n",BlockAddrStart, BlockAddrEnd);
}
- main.c
uint8_t rx[BLOCKSIZE],tx[BLOCKSIZE];
/* USER CODE BEGIN 2 */
printf("Hello World\r\n");
HAL_Delay(500);
SDCard_Write_DMA(tx,1,6);
HAL_Delay(500);
SDCard_Read_DMA(rx,1,6);
HAL_Delay(500);
SDCard_EraseBlocks(0,10);
/* USER CODE END 2 */
六、巨人之肩
- 【STM32+HAL】利用SDIO将大量数据存入SD卡,并根据需要读出
- STM32CubeMX教程27 SDIO - 读写SD卡
七、源码提供
资源【STM32+HAL】SDIO+DMA模式读写SD卡
八、更多DMA应用
详见【STM32+HAL】DMA应用
九、结语
本文介绍了使用STM32F407ZGT6芯片通过MDK-Keil软件和STM32F4xxHAL库实现SD卡读写的具体步骤,包括HAL库配置、代码实现等,并提供了核心代码示例。希望对从事嵌入式系统开发的工程师有所帮助。
热门推荐
右眼皮跳的预防措施
《易经》中“大人虎变 小人革面 君子豹变”该如何理解?
每次考试紧张应该怎么办 怎样克服考试紧张心理
A股午后拉升,超百股涨停!“抢反弹”资金已出手这三大板块
百度云盘如何泄露
背靠背,脸对脸
百家姓之24—张姓,起源·迁徙·家训·名人故事
南欧国家为何能实现经济“逆袭”
如何应用技术分析工具进行股票交易?这些工具对投资策略有何指导意义?
小学生自制运动打卡表怎么制作?
管涛:什么影响了日元汇率涨跌
如何选择正确的电气元件?——实用选型原则与步骤详解
真菌感染,你真的了解吗?最新中国抗真菌管理共识来了!
掌握研究论文的参考文献风格
如何进入小区并了解其管理规定?这些规定如何保障居民安全?
户用光伏创新技术,引领光伏时代进步
黄金眼镜蛇雷龙鱼公母【如何正确区分黄金眼镜蛇雷龙鱼的公母?】
零下18度能冻死蛆虫吗
肠梗阻怎么加速排气的方法
辅酶Q10最佳服用时间
拜访过程中,如何控制时间和话题符合礼仪
虎皮鹦鹉公母分辨图
科研经费上不封顶,安家费给到300万,山东高校大手笔“冬窗引援”
公证机构参与,郑州城市执法有了"透明账本"
C语言控制台程序中文输出乱码的解决方案
宝宝抓周吉日怎么选
前端如何获取httpOnly
刑事辩护中的辩护意见书撰写
夜来香的养殖方法与注意事项(打造花园中的香气之王)
记忆力下降可以通过补充DHA来改善吗