IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 9.STC15W408AS单片机EEPROM -> 正文阅读

[嵌入式]9.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

SWBS:

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();
}

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 13:27:32  更:2021-07-28 13:28:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:44:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码