文章目录
一、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,以下结果表明测试成功。