Directorio de artículos
Uno, sd introducción
Un poco, hay tiempo para recuperarse.
Dos, interfaz sdmmc
Un poco, hay tiempo para recuperarse.
Tres, configuración cubemx
3.1 Configuración del reloj
sdmmc está configurado a 48MHz.
3.2 Configurar el modo sd
Elija un bus de 4 bits de ancho y el reloj se divide por 4, es decir, 48 M / 4 = 12 M. El reloj está relacionado con el dispositivo y no puede exceder el reloj máximo permitido por el dispositivo.
Cuatro, escribe el programa de prueba
4.1 Definición de macro
#define block_size 512 //sd块大小512字节
#define number_of_block 5 //测试的块数量为5
#define test_addr 0x00002000 //要写入sd卡的地址为0x00002000
4.2 Definir la matriz de prueba y los datos de información 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 Obtener información de la tarjeta 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 Prueba de lectura y escritura
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 Asuntos que necesitan atención
Configure la pila del archivo de inicio; de lo contrario, la pila se desbordará.
Cinco, resultados de la prueba
5.1 Obtener información de la tarjeta SD
5.2 Prueba de lectura y escritura
Lea los datos escritos Si la escritura falla, la salida es 0. Los siguientes resultados indican que la prueba fue exitosa.