SDMMC理論的基礎
•SDMMCはSD、SDIO、MMCカードホストインタフェースはAPB2周辺バス、マルチメディアカード(MMCでは)、セキュアデジタルメモリカード(SD)とSDIOカードを提供すること、を指します。
•MMCは、「マルチメディアカード」の略です-それは、多くの場合、「マルチメディアカード」と呼ばれているので、特に携帯電話やデジタルビデオなどのモバイル端末で使用される、小型の大容量フラッシュメモリカードです。
•SDカード、セキュアデジタルメモリカード(Secure Digital memory card)、モバイルデバイス用の標準的なメモリカードです。MMC、MMCと同様の大きさから開発されたSDカードのデータ転送および物理仕様。同じ長さと幅とMMC、MMCは少しよりわずかに厚いです。SDカードの互換性下位互換性マルチメディアカード(マルチメディアカード)
•SDIOは、SDIOインターフェースはデバイスに接続することができ、以前のSDメモリカードとSDIOインターフェースと互換性のある周辺インターフェース上のSDメモリカードインタフェースに基づいて開発され、現在、SPEC SDIOプロトコルに従って、SDIOインタフェースは、Bluetoothを備えたデバイス、ネットワークカード、TVカードの一般的なカテゴリをサポートしています。
開発ボードのSDカードスロットを探します
SDカードスロットを開発するための画像ボードは、SDカード内に挿入することができる1
ビュー・ピン
1)PD2はSDMMC1_CMDある;
2)PC12 SDMMC1_SCKである
。3)PC8 SDMMC1_DOする;
6)PA9伝達ピンUART1;
7)UART1あるピンP10を受信する;
8)LED PC 13ピンは、
上記情報ピンに従って配置
ピン配置
時計の設定
内部クロック(デフォルト)を使用して、
80MHzのにシステムクロックアップ
SDMMC1の24MHzのクロックを
設定パラメータSDMMC1
SDMMCCLKクロックdivIdはまた、デフォルトも0
プロジェクト生成SDMMC1
1、自定义工程名称。
2、选择英文路径,否则会丢 失启动文件而无法编译通过, 需要手动添加启动文件: startup_stm32l431xx.s
3、选择MDK-ARM V5开发软件, 即KEIL5软件。
代码编写说明
1、初始化microSD
2、读取microSD卡参数
3、写数据到microSD卡
4、读取写入microSD卡数据
调用函数:
1、HAL_SD_CardStateTypedef HAL_SD_GetCardState(SD_HandleTypeDef *hsd);//获取SD状态
2、HAL_SD_GetCardCID(SD_HandleTypeDef *hsd, HAL_SD_CardCIDTypedef *pCID);//获取SD卡ID
3、HAL_SD_WriteBlocks (SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, int32_t Timeout);
4、HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
5、HAL_GPIO_TogglePin(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin);// 运行LED
6、void HAL_Delay(uint32_t Delay);//延时
7、printf();//打印数据到串口函数 需要重新定义函数fputc();才能正常使用printf();
int fputc(int ch,FILE*f)
{
uint8_t temp[1]={ch}
HAL_UART_Transmit(&huert,temp,1,2);
return HAL_OK;
}
代码编写实现
ヘッダファイルを追加します。
書式#include「stdio.hの」
の#include「string.hの」
メイン関数を変数の定義の中に
一時uint8_t [] =「物事のクラブへようこそ」;
uint8_tのTEMP1 [] =「のIoTに購入可能である」。
主な機能定義された変数外:
HAL_SD_CardCIDTypedef SD_CardCID;
#define BLOCK_SIZE 512//块大小
#define NUMBER_OF_BLOCKS 8//块数量、
#define WRITE_READ_ADDRESS 0x00002000//读写地址
#define WRITE_READ_ADDRESS2 0x00004000//读写地址
uint32_t Buffer_Block_Tx[BLOCK_SIZE*NUMBER_OF_BLOCKSS];//数据缓存
uint32_t Buffer_Block_Rx[BLOCK_SIZE*NUMBER_OF_BLOCKSS]={1,2};//数据缓存
HAL_StatusTypeDef sd_status;//HAL返回值
void ReadSD(void);
void SD_Write_Read_Test(int32_t addr,uint8_t*temp);
達成するためのコーディング
void SD_Write_Read_Test(int32_t addr,uint8_t* temp)//写入SD卡数据并读出数据
{
int i,j = 0;
printf("\r\n\r\n*************Write SD card data *************\r\n");
sd_status=HAL_SD_WriteBlocks(&hsd1(uint8_t*)temp,addr,NUMBER_OF_BLOCKS,0xffff);
printf("Write data:%s,address:%x\r\n",temp,addr); HAL_Delay(480);
if(sd_status == 0)
{
printf("Write data test is OK\r\n" );
}
else
printf("Write data test is fail!\r\n " );
printf("*************Read SD card data *************\r\n");
sd_status=HAL_SD_ReadBlocks(&hsd1(uint8_t*)Buffer_Block_Rx,addr,NUMBER_OF_BLOCKS,0xffff); printf("ReadSDData:%s,address:%x\r\n",(char*)Buffer_Block_Rx,addr);
if(sd_status == 0)
{
printf("Read data test is OK\r\n" );
}
else printf("Read data test is fail!\r\n " );
}
void ReadSD(void)//读取SD出厂参数
{
int State=0;
State = HAL_SD_GetCardState(&hsd1);
if(State == HAL_SD_CARD_TRANSFER)
{
HAL_SD_GetCardCID(&hsd1,&SD_CardCID);
printf("\r\n Initialize SD card successfully!\r\n\r\n");
printf(" SD card information! \r\n");
printf(" CardCapacity : %llu \r\n",((unsigned long long)hsd1.SdCard.BlockSize*hsd1.SdCard.BlockNbr));
printf(" CardBlockSize : %d \r\n",hsd1.SdCard.BlockSize);
printf(" RCA : %d \r\n",hsd1.SdCard.RelCardAdd);
printf(" CardType : %d \r\n",hsd1.SdCard.CardType);
printf(" ManufacturerID: %d \r\n",SD_CardCID.ManufacturerID);
}
else {printf("SD card init fail!\r\n" );
while(1); // 停机
}
}
while(1)循环外程序:
ReadSD();//读取SD卡初始化参数
HAL_SD_ReadBlocks(&hsd1(uint8_t*)Buffer_Block_Rx,WRITE_READ_ADDRESS,NUMBER_OF_BLOCKS,0xffff);
printf("Read SD old data1:%s,address:%x\r\n",(char*)Buffer_Block_Rx,WRITE_READ_ADDRESS); memset(Buffer_Block_Rx,0x00,sizeof(Buffer_Block_Rx));
HAL_SD_ReadBlocks(&hsd1(uint8_t*)Buffer_Block_Rx,WRITE_READ_ADDRESS2,NUMBER_OF_BLOCKS,0xffff);
printf("Read SD old data2:%s,address:%x\r\n",(char*)Buffer_Block_Rx,WRITE_READ_ADDRESS2); memset(Buffer_Block_Rx,0x00,sizeof(Buffer_Block_Rx)); SD_Write_Read_Test(WRITE_READ_ADDRESS,temp); memset(Buffer_Block_Rx,0x00,sizeof(Buffer_Block_Rx)); SD_Write_Read_Test(WRITE_READ_ADDRESS2,temp1); memset(Buffer_Block_Rx,0x00,sizeof(Buffer_Block_Rx));
while(1)循环内程序:
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
HAL_Delay(1000);