cubemx配置sdcard

一、sd介绍

略,有时间补上。

二、sdmmc接口

略,有时间补上。

三、cubemx配置

3.1时钟配置

sdmmc配置成48MHz。
在这里插入图片描述

3.2 配置sd模式

选择4位宽总线,时钟为4分频,即48M/4=12M,时钟与器件有关,不能超过器件允许的最大时钟。
在这里插入图片描述

四、编写测试程序

4.1 宏定义

#define block_size 512       //sd块大小512字节
#define number_of_block  5   //测试的块数量为5  
#define test_addr  0x00002000  //要写入sd卡的地址为0x00002000

4.2 定义测试数组和sd信息数据

	HAL_SD_CardInfoTypeDef SDCardInfo1;//sd卡信息数据
	uint16_t write_data[block_size*number_of_block/2] = {
    
    0};//待写入sd卡的数据
	uint16_t read_data[block_size*number_of_block/2] = {
    
    0};//从sd卡读出数据
	uint16_t i;//用于遍历数组的自增量
	
	//将待写入数组初始化为累加的量
	for( i = 0;i<(block_size*number_of_block/2);i++)
	{
    
    
		write_data[i]=i;
	}

4.3 获取sd卡信息

	HAL_SD_GetCardInfo(&hsd1,&SDCardInfo1);//获取sd卡信息
	printf(" SD card information! \r\n");
	printf(" CardBlockSize : %d \r\n",SDCardInfo1.BlockSize);
	printf(" RCA           : %d \r\n",SDCardInfo1.RelCardAdd);
	printf(" CardType      : %d \r\n",SDCardInfo1.CardType);

4.4 读写测试

	HAL_SD_WriteBlocks(&hsd1,(uint8_t *)write_data,test_addr,number_of_block,100);
	while(HAL_SD_GetCardState(&hsd1) != HAL_SD_CARD_TRANSFER){
    
    };
	HAL_SD_ReadBlocks(&hsd1,(uint8_t *)read_data,test_addr,number_of_block,100);
	while(HAL_SD_GetCardState(&hsd1) != HAL_SD_CARD_TRANSFER){
    
    };
	for(i = 0;i<(block_size*number_of_block/2);i++)
	{
    
    
		printf("read_data[%d]:%d\r\n",i,read_data[i]);
	}

4.5 注意事项

设置启动文件的堆栈,不然堆栈溢出。
在这里插入图片描述

五、测试结果

5.1 获取sd卡信息

在这里插入图片描述

5.2 读写测试

将写入的数据读取出来,如果写入失败输出的是0,以下结果表明测试成功。
在这里插入图片描述

六、例程

七、参考链接

微雪课堂教程

猜你喜欢

转载自blog.csdn.net/weixin_43810563/article/details/114900778