【STM32+HAL】SDIO模式读写SD卡

server/2024/11/9 16:33:54/

一、准备工作

有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置

二、所用工具


1、芯片: STM32F407ZGT6
2、IDE: MDK-Keil软件
3、库文件:STM32F4xxHAL库

三、实现功能

实现用DMA读写SD卡内容

四、HAL库配置

1、开启SDIO

模式配置为1bit,开启DMA传输,开启中断

2、开启串口通信

 

至此,HAL库配置完毕 

五、Keil填写代码

1、sdio.c
/* USER CODE BEGIN 0 */
#include "stdio.h"uint8_t TX[BLOCKSIZE],RX[BLOCKSIZE];
/* USER CODE END 0 */
/* USER CODE BEGIN 1 *//*SD卡DMA写入测试函数*/
void SDCard_TestWrite_DMA(void)
{
//	printf("\r\n*** DMA Writing blocks ***\r\n");uint32_t BlockCount = 1;uint16_t BlockAddr = 6;for(uint16_t i=0;i<BLOCKSIZE; i++)TX[i] = i;HAL_SD_WriteBlocks_DMA(&hsd, TX, BlockAddr, BlockCount);
}/*SD卡DMA读取测试函数*/
void SDCard_TestRead_DMA(void)
{
//	printf("\r\n*** DMA Reading blocks ***\r\n");uint32_t BlockCount=1;uint16_t BlockAddr=6;HAL_SD_ReadBlocks_DMA(&hsd, RX, BlockAddr, BlockCount);
}/*DMA Tx传输完成回调*/
void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
{printf("DMA Write to block 6, OK\r\n");printf("Data in [0:5] is: ");for (uint16_t j=0; j<=5;j++){printf("%d,", TX[j]);}printf("\r\n");
}/*DMA Rx传输完成回调*/
void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
{printf("DMA Read block 6, OK\r\n");printf("Data in [0:5] is: ");for (uint16_t j=0; j<=5;j++){printf("%d,", RX[j]);}printf("\r\n");
}/*SD卡擦除测试*/
void SDCard_EraseBlocks(void)
{uint32_t BlockAddrStart=0;uint32_t BlockAddrEnd=10;printf("\r\n*** Erasing blocks ***\r\n");if(HAL_SD_Erase(&hsd, BlockAddrStart, BlockAddrEnd)==HAL_OK)printf("Erasing blocks,OK\r\n");elseprintf("Erasing blocks,fail\r\n");HAL_SD_CardStateTypeDef cardState=HAL_SD_GetCardState(&hsd);printf("GetCardState()= %d\r\n", cardState);while(cardState != HAL_SD_CARD_TRANSFER){HAL_Delay(1);cardState=HAL_SD_GetCardState(&hsd);}printf("Blocks 0-10 is erased.\r\n");
}/* USER CODE END 1 */

 

2、sdio.h
/*sdio.h中声明函数*/
void SDCard_TestRead(void);
void SDCard_TestWrite(void);
void SDCard_ShowInfo(void);
void SDCard_EraseBlocks(void);void SDCard_TestWrite_DMA(void);
void SDCard_TestRead_DMA(void);

3、main.c
SDCard_TestWrite_DMA();
HAL_Delay(500);
SDCard_EraseBlocks();
HAL_Delay(500);
SDCard_TestRead_DMA();/* USER CODE END 2 */

 

六、巨人之肩

【STM32+HAL】利用SDIO将大量数据存入SD卡,并根据需要读出

STM32CubeMX教程27 SDIO - 读写SD卡

七、源码提供

资源【STM32+HAL】SDIO模式读写SD卡

八、结语

本人能力有限,代码未必是最优解,若有可改进之处望在评论区留言,采纳有赏~

 


http://www.ppmy.cn/server/24067.html

相关文章

Ansible安装基本原理及操作(初识)

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月23日15点18分 Ansible 是一款功能强大且易于使用的IT自动化工具&#xff0c;可用于配置管理、应用程序部署和云端管理。它使用无代理模式&#xff08;agentles…

Visual Studio Installer 运行python 汉字

问题描述&#xff1a; Visual Studio Installer 在正常情况下运行python文件时时候&#xff0c; 不能编译中文注释&#xff0c;更不能输出中文。 解决方法&#xff1a; 在程序开头下面这一行即可。 #coding:GBK 原因及解释&#xff1a; #coding:GBK 是 Python 源文件中的一个…

针孔相机模型原理坐标系辨析内参标定流程内参变换

针孔相机的内参标定 针孔相机原理真空相机模型图片的伸缩和裁剪变换 内参标定———非线性优化张正定标定详细原理(含公式推导)通过多张棋盘格照片完成相机的内参标定流程(C代码)其他工具箱 相机分为短焦镜头和长焦镜头&#xff0c;短焦镜头看到的视野更广阔&#xff0c;同样距…

Spring6 当中 获取 Bean 的四种方式

1. Spring6 当中 获取 Bean 的四种方式 文章目录 1. Spring6 当中 获取 Bean 的四种方式每博一文案1.1 第一种方式&#xff1a;通过构造方法获取 Bean1.2 第二种方式&#xff1a;通过简单工厂模式获取 Bean1.3 第三种方式&#xff1a;通过 factory-bean 属性获取 Bean1.4 第四种…

【华为】NAT的分类和实验配置

【华为】NAT的分类和实验配置 NAT产生的技术背景IP地址分类NAT技术原理NAT分类静态NAT动态NATNAPTEasy IP&#xff08;PAT&#xff09;NAT Server 配置拓扑静态NAT测试抓包 动态NAT测试抓包 NAPT测试抓包 PAT测试抓包 NAT Server检测抓包 PC1PC2服务器 NAT产生的技术背景 随着…

Linux:升级OpenSSL和OpenSSH

原因是现有版本存在安全漏洞&#xff0c;需要升级到新版本 原有版本和升级后的版本 OpenSSL 1.0.2k-fips 26 Jan 2017 -> OpenSSL 1.1.1w 11 Sep 2023OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 -> OpenSSH_9.5p1, OpenSSL 1.1.1w 11 Sep 2023目录 查看现有版…

串联超前及对应matlab实现

串联超前校正它的本质是利用相角超前的特性提高系统的相角裕度。传递函数为&#xff1a;下面将以一个实际的例子&#xff0c;使用matlab脚本&#xff0c;实现其校正后的相位裕度≥60。

CentOS8 安装ansible

CentOS8 无法使用yum进行ansible安装&#xff0c;此次使用pip install ansible来安装ansible 大概步骤 1&#xff0c;编译安装升级python&#xff0c;centos8系统自动安装的python3.6版本过低&#xff0c;安装ansible时会有警告 2&#xff0c;安装pip 3&#xff0c;pip install…