关于STM32F103C8T6内部Flash划分的详细说明

2023-07-11  

因为STM32的内部FLASH大小不一,不同的大小划分是不一样的,但是大同小异这里是以STM32F103C8T6为例进行说明。


基础知识补充:

1 字节       = 8 位(bit)

1 千字节(KB)= 1024 字节

1 兆字节(MB)= 1024 千字节(KB)

1 吉字节(GB)= 1024 兆字节(MB)

1 太字节(TB)= 1024 吉字节(GB)

下面是关于STM32F103C8T6内部Flash划分的详细说明:


容量:

STM32F103C8T6的内部Flash容量为64KB,即64 * 1024字节,属于小容量产品。


以下是针对STM32F1系列芯片的常见型号,按照容量范围划分的示例:

1.jpg

扇区划分:

内部Flash存储器被划分为多个扇区,每个扇区的大小为2KB或4KB,具体划分取决于具体的芯片型号。


Flash大小为 64KB, 地址范围:0x08000000-0x08010000-1,单个扇区大小:1KB=0x400,最后一个扇区地址:0x0800FC00


Flash大小为 128KB,地址范围:0x08000000-0x08020000-1,单个扇区大小:1KB=0x400,最后一个扇区地址:0x0801FC00


Flash大小为 256KB,地址范围:0x08000000-0x08040000-1,单个扇区大小:2KB=0x800,最后一个扇区地址:0x0803F800


Flash大小为 512KB,地址范围:0x08000000-0x08080000-1,单个扇区大小:2KB=0x800,最后一个扇区地址:0x0807F800


STM32的内部FLASH是干什么用的?

STM32的内部Flash主要用于存储程序代码(固件)和只读数据。


程序代码(固件):内部Flash是存储微控制器的程序代码的主要地方。它包含了应用程序的指令集,包括启动代码、中断处理程序、函数和其他执行代码。这些代码定义了系统的功能和行为。通常是编译生成的HEX文件或者BIN文件。


只读数据:内部Flash还可以用于存储只读数据,如常量、配置信息和校准数据等。这些数据在程序执行期间是只读的,不会被修改。


Bootloader:一些STM32芯片内置了Bootloader,它是一个特殊的程序,用于在启动时加载和更新应用程序的固件。Bootloader通常存储在内部Flash的特定区域,并负责固件的升级和管理。


STM32的内部FLASH该如何读写数据呢?

读写内部FLASH的一般步骤

在STM32微控制器中,内部Flash的读写操作通常通过以下步骤进行:


启用Flash访问:在进行Flash读写之前,需要先启用对Flash的访问权限。这可以通过设置Flash控制寄存器(FLASH_CR)中的特定位来实现。例如,将FLASH_CR的PG位设置为1,表示启用对Flash的编程访问。

解锁Flash:在进行Flash编程之前,需要解锁Flash以允许对其进行写操作。通过向FLASH_KEYR寄存器写入特定值来解锁Flash。要解锁Flash,首先写入0x45670123,然后立即写入0xCDEF89AB到FLASH_KEYR寄存器。

检查Flash状态:在进行Flash编程之前,需要检查Flash是否处于忙碌状态。可以通过读取FLASH_SR寄存器中的BSY位来判断Flash是否处于忙碌状态。如果BSY位为1,表示Flash正在执行操作,需要等待。

执行Flash编程:Flash编程可以通过直接写入特定地址处的数据来实现。要编程Flash,将要写入的数据写入Flash目标地址。请注意,写入操作是按字进行的,即每次写入4个字节。可以使用特定的函数或指针访问要编程的Flash地址。

等待Flash操作完成:在执行Flash编程后,需要等待编程操作完成。可以通过轮询FLASH_SR寄存器中的BSY位来检查Flash是否仍处于忙碌状态。当BSY位为0时,表示Flash操作已完成。

