PAGE1
PAGE1
STM32F1系列的存储器结构
1.存储器概述
STM32F1系列微控制器基于ARMCortex-M3内核,提供了多种存储器类型,包括闪存(FlashMemory)、随机存取存储器(RAM)、系统存储器(SystemMemory)以及外设存储器(PeripheralMemory)。这些存储器在系统中扮演着不同的角色,理解它们的结构和功能对于高效编程和系统设计至关重要。
2.闪存(FlashMemory)
闪存是STM32F1系列微控制器的主要程序存储器,用于存储用户代码和固定数据。闪存的特点是非易失性,即使在断电后数据也不会丢失。STM32F1系列的闪存容量通常在16KB到512KB之间,具体取决于不同的型号。
2.1闪存组织
闪存通常被划分为多个扇区(Sector),每个扇区的大小可能不同。例如,STM32F103C8T6型号的闪存被划分为16个1KB的扇区和16个4KB的扇区。每个扇区可以独立擦除和编程,这为数据管理和更新提供了便利。
2.2闪存操作
闪存的操作主要包括读取、编程和擦除。这些操作通过STM32F1系列的闪存接口(FlashInterface)进行控制。
2.2.1读取闪存
读取闪存的操作非常简单,可以直接使用指针访问闪存地址。例如,假设闪存地址为0
//读取闪存中的数据
uint32_treadDataFromFlash(uint32_taddress){
return*(__IOuint32_t*)address;//使用指针读取数据
}
//示例
uint32_tdata=readDataFromFlash(0;
2.2.2编程闪存
编程闪存需要使用闪存接口提供的函数。以下是一个示例,展示如何将数据写入闪存:
#includestm32f1xx_hal.h
//编程闪存
HAL_StatusTypeDefprogramFlash(uint32_taddress,uint32_tdata){
HAL_StatusTypeDefstatus;
uint32_t*p=(uint32_t*)address;
//解锁闪存接口
HAL_FLASH_Unlock();
//清除所有闪存错误标志
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR|FLASH_FLAG_OPTVERR);
//编程闪存
status=HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,(uint32_t)p,data);
//锁定闪存接口
HAL_FLASH_Lock();
returnstatus;
}
//示例
uint32_tdataToWrite=0
HAL_StatusTypeDefresult=programFlash(0dataToWrite);
2.2.3擦除闪存
擦除闪存同样需要使用闪存接口提供的函数。以下是一个示例,展示如何擦除一个扇区:
#includestm32f1xx_hal.h
//擦除闪存扇区
HAL_StatusTypeDeferaseFlashSector(uint32_tsectorAddress){
HAL_StatusTypeDefstatus;
FLASH_EraseInitTypeDeferaseInitStruct;
//解锁闪存接口
HAL_FLASH_Unlock();
//清除所有闪存错误标志
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR|FLASH_FLAG_OPTVERR);
//配置擦除结构
eraseInitStruct.TypeErase=FLASH_TYPEERASE_SECTORS;
eraseInitStruct.VoltageRange=FLASH_VOLTAGE_RANGE_3;
eraseInitStruct.Sector=__HAL_FLASH_GET_SECTOR(s