现在的位置: 首页 > 综合 > 正文

C8050F02x单片机FLASH读写(Keil C编程心得)

2013年10月12日 ⁄ 综合 ⁄ 共 1345字 ⁄ 字号 评论关闭

在单片机编程中往往需要长期保存某些数据,尤其是一些配置参数,这样掉电后这些数据仍然还在。于是就开始了FLASH读写的编程,经过了一天多的努力,终于把FLASH的读写调通了。主要有三点:

一、读FLASH

要用MOVC指令才能读FLASH,这个比较简单。

二、写FLASH

严格按照下面的流程即可完成写操作

1. 禁止中断。

2. 置位FLWEFLSCL.0),以允许由用户软件写/擦除FLASH

3. 置位PSEEPSCTL.1),以允许FLASH 扇区擦除。

4. 置位PSWEPSCTL.0),以允许FLASH 写。

5. 用MOVX 指令向待擦除扇区内的任何一个地址写入一个数据字节。

6. 清除PSEE 以禁止FLASH 扇区擦除。

7. 用MOVX 指令向刚擦除的扇区中所希望的地址写入数据字节。重复该步直到所有字

节都已写入(目标扇区内)。

8. 清除PSWE 以禁止FLASH 写,使MOVX 操作指向XRAM 数据空间。

9. 重新允许中断。

三、指针

C语言里可没有MOVCMOVX,为了实现这两个指令,需要定义指针。根据Keil C的语法可知,将变量(指针)声明为code型和xdata型时相应的赋值操作即对应于MOVCMOVX。当然,如果用汇编语言就没这个问题了。

下面给出一个最简单的例子(在C8051F020Keil 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);

}

抱歉!评论已关闭.