STM32的HAL庫學習挖坑-SD卡讀寫(裸機程序)

繼續挖坑,裸機跑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卡可以直接讀寫,不需要擦除,擦除可能導致無法寫入數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章