锁定Flash:完成Flash编程后,应该锁定Flash以防止意外修改。通过将FLASH_CR寄存器中的LOCK位设置为1,可以锁定Flash。

请注意,进行Flash编程时需要小心,因为不正确的操作可能会导致Flash数据的损坏。建议在编程Flash之前仔细阅读相关的芯片参考手册,并按照手册中提供的准确步骤和注意事项进行操作。需要注意的是可以使用官方提供的库和API函数来简化Flash读写的操作。


库函数接口操作内部FLASH接口解析

解锁Flash代码解析

/**

  * @brief  Unlocks the FLASH Bank1 Program Erase Controller.

  * @note   This function can be used for all STM32F10x devices.

  *         - For STM32F10X_XL devices this function unlocks Bank1.

  *         - For all other devices it unlocks Bank1 and it is 

  *           equivalent to FLASH_Unlock function.

  * @param  None

  * @retval None

  */

void FLASH_UnlockBank1(void)

{

  /* Authorize the FPEC of Bank1 Access */

  FLASH- >KEYR = FLASH_KEY1;

  FLASH- >KEYR = FLASH_KEY2;

}


这段代码是用于解锁STM32的Bank1程序擦除控制器(Program Erase Controller)。以下是该代码的解释:


该函数用于解锁STM32的Bank1程序擦除控制器,适用于所有STM32F10x系列的设备。对于STM32F10X_XL系列的设备,该函数解锁Bank1。对于其他设备,它解锁Bank1并等效于FLASH_Unlock函数。


该函数没有参数。


函数的返回值为None。


函数内部的操作是通过向FLASH- >KEYR寄存器写入特定值来实现解锁。具体来说,两次写入FLASH_KEY1(宏定义的值)到FLASH- >KEYR寄存器,以解锁Bank1的访问权限。


/**

  * @brief  Unlocks the FLASH Bank2 Program Erase Controller.

  * @note   This function can be used only for STM32F10X_XL density devices.

  * @param  None

  * @retval None

  */

void FLASH_UnlockBank2(void)

{

  /* Authorize the FPEC of Bank2 Access */

  FLASH- >KEYR2 = FLASH_KEY1;

  FLASH- >KEYR2 = FLASH_KEY2;


}


/**

  * @brief  Unlocks the FLASH Program Erase Controller.

  * @note   This function can be used for all STM32F10x devices.

  *         - For STM32F10X_XL devices this function unlocks Bank1 and Bank2.

  *         - For all other devices it unlocks Bank1 and it is equivalent 

  *           to FLASH_UnlockBank1 function.. 

  * @param  None

  * @retval None

  */

void FLASH_Unlock(void)

{

  /* Authorize the FPEC of Bank1 Access */

  FLASH- >KEYR = FLASH_KEY1;

  FLASH- >KEYR = FLASH_KEY2;


#ifdef STM32F10X_XL

  /* Authorize the FPEC of Bank2 Access */

  FLASH- >KEYR2 = FLASH_KEY1;

  FLASH- >KEYR2 = FLASH_KEY2;

#endif /* STM32F10X_XL */

}

总结:FLASH_Unlock包括 FLASH_UnlockBank1和 FLASH_UnlockBank2取决于芯片类型

/* FLASH Keys */

#define RDP_Key                  ((uint16_t)0x00A5)

#define FLASH_KEY1               ((uint32_t)0x45670123)

#define FLASH_KEY2               ((uint32_t)0xCDEF89AB)


1. RDP_Key:

   这是用于设置读保护(RDP)级别的密钥。读保护是一种保护机制,用于防止未授权的读取对Flash的访问。通过将RDP_Key写入特定的Flash寄存器,可以设置读保护级别。0x00A5是预定义的RDP_Key值。


