继续挖坑,裸机跑8GB的SD卡读写。
PS:跑系统是不可能跑系统的,这辈子都不可能能跑系统的(滑稽)
实现功能:
1.成功识别SD卡,通过串口打印SD卡配置信息
2.读取SD卡数据,通过串口打印读取到的SD卡数据
3.写SD卡数据,通过串口打印写入后读取到的SD卡数据
由于没有JLINK,只能通过dfu烧录文件,所以先通过STM32CubeMX配置串口,异步收发,串口波特率为115200,其它选项默认。
设置SDIO相关数据,SDIO时钟频率=APB2/分频系数,由于MCU的时钟频率84Mhz,此时SDIO的时钟频率=84/84=1M
设置SDIO中断(好像没啥用,具体没测试过)
设置SDIO的管脚模式!!!设置SDIO的管脚模式!!!设置SDIO的管脚模式!!!
重要的事情要说三遍,由于硬件没有上拉电阻,导致调用函数SD_FindSCR失败,程序死机。
然后直接生成代码,在while(1)之前增加以下代码
/* USER CODE BEGIN 2 */
printf( "CardType is :%d\r\n", hsd.SdCard.CardType);
printf( "CardCapacity is :%d\r\n", hsd.SdCard.BlockNbr);
printf( "CardBlockSize is :%d\r\n", hsd.SdCard.BlockSize);
printf( "RCA is :%d\r\n", hsd.SdCard.RelCardAdd);
printf( "CardVersion is :%d\r\n", hsd.SdCard.CardVersion);
printf( "Class is :%d\r\n", hsd.SdCard.Class);
printf( "LogBlockNbr is :%d\r\n", hsd.SdCard.LogBlockNbr);
printf( "LogBlockSize is :%d\r\n", hsd.SdCard.LogBlockSize);
SD_Test();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
其他定义和函数原型
#define BLOCK_SIZE 512 // SD卡块大小
#define NUMBER_OF_BLOCKS 8 // 测试块数量(小于15)
#define WRITE_READ_ADDRESS 0x00000000 // 测试读写地址
uint8_t Buffer_Block_Tx[BLOCK_SIZE*NUMBER_OF_BLOCKS]; // 写数据缓存
uint8_t Buffer_Block_Rx[BLOCK_SIZE*NUMBER_OF_BLOCKS]; // 读数据缓存
void SD_Test(void)
{
uint32_t index = 0;
HAL_StatusTypeDef sd_status;
//擦除前数据
HAL_SD_ReadBlocks(&hsd, Buffer_Block_Rx, WRITE_READ_ADDRESS, NUMBER_OF_BLOCKS, 0xffff);
HAL_Delay(5000);
printf("擦除前数据\r\n" );
for (index = 0; index < BLOCK_SIZE*NUMBER_OF_BLOCKS; index++)
printf("%02x",Buffer_Block_Rx[index]);
printf("\r\n" );
/*不需要擦除数据 SD卡类型为HC-8GB*/
printf("写入数据\r\n" );
for (index = 0; index < BLOCK_SIZE*NUMBER_OF_BLOCKS; index++)
{
Buffer_Block_Tx[index] = (index&0xff);
printf("%02x",Buffer_Block_Tx[index]);
}
printf("\r\n" );
HAL_SD_WriteBlocks(&hsd, Buffer_Block_Tx, WRITE_READ_ADDRESS, NUMBER_OF_BLOCKS, 0xffff);
printf("\r\n" );
HAL_Delay(5000);
/* 读取刚刚擦除的区域 */
HAL_SD_ReadBlocks(&hsd, Buffer_Block_Rx, WRITE_READ_ADDRESS, NUMBER_OF_BLOCKS, 0xffff);
HAL_Delay(5000);
printf("读取写入数据\r\n" );
for (index = 0; index < BLOCK_SIZE*NUMBER_OF_BLOCKS; index++)
printf("%02x",Buffer_Block_Rx[index]);
printf("\r\n" );
}
最后编译烧录,~OK
另外需要注意部分SD卡可以直接读写,不需要擦除,擦除可能导致无法写入数据
来源:CSDN
作者:09K
链接:https://blog.csdn.net/qwe83877536/article/details/104008842