📄 flash.txt
字号:
函数功能描述
向指定的Flash存储单元中写入数据,目的在于保护数据,掉电不消失
函数定义void Flash_Write (unsigned int *flashdata,unsigned int *flashaddress)
其中指针flashdata表示需要存储的数据
指针flashaddress表示指定的存储单元
函数功能描述
读指定的Flash存储单元中的数据
函数定义unsigned int Flash_Read (unsigned int *flashdata,unsigned int *flashaddress)
其中指针flashdata表示需要读出的数据
指针flashaddress表示指定的存储单元
返回数据为指定存储地址内的数据
读写流程概述:
一、读FLASH
要用MOVC指令才能读FLASH,这个比较简单。
二、写FLASH
严格按照下面的流程即可完成写操作
1. 禁止中断。
2. 置位FLWE(FLSCL.0),以允许由用户软件写/擦除FLASH。
3. 置位PSEE(PSCTL.1),以允许FLASH 扇区擦除。
4. 置位PSWE(PSCTL.0),以允许FLASH 写。
5. 用MOVX 指令向待擦除扇区内的任何一个地址写入一个数据字节。
6. 清除PSEE 以禁止FLASH 扇区擦除。
7. 用MOVX 指令向刚擦除的扇区中所希望的地址写入数据字节。重复该步直到所有字节都已写入(目标扇区内)。
8. 清除PSWE 以禁止FLASH 写,使MOVX 操作指向XRAM 数据空间。
9. 重新允许中断。
三、指针
C语言里可没有MOVC和MOVX,为了实现这两个指令,需要定义指针。根据Keil C的语法可知,将变量(指针)声明为code型和xdata型时
相应的赋值操作即对应于MOVC和MOVX。当然,如果用汇编语言就没这个问题了。
下面给出一个最简单的例子(在C8051F020及Keil uV2下调试通过,程序的功能是每次复位后P1口的输出状态为上次的取反)
#include<c8051f020.h>
unsigned char test; //保存输出状态
//在FLASH中保存输出状态
/*For reading*/
unsigned char code test_c ;//_at_ 0xCF20
/*For writing*/
unsigned char xdata test_x ;//_at_ 0xCF20;
void ReadState()
{ //从FLASH中读取信号输出状态与PWM值
test=test_c;
}
void StoreState()
{ //此函数不可频繁调用,对FLASH有损(寿命一般为100000次)
//在FLASH中写入输出状态
EA=0; //为了避免对FLASH的误写,需禁止中断
FLSCL = 0x81; //允许由用户软件写/擦除FLASH
PSCTL = 0x03; //允许FLASH扇区擦除及FLASH写
test_x=0; //擦除扇区
PSCTL &= 0xFD; //清除PSEE 以禁止FLASH 扇区擦除
test_x=~test; //输出状态按位取反后写入FLASH
PSCTL = 0; //禁止FLASH写
// FLSCL = 0x80; //disable FLASH writes
EA=1; //重新允许中断
}
void main(void)
{ WDTCN=0xde;
WDTCN=0xad;
//Add initialization code here
P1MDOUT=0xff;
ReadState();
P1=test;
StoreState();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -