9.STC15W408AS单片机EEPROM

发布者:Coboro最新更新时间:2022-08-04 来源: csdn关键字:STC15W408AS  单片机  EEPROM 手机看文章 扫描二维码
随时随地手机看文章

STC15系列单片机内部集成了大容量的EEPROM,与其程序空间是分开的。利用ISP/IAP技术可将内部Data Flash当EEPROM,擦写次数在10W次以上。EEPROM可分为若干个扇区,每个扇区包含512字节。使用时,建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同扇区,不一定要用满。数据存储器的擦除操作是按扇区进行的。


EEPROM可用于保存一些需要在应用中修改并且掉电不易丢失的参数数据。在用户程序中,可以对EEPROM进行子节读/字节编程/扇区擦除操作。在工作电压Vcc偏低时,建议不要进行EEPROM/IAP操作。


一、IAP及EEPROM相关寄存器

 图片         

1.1 数据寄存器IAP_DATA

IAP_DATA是ISP/IAP操作时的数据寄存器。ISP/IAP从Flash读出的数据放在此处,向Flash写的数据也许放在此处。


1.2 地址寄存器IAP_ADDRH和IAP_ADDRL

IAP_ADDRH,ISP/IAP操作时的地址寄存器高八位。


IAP_ADDRL, ISP/IAP操作时的地址寄存器高低位。


1.3 命令寄存器IAP_CMD

  图片        

1.4 命令触发寄存器IAP_TRIG

IAP_TRIG是ISP/IAP操场时的命令触发寄存器。在IAPEN(IAP_CONTER.7) = 1时,对IAP_TRIG先写入5Ah,再写入A5h,ISP/IAP命令才会生效。ISP/IAP操作完成后,IAP地址高八位IAP_ADDRH、IAP地址低八位寄存器IAP_ADDRL和IAP命令寄存器IAP_CMD的内容不变。如果接下来要对下一个地址数据进行ISP/IAP操作,需手动将地址的高8位和低8位分别写入IAP_ADDRH和IAP_ADDRL寄存器。


每次IAP操作时,IAP_TRIG先写入5Ah,再写入A5h,ISP/IAP命令才会生效。每次在触发钱,需要重新发送字节读/字节编程/扇区擦除命令,在命令不改变时,不需要重新送命令。


1.5 命令寄存器IAP_CONTR

图片        

IAPEN:ISP/IAP功能允许位。


0:禁止IAP读/写/擦除Data Flash/EEPROM


1:允许IAP读/写/擦除Data Flash/EEPROM


0:软件选择复位后从用户应用程序区启动


1:还是从系统ISP检测程序区启动


SWRST:


0:不操作


1:软件控制产生复位,单片机自动复位


CMD_FAIL:如果IAP地址(由IAP地址寄存器IAP_ADDRH和IAP_ADDRL的值决定)指向了非法地址或者无效地址,并送了ISP/IAP命令,并对IAP_TRIG送5Ah/A5h触发失败,则CMD_FAIL为1,需要软件清零。


WT0~WT2控制等待时间:

图片        

1.6 工作电压过低判断 此时不需要EEPROM/IAP操作

PCON,电源控制寄存器:

图片        

LVDF:低压检测标志位,当工作电压Vcc低于低压检测门槛电压时,该位置1。该位要软件清0。当低压检测电路发现工作电压Vcc偏低时,不要进行EEPROM/IAP操作。

图片        

二、STC15单片机EEPROM空间大小及地址

图片        

这里,我们暂时只关注STC15W408AS即可。型号不一样记得看手册。


三、测试程序

 

#include "stc15.h"

#include "intrins.h"

 

void IapIdle();

uchar IapReadByte(uchar addr);

void IapProgramByte(uchar addr, uchar dat);

void IapEraseSector(uchar addr);

 

#define IAP_ADDRESS 0x0001

 

void main()

{

  uchar ret;

  uint i;

  P1M0 = 0x02;

  P1M1 = 0x00;

  P11 = 0;   // 先 关闭LED

  // 这里最好加一点延时 方便查看现象

  IapEraseSector(IAP_ADDRESS); // 擦除地址的数据 恢复初始值

    IapProgramByte(IAP_ADDRESS,1); // 写入1

    if(IapReadByte(IAP_ADDRESS) == 1) 

    {

        P11 = 1; // 如果读取的数据是1 就点亮LED

    }

  while(1);

}

 

// 关闭IAP  寄存器设置成默认值

