【IoT】STC 内置 EEPROM 使用之 IAP

举报
产品人卫朋 发表于 2021/10/29 23:08:37 2021/10/29
4.6k+ 0 0
【摘要】 STC89C51、52 内部都自带有2K字节的 EEPROM,54、55和58都自带有 16K 字节的 EEPROM,STC单片机是利用 IAP 技术实现的 EEPROM,内部Flash擦写次数可达 100000 次以上。 1、ISP 与 IAP 介绍 ISP: In System Programable 是指在系统编程,通俗的讲...

STC89C51、52 内部都自带有2K字节的 EEPROM,54、55和58都自带有 16K 字节的 EEPROM,STC单片机是利用 IAP 技术实现的 EEPROM,内部Flash擦写次数可达 100000 次以上。

1、ISP 与 IAP 介绍

ISP:

In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上,不用取下,就可以简单而方便地对其进行编程。

比如我们通过电脑给 STC 单片机下载程序,或给 AT89S51 单片机下载程序,这就是利用了 ISP 技术。

IAP:

In Application Programable 是指在应用编程,芯片提供一系列的机制(硬件/软件上的),当片子在运行程序的时候可以提供一种改变 flash 数据的方法,可以通过代码往程序存储器里写数据或修改数据。

这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的 ISP 功能就是通过 IAP 技术来实现的,即片子在出厂前就已经有一段小的 boot 程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到存储区。

2、示例

以 STC8F2K08S2 为例:


      #include "reg51.h"
      #include "intrins.h"
      //测试工作频率为11.0592MHz
      sfr     IAP_DATA    =   0xC2;
      sfr     IAP_ADDRH   =   0xC3;
      sfr     IAP_ADDRL   =   0xC4;
      sfr     IAP_CMD     =   0xC5;
      sfr     IAP_TRIG    =   0xC6;
      sfr     IAP_CONTR   =   0xC7;
      #define WT_30M          0x80
      #define WT_24M          0x81
      #define WT_20M          0x82
      #define WT_12M          0x83
      #define WT_6M           0x84
      #define WT_3M           0x85
      #define WT_2M           0x86
      #define WT_1M           0x87
      void IapIdle()
      {
          IAP_CONTR = 0;                              //关闭IAP功能
          IAP_CMD = 0;                                //清除命令寄存器
          IAP_TRIG = 0;                               //清除触发寄存器
          IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
          IAP_ADDRL = 0;
      }
      char IapRead(int addr)
      {
          char dat;
          IAP_CONTR = WT_12M;                         //使能IAP
          IAP_CMD = 1;                                //设置IAP读命令
          IAP_ADDRL = addr;                           //设置IAP低地址
          IAP_ADDRH = addr >> 8;                      //设置IAP高地址
          IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
          IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
          _nop_();
          dat = IAP_DATA;                             //读IAP数据
          IapIdle();                                  //关闭IAP功能
          return dat;
      }
      void IapProgram(int addr, char dat)
      {
          IAP_CONTR = WT_12M;                         //使能IAP
          IAP_CMD = 2;                                //设置IAP写命令
          IAP_ADDRL = addr;                           //设置IAP低地址
          IAP_ADDRH = addr >> 8;                      //设置IAP高地址
          IAP_DATA = dat;                             //写IAP数据
          IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
          IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
          _nop_();
          IapIdle();                                  //关闭IAP功能
      }
      void IapErase(int addr)
      {
          IAP_CONTR = WT_12M;                         //使能IAP
          IAP_CMD = 3;                                //设置IAP擦除命令
          IAP_ADDRL = addr;                           //设置IAP低地址
          IAP_ADDRH = addr >> 8;                      //设置IAP高地址
          IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
          IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
          _nop_();                                    //
          IapIdle();                                  //关闭IAP功能
      }
      void main()
      {
          IapErase(0x0400);
          P0 = IapRead(0x0400);                       //P0=0xff
          IapProgram(0x0400, 0x12);
          P1 = IapRead(0x0400);                       //P1=0x12
          while (1);
      }
  
 

refer:

https://www.cnblogs.com/shiningrise/p/7906873.html

文章来源: blog.csdn.net,作者:简一商业,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/liwei16611/article/details/93751033

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。