在线时间0 小时
UID245354
ST金币0
蝴蝶豆0
注册时间2007-6-13
新手上路
- 最后登录
- 2019-8-1
|
a0a.1 0b0c
EEPROM是单片机应用系统中经常会用到的存储器,它主要用来保存一些掉电后需要保持不变的数据。在以前的单片机系统中,通常都是在单片机外面再 扩充一个EEPROM芯片,这种方法除了增加成本外,也降低了可靠性。现在,很多单片机的公司都推出了集成有小容量EEPROM的单片机,这样就方便了使 用,降低了成本,提高了可靠性。
STM8单片机芯片内部也集成有EEPROM,容量从640字节到2K字节。最为特色的是,在STM8单片机中,对EEPROM的访问就象常规的RAM一样,非常方便。EEPROM的地址空间与内存是统一编址的,地址从004000H开始,大小根据不同的芯片型号而定。
下面的实验程序,就是先给EEPROM中的第一个单元004000H写入55H,然后再读到全局变量ch中。
同样还是利用ST的开发工具,生成一个C语言程序的框架,然后修改其中的main.c,修改后的代码如下。
// 程序描述:对芯片内部的EEPROM存储单元进行实验
#include "STM8S207C_S.h"
unsigned char ch;
main()
{
unsigned char *p;
p = (unsigned char *)0x4000; // 指针p指向芯片内部的EEPROM第一个单元
// 对数据EEPROM进行解锁
do
{
FLASH_DUKR = 0xae; // 写入第一个密钥
FLASH_DUKR = 0x56; // 写入第二个密钥
} while((FLASH_IAPSR & 0x08) == 0); // 若解锁未成功,则重新再来
*p = 0xaa; // 写入第一个字节
while((FLASH_IAPSR & 0x04) == 0); // 等待写操作成功
ch = *p; // 将写入的内容读到变量ch中
while(1)
{
;
}
}
这里要注意的是,2个密钥的顺序,与STM8的用户手册上是相反的,如果按照手册上的顺序,就会停留在do…while循环中。具体原因,也不是很清楚,也可能是我拿到的手册(中文和英文的都一样)太旧了,或者是理解有误。
另外,上面的实验程序中,ch不能为局部变量,否则的话,在调试环境中跟踪ch变量时,显示的结果就不对,通过反汇编,我觉得是编译有问题,当定义成局部变量时,ch = *p的汇编代码如下:
main.c:23 ch = *p; // 将写入的内容读到变量ch中
0x80f0 0x7B01 LD A,(0x01,SP) LD A,(0x01,SP)
0x80f2 0x97 LD XL,A LD XL,A
0x80f3 0x1E02 LDW X,(0x02,SP) LDW X,(0x02,SP)
0x80f5 0xF6 LD A,(X) LD A,(X)
0x80f6 0x97 LD XL,A LD XL,A
如果将ch定义成全局变量,则汇编代码为:
main.c:22 ch = *p; // 将写入的内容读到变量ch中
0x80ef 0x1E01 LDW X,(0x01,SP) LDW X,(0x01,SP)
0x80f1 0xF6 LD A,(X) LD A,(X)
0x80f2 0xB700 LD 0x00,A LD 0x00,A
这一段代码的分析仅供参考,本人使用的开发环境为STVD4.1.0,编译器版本号为:COSMIC的CxSTM84.2.4。
|
|