矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 24883|回复: 17

STC单片机的EEPROM使用心得

  [复制链接]
     
发表于 2010-3-15 21:56:53 | 显示全部楼层 |阅读模式
STC单片机利用IAP技术实现了EEPROM功能,相比外置存储芯片而言,在操作上比较方便。
涉及STC单片机EEPROM操作的特殊功能寄存器有6个,地址分别是E2H、E3H、E4H、E5H、E6H和E7H。在STC单片机使用手册中,作者分别将它们定义为:
一、IAP_DATA  (E2H)
二、IAP_ADDRH  (E3H)
三、IAP_ADDRL  (E4H)
四、IAP_CMD  (E5H)
五、IAP_TRIG  (E6H)
六、IAP_CONTR  (E7H)
本人认为,手册中给每个地址单元定义的英文词组太长,而且有点哆嗦,占的篇幅又大,感觉对正常阅读和理解产生了一定的干扰,反倒不好了解作者的意图了,还不如让使用者自己定义为好。我自己对这些单元分别定义为DAT ADDRH ADDRL CMD TRIG CONTR。
一、DAT(E2H) 从EEPROM中读取到的数据首先进入这里。要把数据写入EEPROM中,也要把数据放到这个单元中。也就是说,这个单元起到了中转站的作用,写入和读出都要通过这个单元。
二、ADDRH、ADDRL分别是EEPROM地址单元高8位和低8位。如要把数据存储到1000H单元中,那么在程序中,ADDRH的数值为10H,ADDRL的数值为00H。
三、CMD表示操作类型。数值为1是读,数值为2是写,数值为3是擦除。简单点说,就是“1读2写3擦除”。
四、CONTR寄存器,说明书上作了好多功能表述,但对于一般使用者来说,寄存器的前5位可以不作过多了解,只要掌握后3位意义就可以了。一般理解为,选择好后3位的数值,为的是确保在不同数值晶振下正确读写擦除EEPROM。考虑到TRIG这个寄存器的要求,一般使用时,可将前5位设置为10000,后3位根据不同晶振频率来确定(这个见使用手册)。
五、TRIG这个寄存器,看了好长时间手册才了解它的一般使用,对这个寄存器理解应当放到最后。说明书是这样写的:为isp/iap操作时的命令模式寄存器。在ispen(isp_contr.7)=1时,对isp_trig先写入46h,再写入b9h,isp/iap命令才会生效。
其实也可以这样理解,当选择好EEPROM地址单元,选择好操作类型,以及在写入状态时准备好写入数据后,先向该寄存器送入46H数据,之后再向该寄存器送入B9H数值。EEPROM的读、写、擦除就完成了。
以上是本人对STC单片机的EEPROM使用的一些心得,若有不当或错误之处,请高手多多批评指正。
本人常用的STC_EEPROM基本操作程序
                           dat       equ     0e2h               
drh       equ     0e3h               
drl       equ     0e4h                   
cmd       equ     0e5h               
trig      equ     0e6h               
contr     equ     0e7h               

;---------读取1个字节-------------------               
read:         mov     drh,#10h    ;设定存储单元地址高四位 这里设1000h,也可选用其他单元  
          mov     drl,#00h     ;设定存储单元地址低四位       
          mov     cmd,#01h   ;设定读操作       
          mov     contr,#84h ;设定操作时间          
          mov     trig,#046h  ;准备触发       
          mov     trig,#0b9h  ;触发       
          mov     r0,dat         ;读数据。 r0为读出的数据,也可以选用其他单元       
          nop               
                 nop               
                 ret                
;---------写入1个字节-------------------               
write:         mov     dat,r0         ;写数据。 r0中为准备写入的数据,也可以选用其他单元       
          mov     drh,#10h   ;设定存储单元地址高四位 这里设1000h,也可选用其他单元  
          mov     drl,#00h     ;设定存储单元地址低四位       
          mov     cmd,#02h   ;设定写操作       
          mov     contr,#84h ;设定操作时间
          mov     trig,#046h   ;准备触发       
          mov     trig,#0b9h   ;触发       
          nop               
                 nop               
                 ret                
