STM32的HAL库学习挖坑-SD卡读写(裸机程序)

只愿长相守 提交于 2020-01-17 02:28:13

继续挖坑,裸机跑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卡可以直接读写,不需要擦除,擦除可能导致无法写入数据

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!