学習日記--SDIO-SDMMC1(2020年2月13日)

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);
リリース9件のオリジナルの記事 ウォンの賞賛0 ビュー291

おすすめ

転載: blog.csdn.net/quanqueen/article/details/104331816