;---------擦除1个字节-------------------               
clear:        mov    drh,#10h   ;设定存储单元地址高四位 这里设1000h,也可选用其他单元        可组成子程序,进行调用 
          mov    drl,#00h    ;设定存储单元地址低四位       
          mov    cmd,#03h  ;设定擦除操作       
          mov    contr,#84h ;设定操作时间 
          mov    trig,#046h ;准备触发       
          mov    trig,#0b9h ;触发       
          nop               
                 nop               
                 ret               

;=========关闭EEPROM====================               
off:      mov    drh,#00h               
           mov    drl,#00h               
           mov    cmd,#00h               
           mov    contr,#00h               
           mov    trig,#00h       
           ret

评分

2

查看全部评分

     
发表于 2010-3-16 14:44:33 | 显示全部楼层
感觉STC的eeprom因为是用的类似于程序存储空间技术,用起来反应比较慢。
我的一个产品在每次输数据时LED显示都要灭零点几秒后才能存入,不过几块钱的东东算是很不错的了。
回复 支持 反对

使用道具 举报

     
发表于 2010-3-18 02:35:27 | 显示全部楼层
说实话,第一次看到STC的技术资料还以为是牛皮癣一样。
回复 支持 反对

使用道具 举报

     
发表于 2010-3-18 15:22:20 | 显示全部楼层
这样定义也可以,不容易出现重复,如果程序里面还有其它的控制比如要输出,也定义DATA,CLK是不是就不容易区分了。
回复 支持 反对

使用道具 举报

     
发表于 2012-10-21 23:25:09 | 显示全部楼层
stc片内串方使用一定要注意,容易被误擦除,而且是整个片区的被擦除。
特别是上电或断电的瞬间。
回复 支持 反对

使用道具 举报

     
发表于 2012-10-22 08:00:46 | 显示全部楼层
这完全就是把一部分程序存储器拿来存储数据啊,操作的时候要小心掉电或者电压变化。
回复 支持 反对

使用道具 举报

     
发表于 2012-9-28 08:29:15 | 显示全部楼层
我在搜索LVDF置位的情况下能不能读
回复 支持 反对

使用道具 举报

     
发表于 2012-9-30 17:55:52 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2012-10-2 23:38:24 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2012-10-2 23:58:11 | 显示全部楼层
CXFLBH 发表于 2010-3-16 14:44
感觉STC的eeprom因为是用的类似于程序存储空间技术,用起来反应比较慢。
我的一个产品在每次输数据时LED显 ...

FLASH读写都是需要时间的,时间长点可靠性高些
回复 支持 反对

使用道具 举报

     
发表于 2012-11-19 06:58:42 来自手机 | 显示全部楼层
请教 stc里的所谓eeprom能单字节操作吗?
回复 支持 反对

使用道具 举报

     
发表于 2012-11-19 13:33:10 | 显示全部楼层
电子马甲 发表于 2012-11-19 06:58
请教 stc里的所谓eeprom能单字节操作吗?

FLASH 可以单字节由1改为0,但有0改为1需按扇区(例如512 BIT)擦除后再写入。这个数据表有详细介绍。
回复 支持 反对

使用道具 举报

     
发表于 2012-11-19 14:20:23 | 显示全部楼层
autopccopy 发表于 2012-11-19 13:33
FLASH 可以单字节由1改为0,但有0改为1需按扇区(例如512 BIT)擦除后再写入。这个数据表有详细介绍。

那等于还是不能按字节操作的,随机数据的话不可能只是由1改为0吧, 那上面的单字节汇编程序还有意义吗? ----新手不懂 莫怪啊。。
回复 支持 反对

使用道具 举报

     
发表于 2012-12-24 17:49:18 来自手机 | 显示全部楼层
好经验,学习了
回复 支持 反对

使用道具 举报

发表于 2012-12-24 20:39:20 | 显示全部楼层
CXFLBH 发表于 2010-3-16 14:44
感觉STC的eeprom因为是用的类似于程序存储空间技术,用起来反应比较慢。
我的一个产品在每次输数据时LED显 ...

程序技巧差才会把led搞灭了吧?

等eeprom的时候也可以扫描led。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-30 05:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表