2. FLASH_KEY1和FLASH_KEY2:

   这两个密钥是用于解锁Flash的访问权限的。当需要对Flash进行编程、擦除等操作时,需要先解锁Flash。FLASH_KEY1和FLASH_KEY2是两个32位的特定值,通过连续写入这两个值到FLASH- >KEYR寄存器,可以解锁Flash的访问权限。FLASH_KEY1的值为0x45670123,FLASH_KEY2的值为0xCDEF89AB。

上锁Flash代码解析

/**

  * @brief  Locks the FLASH Bank1 Program Erase Controller.

  * @note   this function can be used for all STM32F10x devices.

  *         - For STM32F10X_XL devices this function Locks Bank1.

  *         - For all other devices it Locks Bank1 and it is equivalent 

  *           to FLASH_Lock function.

  * @param  None

  * @retval None

  */

void FLASH_LockBank1(void)

{

  /* Set the Lock Bit to lock the FPEC and the CR of  Bank1 */

  FLASH- >CR |= CR_LOCK_Set;

}

这段代码是用于锁定STM32的Bank1程序擦除控制器(Program Erase Controller)。以下是该代码的解释:


该函数用于锁定STM32的Bank1程序擦除控制器,适用于所有STM32F10x系列的设备。对于STM32F10X_XL系列的设备,该函数锁定Bank1。对于其他设备,它锁定Bank1并等效于FLASH_Lock函数。


该函数没有参数。


函数的返回值为None。


函数内部的操作是通过将CR_LOCK_Set(宏定义的值)设置到FLASH- >CR寄存器的LOCK位,从而锁定Bank1的访问权限。具体来说,使用按位或操作符将CR_LOCK_Set设置到FLASH- >CR寄存器的LOCK位,以锁定Flash的访问权限。

/**

  * @brief  Locks the FLASH Bank2 Program Erase Controller.

  * @note   This function can be used only for STM32F10X_XL density devices.

  * @param  None

  * @retval None

  */

void FLASH_LockBank2(void)

{

  /* Set the Lock Bit to lock the FPEC and the CR of  Bank2 */

  FLASH- >CR2 |= CR_LOCK_Set;

}


/**

  * @brief  Locks the FLASH Program Erase Controller.

  * @note   This function can be used for all STM32F10x devices.

  *         - For STM32F10X_XL devices this function Locks Bank1 and Bank2.

  *         - For all other devices it Locks Bank1 and it is equivalent 

  *           to FLASH_LockBank1 function.

  * @param  None

  * @retval None

  */


void FLASH_Lock(void)

{

  /* Set the Lock Bit to lock the FPEC and the CR of  Bank1 */

  FLASH- >CR |= CR_LOCK_Set;


#ifdef STM32F10X_XL

  /* Set the Lock Bit to lock the FPEC and the CR of  Bank2 */

  FLASH- >CR2 |= CR_LOCK_Set;

#endif /* STM32F10X_XL */

}

总结:FLASH_Lock包括 FLASH_LockBank1和 FLASH_LockBank2取决于芯片类型

/* Flash Control Register bits */

#define CR_PG_Set                ((uint32_t)0x00000001)

#define CR_PG_Reset              ((uint32_t)0x00001FFE) 

#define CR_PER_Set               ((uint32_t)0x00000002)

#define CR_PER_Reset             ((uint32_t)0x00001FFD)

#define CR_MER_Set               ((uint32_t)0x00000004)

#define CR_MER_Reset             ((uint32_t)0x00001FFB)

#define CR_OPTPG_Set             ((uint32_t)0x00000010)

#define CR_OPTPG_Reset           ((uint32_t)0x00001FEF)

#define CR_OPTER_Set             ((uint32_t)0x00000020)

#define CR_OPTER_Reset           ((uint32_t)0x00001FDF)

#define CR_STRT_Set              ((uint32_t)0x00000040)

#define CR_LOCK_Set              ((uint32_t)0x00000080)


这段代码定义了一些与Flash控制寄存器(Control Register)相关的位掩码(bits)。以下是这些位掩码的解释:


