PAGE1
PAGE1
物理存储与内存管理
在嵌入式系统中,物理存储和内存管理是至关重要的部分。STM32F103单片机提供了多种存储器类型,包括闪存(Flash)、随机存取存储器(RAM)和外设存储器(PeripheralRegisters)。了解这些存储器的特性和管理方法对于开发高效、可靠的游戏设备至关重要。
1.闪存(Flash)
1.1闪存概述
闪存是STM32F103单片机中用于存储程序代码和常量数据的非易失性存储器。它具有较高的访问速度和较低的功耗,但写入和擦除速度较慢。闪存的大小取决于具体型号,常见的有128KB、256KB等。
1.2闪存的读写操作
1.2.1读操作
闪存的读操作相对简单,直接通过地址访问即可。以下是一个简单的读操作示例:
//读取闪存中的某个地址的数据
uint32_treadFlashData(uint32_taddress){
return*(__IOuint32_t*)address;
}
intmain(){
uint32_tdata=readFlashData(0;//读取闪存起始地址的数据
//使用读取的数据
return0;
}
1.2.2写操作
闪存的写操作需要一些特殊的步骤,因为闪存需要先擦除才能写入。以下是一个简单的写操作示例:
#includestm32f10x.h
//擦除闪存中的某个扇区
voideraseFlashSector(uint32_tsectorAddress){
FLASH_Unlock();//解锁闪存以允许擦除和写入
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR);//清除所有闪存标志
//擦除扇区
FLASH_Statusstatus=FLASH_EraseSector(sectorAddress,VoltageRange_3);//假设使用3.3V电压范围
if(status!=FLASH_COMPLETE){
//擦除失败,处理错误
}
FLASH_Lock();//锁定闪存
}
//写入闪存中的某个地址的数据
voidwriteFlashData(uint32_taddress,uint32_tdata){
FLASH_Unlock();//解锁闪存以允许擦除和写入
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR);//清除所有闪存标志
//写入数据
FLASH_Statusstatus=FLASH_ProgramWord(address,data);
if(status!=FLASH_COMPLETE){
//写入失败,处理错误
}
FLASH_Lock();//锁定闪存
}
intmain(){
uint32_tdata=0
uint32_tsectorAddress=0//假设扇区起始地址为0
uint32_taddress=0//假设要写入的数据地址为0
eraseFlashSector(sectorAddress);//先擦除扇区
writeFlashData(address,data);//写入数据
return0;
}
1.3闪存保护
为了防止意外的写入和擦除操作,STM32F103提供了闪存保护功能。可以通过设置写保护(WriteProtection)和读保护(ReadProtection)来实现。
1.3.1写保护
#includestm32f10x.h
voidsetWriteProtection(uint32_tsector){
FLASH_Unlock();//解锁闪存以允许擦除和写入
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR);//清除所有闪存标志