概念
ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写。ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。
FLASH存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据(NVRAM的优势),U盘和MP3里用的就是这种存储器。在过去的20年里,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备,然而近年来Flash全面代替了ROM(EPROM)在嵌入式系统中的地位,用作存储Bootloader以及操作系统或者程序代码或者直接当硬盘使用(U盘)。
应用场景
很多时候我们程序中的有一些变量它不是每次都需要初始化的,例如:表计中的数据,需要记录上次断电的状态标志位等等…这些都是需要记忆功能来实现的,这时候就需要把这些需要保存的变量写进去Flash里面,下次上电唤醒之后,重新读取出来。
功能实现
const unsigned char ucWriteIn[12] = {'L','i','a','n','g','J','i','n','g','Y','i','_'};
int main (void)
{
CHIP_Init();
CMU_ClockSelectSet(cmuClock_LFA, cmuSelect_LFRCO);
// CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFRCO); /* 外部高频晶振没焊接,改为使用内部晶振 */
/*
* 开启LE时钟,只要使用到低频外设,都需要开启该时钟
*/
CMU_ClockEnable(cmuClock_CORELE, true);
CMU_ClockEnable(cmuClock_GPIO, true); /* 使能GPIO模块的时钟源 */
/* Ensure core frequency has been updated */
SystemCoreClockUpdate();
if(SysTick_Config(SystemCoreClockGet() / 1000)) while (1); /* 设置SysTick为1ms中断 */
OrigrinatePeripherals_init();
WriteFlash(); //擦写Flash
while(1);
}
擦写函数:
void WriteFlash(void)
{
//add a timer
MSC_Init(); //初始化MSC,并使能AUXHFRCO
__disable_irq(); //关闭总中断
if(MSC_ErasePage((uint32_t *)0x0fe00000) == mscReturnOk) //擦除指定地址的数据
{
MSC_WriteWord((uint32_t *)0x0fe00000,ucWriteIn,12); //将数据写入指定地址。
}
MSC_Deinit();
unsigned char *Point = (unsigned char *)0x0fe00000; //直接读取写入的地址位上的数据
for(unsigned char i = 0; i < 8; i++) //读出的数据进行比对,和写入的是否一致!
{
if(*(Point + i) == ucWriteIn[i])
continue;
else
{
while(1); // error occur
}
}
__enable_irq(); //开启总中断
printf("point = %s \r\n",Point);
}
注意事项:
1、切记,在写Flash的过程中,不允许被任何东西打断,否则写入不成功;读数据没有这个要求。
2、写入的数据以4个字节为单位!
代码运行调试
总结
以上就是写Flash的过程,具体如何适合你的代码,需要你自己移植设计,很简单也很方便!