STM32: Lectura y escritura de Flash interno

1. Conocimientos básicos de Flash

1. Capacidad de destello

El flash se puede dividir en los siguientes tres tipos según su capacidad:

  • 1. Productos de pequeña capacidad: el tamaño del flash es de 1 a 32 KB (STM32F10X_LD)
  • 2. Productos de capacidad media: el tamaño del flash es de 64-128 KB (STM32F10X_MD)
  • 3. Productos de gran capacidad: el tamaño del flash es superior a 256 KB (STM32F10X_HD)

2. Funciones de la biblioteca ST

La biblioteca ST proporciona principalmente los siguientes tipos de funciones de API de operación para operaciones Flash:

2.1 Funciones de desbloqueo y bloqueo de flash

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

2.2 Función de operación de escritura flash

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);    //用户选择字节写入函数

Nota: Debe explicarse aquí que la escritura de bytes de 32 bits son en realidad dos datos de 16 bits escritos y la dirección +2 después de la primera escritura. Esto es lo mismo que la programación de memoria flash STM32 que explicamos anteriormente. Se debe escribir 16 cada vez que Bit no sea contradictorio. Escribir 8 bits en realidad ocupa dos direcciones, lo que es básicamente lo mismo que escribir 16 bits.

2.3 Función de borrado de flash

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

2.4 Obtener el estado de Flash

FLASH_Status FLASH_GetStatus(void);

La función de obtener el estado del Flash es principalmente obtener el estado del Flash, para operar el Flash según el estado. El valor de retorno de esta función está definido por el tipo de enumeración. En el código, puede ver que el tipo FLASH_Status se define de la siguiente manera (consulte los comentarios para conocer el significado específico):

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

2.5 Esperando que la operación complete la función

FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout);

Nota: Cuando se realiza la operación de escritura en la memoria flash, cualquier operación de lectura en la memoria flash bloqueará el bus y la operación de lectura se puede realizar correctamente después de que se complete la operación de escritura; el código o los datos no se pueden leer durante la escritura o el borrado operación en funcionamiento. Entonces, antes de cada operación, tenemos que esperar a que la última operación complete esta operación antes de comenzar.

2. Escritura y lectura flash

La MCU utilizada en esta operación Flash es STM32F103C8T6. En la hoja de datos, puede ver que la dirección de inicio flash de STM32F103C8T6 es 0x0800 0000, y el tamaño de Flash de STM32F103C8T6 es 64 K. Se puede calcular que el rango de direcciones Flash de STM32F103C8T6 es : 0x0800 0000—— 0x0800 FFFF. Aquí, 0x0800 F000 se selecciona como la dirección de inicio para las operaciones de lectura y escritura.Para el MCU C8T6, operar esta dirección de inicio debe considerarse un rango seguro.

1. Escritura flash

De acuerdo con las funciones anteriores proporcionadas por la biblioteca ST, podemos escribir el código de operación de escritura Flash por nosotros mismos de la siguiente manera:

#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. Lectura flash

De acuerdo con las funciones anteriores proporcionadas por la biblioteca ST, podemos escribir el código de operación de lectura de Flash por nosotros mismos de la siguiente manera:

#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);	//读取数据
	}
}

Supongo que te gusta

Origin blog.csdn.net/MQ0522/article/details/110821265
Recomendado
Clasificación