void IapIdle()

{

  IAP_CONTR = 0;       // 禁止IAP读/写/擦除Data Flash/EEPROM

  IAP_CMD   = 0;       // 待机 无ISP操作

  IAP_TRIG  = 0;       // 清除命令寄存器

  IAP_ADDRH = 0x80;    // 将地址位设置到非IAP区域

  IAP_ADDRL = 0;

}

// 从ISP/IAP/EEPROM区域读取一字节

uchar IapReadByte(uchar addr)

{

  uchar dat;

  IAP_CMD = 0x01;                 //设置IAP命令 读

  IAP_ADDRL = addr;               //设置IAP低地址

  IAP_ADDRH = addr >> 8;          //设置IAP高地址

  IAP_TRIG = 0x5a;                //写触发命令(0x5a)

  IAP_TRIG = 0xa5;                //写触发命令(0xa5)

  _nop_();                        //等待ISP/IAP/EEPROM操作完成

  dat = IAP_DATA;                 //读ISP/IAP/EEPROM数据

  IapIdle();                      //关闭IAP功能

  return dat;                     //返回

}

// 写一字节数据到ISP/IAP/EEPROM区域

void IapProgramByte(uchar addr, uchar dat)

{

  IAP_CONTR = 0x80;               //使能IAP

  IAP_CMD = 0x02;                 //设置IAP命令 编程

  IAP_ADDRL = addr;               //设置IAP低地址

  IAP_ADDRH = addr >> 8;          //设置IAP高地址

  IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据

  IAP_TRIG = 0x5a;                //写触发命令(0x5a)

  IAP_TRIG = 0xa5;                //写触发命令(0xa5)

  _nop_();                        //等待ISP/IAP/EEPROM操作完成

  IapIdle();

}

 

// 擦除某一地址的数据

void IapEraseSector(uchar addr)

{

  IAP_CONTR = 0x80;               //使能IAP

  IAP_CMD = 0x03;                 //设置IAP命令 擦除

  IAP_ADDRL = addr;               //设置IAP低地址

  IAP_ADDRH = addr >> 8;          //设置IAP高地址

  IAP_TRIG = 0x5a;                //写触发命令(0x5a)

  IAP_TRIG = 0xa5;                //写触发命令(0xa5)

  _nop_();                        //等待ISP/IAP/EEPROM操作完成

  IapIdle();

}

关键字:STC15W408AS  单片机  EEPROM 引用地址:9.STC15W408AS单片机EEPROM

上一篇:10.STC15W408AS单片机A/D转换器
下一篇:8.STC15W408AS单片机定时器/计数器

推荐阅读最新更新时间:2024-11-17 17:01

