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。 |
从零开始操作STM8寄存器(风驰iCreate奉献)
【中文资料】初学STM8库函数的中文帮助软件
绝对经典的中文STM8学习手册,淘宝上学习板资料,友情大放送!
【原创教程】风驰iCreate独家开源STM8 27个例程和10多万字的pdf教程
STM8的LCD1602 4线驱动,为什么不工作
【精华资料】由零开始开发STM8
STM8S 的触摸库是如何在主程序中查询键的呢、
【精华资料】STM8的C语言编程1-14讲完整版
【精品教程】STM8系列单片机入门教程系列
STM8 第一次进中断不准【悬赏问答】
RE:【ST公益分享】 STM8 -EEPROM应用
RE:【ST公益分享】 STM8 -EEPROM应用
RE:【ST公益分享】 STM8 -EEPROM应用
好的资料啊,谢谢!