STM32:内部フラッシュの読み取りと書き込み

1.フラッシュの基本的な知識

1.フラッシュ容量

フラッシュは、その容量に応じて次の3つのタイプに分類できます。

  • 1.小容量製品:フラッシュサイズは1〜32KB(STM32F10X_LD)
  • 2.中容量製品:フラッシュサイズは64〜128KB(STM32F10X_MD)
  • 3.大容量製品:フラッシュサイズが256KBを超える(STM32F10X_HD)

2.STライブラリ関数

STライブラリは、主にFlash操作用に次のタイプの操作API関数を提供します。

2.1フラッシュのロック解除およびロック機能

void FLASH_Unlock(void);    //解锁函数:在对Flash操作之前必须解锁
void FLASH_Lock(void);      //锁定函数:同理,操作完Flash之后必须重新上锁

2.2フラッシュ書き込み操作機能

FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);             //32位字写入函数
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);         //16位半字写入函数
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);    //用户选择字节写入函数

注:ここで説明する必要があるのは、32ビットバイトの書き込みは実際には2つの16ビットデータの書き込みであり、最初の書き込み後のアドレスは+2です。これは前に説明したSTM32フラッシュメモリプログラミングと同じです。ビットが矛盾しないたびに16を書き込む必要があります。8ビットを書き込むと、実際には2つのアドレスが使用されます。これは、基本的に16ビットを書き込むのと同じです。

2.3フラッシュ消去機能

FLASH_Status FLASH_ErasePage(uint32_t Page_Address);	//擦除一页
FLASH_Status FLASH_EraseAllPages(void);					//擦除所有页

2.4フラッシュステータスを取得する

FLASH_Status FLASH_GetStatus(void);

フラッシュの状態を取得する機能は、主にフラッシュの状態を取得し、状態に応じてフラッシュを動作させることです。この関数の戻り値は列挙型によって定義されます。コードでは、FLASH_Status型が次のように定義されていることがわかります(具体的な意味についてはコメントを参照してください)。

typedef enum {
    
    
    FLASH_BUSY = 1,       //忙
    FLASH_ERROR_PG,       //编程错误
    FLASH_ERROR_WRP,      //写保护错误
    FLASH_COMPLETE,       //操作完成
    FLASH_TIMEOUT         //操作超时
}FLASH_Status;

2.5操作が機能を完了するのを待つ

FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout);

注:フラッシュメモリの書き込み操作を実行すると、フラッシュメモリへの読み取り操作によってバスがロックされ、書き込み操作の完了後に読み取り操作を正しく実行できます。書き込みまたは消去中にコードまたはデータを読み取ることはできません。動作中。したがって、各操作の前に、最後の操作がこの操作を完了するのを待ってから開始する必要があります。

2.フラッシュの書き込みと読み取り

この操作で使用するMCUフラッシュはSTM32F103C8T6です。データシートでは、STM32F103C8T6のフラッシュ開始アドレスが0x0800 0000、STM32F103C8T6のフラッシュサイズが64Kであることがわかります。STM32F103C8T6のフラッシュアドレス範囲は次のように計算できます。 :0x0800 0000-0x0800FFFF。ここでは、読み取りおよび書き込み操作の開始アドレスとして0x0800 F000が選択されています。C8T6MCUの場合、この開始アドレスの操作は安全な範囲と見なす必要があります。

1.フラッシュ書き込み

STライブラリが提供する上記の関数に従って、次のように自分でFlash書き込み操作コードを記述できます。

#define STARTADDR 0x0800F000 //STM32F103C8T6适用

/*
 * Name:	    WriteFlashData
 * Function:	向内部Flash写入数据
 * Input:	    WriteAddress:数据要写入的目标地址(偏移地址)
 *             data[]:      写入的数据首地址
 *             num:         写入数据的个数
 */
void WriteFlashData(uint32_t WriteAddress, uint16_t data, uint32_t num)
{
    
    
	uint16_t sign =	0;	//标志位
	
	FLASH_Unlock();     //解锁Flash
	FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);  // 清除所有标志
	sign = FLASH_ErasePage(STARTADDR);	//擦除整页
	if(sign == FLASH_COMPLETE)	//Flash操作完成
	{
    
    
		for(uint32_t i=0;i<num;i++)
		{
    
    
			FLASH_ProgramHalfWord(STARTADDR+WriteAddress+i*2, data[i]);	//写入数据
		}
	}
	FLASH_Lock();	//重新锁定Flash
}

2.フラッシュ読み取り

STライブラリが提供する上記の関数に従って、次のように自分でFlash読み取り操作コードを記述できます。

#define STARTADDR 0x0800F000 //STM32F103C8T6适用
/*
 * Name:	    ReadFlashData
 * Function:	从内部Flash读取num字节数据
 * Input:	    ReadAddress:数据地址(偏移地址)
 *              dest_Data:  读取到的数据存放位置指针
 *              num:        读取字节个数
 */
void ReadFlashData(uint32_t ReadAddress, uint8_t *dest_Data, uint32_t num)
{
    
    
	for(uint32_t i=0;i<num;i++)
	{
    
    
		dest_Data[i]=*(uint8_t*)(STARTADDR+ReadAddress+i);	//读取数据
	}
}

おすすめ

転載: blog.csdn.net/MQ0522/article/details/110821265