PIC单片机之SPI从机框架
#include pic.h #include string.h #include STDIO.H __CONFIG(0x3F32); //芯片配置字 选择HS模式振荡器,关WDT typedef unsigned char uchar; typedef unsigned int uint; uchar resive=0; uchar resive1=0; uchar send_buf ={'S',0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xc,0xD,0xe,0xf}; uchar send_num=0; uchar resive_flag=0; #defi
[单片机]
keil软件的使用及工程的建立
keil软件是常用的编译软件,keil工程的建立过程如下: 建立一个新工程单击{【project】菜单中的【new project……】选项。 选择工程保存路径,输入工程名,单击保存。 在弹出的对话框内选择自己正在使用的单片机品牌和型号。在选择相应的单片机型号后,还可以在右边的【deion】栏查看该品牌型号单片机的基本说明。最后单击确定选择好单片机型号。 完成以上步骤只是建立了工程,但这不是一个完整的工程。我们必须添加文件以及代码使之完善。 单击【file】菜单中的【new】菜单项新建文件。然后单击保存,输入要保存的文件名,同时需要注意的是必须输入正确的扩展名。如果我们用C语言编写程序扩展名必须是.C,如果使用的是汇编语言扩展名则
[单片机]
如何使用触摸传感器和8051微控制器控制LED灯
在这个项目中,我们将触摸传感器与 8051 微控制器 AT89S52 连接。如果您是 8051 微控制器的新手,那么您可以从LED 闪烁开始 8051。 什么是电容式触摸传感器? 电容式触控作用于我们身体上可用的静电荷。屏幕已经充满了电场。当我们触摸屏幕时,由于流经我们身体的静电荷形成闭合电路。此外,软件决定要执行的位置和动作。电容式触摸屏不适用于手套,因为手指和屏幕之间不会有任何传导。 此项目中使用的触摸传感器 本项目使用的触摸传感器为电容式触摸传感器模块,传感器驱动基于驱动IC TTP223。IC TTP23的工作电压为 2.0V 至 5.5V ,触摸传感器的电流消耗非常低。由于价格低廉、电流消耗低且易于集成支持,采用
[单片机]
如何使用触摸传感器和8051<font color='red'>微控制器</font>控制LED灯
单片机汇编语言和最常用的高级语言分析
单片机的编程语言很多,大致分成三类:机器语言、汇编语言、高级语言。机器语言由于繁琐容易出错,一般用户已经不再使用。下面分别对单片机汇编语言和最常用的高级语言进行分析。 单片机的汇编语言   汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少,程序执行效率高,由于它一条指令就对应一条机器码,每一步的执行动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。但是不同的类型的单片机,其汇编语言可能有点差异,所以不易移植,因为他们的指令系统是有区别的。但懂得汇编语言可帮助了解影响任何语言效率的特殊规定。例如,懂得汇编语言指令就可以使用在片内ram作变量的优势,因为片
[单片机]
STM32F103C8T6 MCU功耗测评指南
STM32F103C8T6 MCU越来越广泛的应用在生产生活的各个领域,外接丰富的传感器、功能模块、通信模块、显示存储等可以形成各种各样的产品项目应用。对于功耗要求比较高的产品,一般会选择STM32L系列的MCU,但是从功耗的评测角度,逻辑上是基本相似的。 在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护。由于智能穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续航时间。其实,只要是涉及到便携式的产品,都免不了要使用电池作为电源,否则,如果还是需要接一个插头使用市电来供电的话,那就无法称之
[单片机]
STM32F103C8T6 <font color='red'>MCU</font>功耗测评指南
e络盟使STM32F4 Discovery MCU开发套件实现无线网络连接
e络盟近日宣布提供用于意法半导体(ST)STM32F4 Discovery微控制器开发套件的Discover Wi-Fi开发板,以实现无线连接。Discover Wi-Fi开发板采用Murata SN8200无线网络控制器模块,可提供板载Wi-Fi功能及网络软件栈,是各种高性能、低功耗无线解决方案的完美选择。 Discover Wi-Fi开发板插入意法半导体的STM32F4 Discovery套件后,借助UART和SPI命令接口以及工作频段在2.4 GHz的 IEEE802.11b/g/n标准可提供一系列的广泛功能。Discover Wi-Fi开发板还配备源代码、文档及软件演示,有利于快速启动无线网络项目。 亚太区用户现可
[单片机]
如何提高单片机C语言程序的执行效率
首先什么是执行效率。我们平常所说的执行效率就是使用相同的算法在相同输入条件下完成相同计算所产生的系统开销,目前来说一般会更多关注执行时间方面的开销。所有语言编写的代码最终要运行,都要转化成机器码。在更短的时间内完成相同的事那么效率就高。 关于如何提高C语言程序的执行效率,以我多年的编程经验在这里我来谈谈我的想法: 1.尽量避免调用延时函数 没有带操作系统的程序只能在while(1)里面循环执行,如果在这里面调用大量的延时这样会很消耗CPU的资源,延时等于是让他在这歇着不干事了,只有中断里面的才会执行。如果仅仅是做一个LED一秒闪烁一次的程序,那么很简单,可以直接调用延时函数,但是实际的项目中往往在大循环里有很多事要做,对于
[单片机]
如何提高<font color='red'>单片机</font>C语言程序的执行效率
51单片机led灯渐变PWM调光(渐亮渐灭)C语言和汇编源程序
PWM控制led灯渐亮渐灭程序 适用ME500开发系统 短接JP41-2选用8个LED灯 PWM—PulseWidthModulation(脉冲宽度调制) PWM足?种周期?走而高低电平的rV空比可以调制的方波信兮. 按K2—下,PWM值减小,则占空比增加。 兗度逐渐增加,直到8个LED灯达到高亮,蜂鸣器响。 按K1—下,PWM值增加,则占空比减小。 立度逐渐减弱,直到8个LED灯达到最峭,蜂鸣器响。 单片机汇编语言源程序如下: ; PWM 控制 LED 灯渐亮渐灭程序 ; 适用 ME500 开发系统 ; 晶振为11.0592M ; 利用定时器控制产生占空比可变的 PWM 波 ; 按K1,PWM值增加,则占空比减小,LED 灯渐
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved