一、准备工作
有关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卡
八、结语
本人能力有限,代码未必是最优解,若有可改进之处望在评论区留言,采纳有赏~