【IoT】STC 内置 EEPROM 使用之 IAP

举报
产品人卫朋 发表于 2021/10/29 23:08:37 2021/10/29
【摘要】 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 为例:


  
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. //测试工作频率为11.0592MHz
  4. sfr     IAP_DATA    =   0xC2;
  5. sfr     IAP_ADDRH   =   0xC3;
  6. sfr     IAP_ADDRL   =   0xC4;
  7. sfr     IAP_CMD     =   0xC5;
  8. sfr     IAP_TRIG    =   0xC6;
  9. sfr     IAP_CONTR   =   0xC7;
  10. #define WT_30M          0x80
  11. #define WT_24M          0x81
  12. #define WT_20M          0x82
  13. #define WT_12M          0x83
  14. #define WT_6M           0x84
  15. #define WT_3M           0x85
  16. #define WT_2M           0x86
  17. #define WT_1M           0x87
  18. void IapIdle()
  19. {
  20.     IAP_CONTR = 0;                              //关闭IAP功能
  21.     IAP_CMD = 0;                                //清除命令寄存器
  22.     IAP_TRIG = 0;                               //清除触发寄存器
  23.     IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  24.     IAP_ADDRL = 0;
  25. }
  26. char IapRead(int addr)
  27. {
  28.     char dat;
  29.     IAP_CONTR = WT_12M;                         //使能IAP
  30.     IAP_CMD = 1;                                //设置IAP读命令
  31.     IAP_ADDRL = addr;                           //设置IAP低地址
  32.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  33.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  34.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  35.     _nop_();
  36.     dat = IAP_DATA;                             //读IAP数据
  37.     IapIdle();                                  //关闭IAP功能
  38.     return dat;
  39. }
  40. void IapProgram(int addr, char dat)
  41. {
  42.     IAP_CONTR = WT_12M;                         //使能IAP
  43.     IAP_CMD = 2;                                //设置IAP写命令
  44.     IAP_ADDRL = addr;                           //设置IAP低地址
  45.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  46.     IAP_DATA = dat;                             //写IAP数据
  47.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  48.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  49.     _nop_();
  50.     IapIdle();                                  //关闭IAP功能
  51. }
  52. void IapErase(int addr)
  53. {
  54.     IAP_CONTR = WT_12M;                         //使能IAP
  55.     IAP_CMD = 3;                                //设置IAP擦除命令
  56.     IAP_ADDRL = addr;                           //设置IAP低地址
  57.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  58.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  59.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  60.     _nop_();                                    //
  61.     IapIdle();                                  //关闭IAP功能
  62. }
  63. void main()
  64. {
  65.     IapErase(0x0400);
  66.     P0 = IapRead(0x0400);                       //P0=0xff
  67.     IapProgram(0x0400, 0x12);
  68.     P1 = IapRead(0x0400);                       //P1=0x12
  69.     while (1);
  70. }

 

refer:

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

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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