1. CR_PG_Set和CR_PG_Reset:

   用于编程Flash的位掩码。CR_PG_Set将FLASH- >CR寄存器的PG位设置为1,表示启用Flash编程访问。CR_PG_Reset将FLASH- >CR寄存器的PG位复位为0,表示禁用Flash编程访问。


2. CR_PER_Set和CR_PER_Reset:

   用于擦除Flash扇区的位掩码。CR_PER_Set将FLASH- >CR寄存器的PER位设置为1,表示启用Flash扇区擦除。CR_PER_Reset将FLASH- >CR寄存器的PER位复位为0,表示禁用Flash扇区擦除。


3. CR_MER_Set和CR_MER_Reset:

   用于擦除整个Flash存储器的位掩码。CR_MER_Set将FLASH- >CR寄存器的MER位设置为1,表示启用Flash全片擦除。CR_MER_Reset将FLASH- >CR寄存器的MER位复位为0,表示禁用Flash全片擦除。


4. CR_OPTPG_Set和CR_OPTPG_Reset:

   用于编程Flash选项字节的位掩码。CR_OPTPG_Set将FLASH- >CR寄存器的OPTPG位设置为1,表示启用Flash选项字节编程。CR_OPTPG_Reset将FLASH- >CR寄存器的OPTPG位复位为0,表示禁用Flash选项字节编程。


5. CR_OPTER_Set和CR_OPTER_Reset:

   用于擦除Flash选项字节的位掩码。CR_OPTER_Set将FLASH- >CR寄存器的OPTER位设置为1,表示启用Flash选项字节擦除。CR_OPTER_Reset将FLASH- >CR寄存器的OPTER位复位为0,表示禁用Flash选项字节擦除。


6. CR_STRT_Set:

   用于启动Flash操作的位掩码。CR_STRT_Set将FLASH- >CR寄存器的STRT位设置为1,表示启动Flash编程或擦除操作。


7. CR_LOCK_Set:

   用于锁定Flash的位掩码。CR_LOCK_Set将FLASH- >CR寄存器的LOCK位设置为1,表示锁定Flash的访问权限。


这些位掩码用于在进行Flash编程、擦除和操作期间设置或复位Flash控制寄存器中的特定位。在实际应用中,可以根据需要使用这些位掩码来配置和控制Flash的操作。

STM32库函数中FLASH擦除操作相关函数解析

FLASH_Status FLASH_ErasePage(uint32_t Page_Address);

FLASH_Status FLASH_EraseAllPages(void);

FLASH_Status FLASH_EraseOptionBytes(void);


这是三个函数用于擦除STM32的Flash存储器中的页面和选项字节。以下是这些函数的解释:


1.FLASH_Status FLASH_ErasePage(uint32_t Page_Address):

   该函数用于擦除指定地址的Flash存储器页面。Page_Address参数表示要擦除的页面的起始地址。函数返回一个FLASH_Status类型的值,表示擦除操作的状态。可能的返回值包括:

   - FLASH_COMPLETE:擦除操作成功完成。

   - FLASH_BUSY:擦除操作正在进行中。

   - FLASH_ERROR_WRP:擦除操作失败,由于写保护设置导致的错误。

   - FLASH_ERROR_PG:擦除操作失败,由于编程错误导致的错误。


2. FLASH_Status FLASH_EraseAllPages(void):

   该函数用于擦除Flash存储器中的所有页面。函数返回一个FLASH_Status类型的值,表示擦除操作的状态。


3. FLASH_Status FLASH_EraseOptionBytes(void):

   该函数用于擦除Flash存储器中的选项字节。选项字节是一些用于配置Flash存储器和设备行为的特殊字节。函数返回一个FLASH_Status类型的值,表示擦除操作的状态。


这些函数用于在运行时对Flash存储器进行擦除操作。在调用这些函数之前,请确保已经解锁Flash的访问权限(通过调用FLASH_Unlock函数)

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。