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