188610329 发表于 2022-8-10 20:39 谢谢,就是硬件不同而不同。 |
yzwzfyz 发表于 2022-8-10 16:42 已明白,谢谢! |
188610329 发表于 2022-8-10 20:45 明白了,就是头文件里没定义想用都没得用 ![]() |
我感觉没有必要纠结什么的吧 数据手册上有什么,就用什么 如果想知道,可以对比一下擦除时间之类的区别 |
liyago 发表于 2022-8-10 18:46 你用不用 头文件的? 你打开 STC15.H 这个头文件 你只能找到: sfr IAP_CONTR = 0xC7; 而找不到: sfr ISP_CONTR = ???? 反过来,你打开 STC89C5xRC.H 这个头文件 你只能找到: sfr ISP_CONTR = 0xE7; 而找不到: sfr IAP_CONTR = ???? 这就是 STC的改版,地址不一样了,名字也不一样,明白了?? 没有哪个更好,因为 一个单片机里 只有其中一个。 |
STC手册 89系列 第 270 页。 http://www.51hei.com/bbs/dpj-82368-1.html 看到如下图: ![]() 注意,红框位置的 地址。 STC15 系列手册 第 841 页。 看到如下图: ![]() 注意,红框位置的 地址。 由于,地址本身不同,所以 一个用 ISP 命名, 一个用 IAP命名, 防止因为用错头文件,而出了问题也不知道问题在哪里。 即,虽然是同一个操作方式,但是,由于寄存器地址不同,所以给了不同的名字。目的是为了区分 版本差别。 同理, T2 定时器, 89系列名字 叫 TL2, TH2, 15系列里面叫 T2L, T2H, 都是 定时器 初值定义, 但是寄存器地址 变了,所以,名字就要变。 |
188610329 发表于 2022-8-10 14:18 什么不同的地址呢?是不是说这两个只是两种不同的方法,用哪种都行? 型号 大小 扇区数 开始地址 结束地址 MOVC读偏移地址 STC15F/L2K32S2 29K 58扇区 0x0000 ~ 0x73FF 0x8000 比如要读写STC15F2k32s2,用哪种方法都一样是吧 |
188610329 发表于 2022-8-10 15:45 ??? ![]() ![]() |
以51单片机为例:其存储器分为三块。 1、程序存储器:可寻址空间64K,用于存放用户的程序,CPU取指令只能在此空间。 2、外部分扩展存储器:可寻址空间64K,用于存放数据,CPU无法在此空间取指令。 3、内部分RAM:256字节。这里略去功能介绍。 问题来了:如果用户弄了2K的EEPROM,如何让它能被CPU寻址(访问)到呢? 有两种方案: 1、程序一般用不了64K的全部空间,于是在【程序存储器】中挖出2K的空间,将它做成EEPROM。这是STC一种做法。例如:IAP15Fxxxx型号芯片。 由于程序存储器通常只能在烧录时写入,而EEPROM却需要在程序运行中,由程序读、写或擦除,为此STC又特意开发了一套写、擦它的方式。但读取仍可以用通用的指令进行,如:MOVC A, @A+DPTR。 这种方案好处是:无需单独再做EEPROM,直接利用【程序存储器】的FLASH空间当作EEPROM用,且大小空间比较自由灵活,用不完的FALSH空间可以随便用。 这里有一个风险:比如:0000-11FFH放的是程序,如果你把此区域当作是EEPROM,对它进行写、擦操作,则程序就被破坏掉了。所以这个方案需要你知道程度占多长?哪些区域是程序用不到的地方。 不过风险中,也有一个重要的好处:可以用程序,修改自己的程序!例如,程序在运行中就能进行自我升级:擦除原来的程序重新写入新的程序!这是高级用法,就不在此介绍了。 2、在【外部分扩展存储器】中挖出2K的空间,将它做成EEPROM,这是常用的方式,不多介绍了。 楼主用C语言写程序,两种方式无所谓好坏之分。但必须知道EEPROM的数据是在哪个区域,因为你在定义一个EEPROM中的数据变量时,需要用到。 如果不考虑在线或远程升级程序,建议用第2种方式的EEPROM芯片,需要考虑的问题少,不易出错。 |
lkc8210 发表于 2022-8-10 15:12 89的手册,寄存器是ISP_????,头文件也是,89,90的寄存器是ISP_xxxx,15,8的头文件是iapxxxx,指向的地址是不同的。 |
在STC-ISP的EEPROM范例程序里从89看到8H 全都是用IAP ISP的程序从哪来的? |
ISP和iap,对应的sfr寄存器地址不同,不是哪个好,而是为了区别不同的地址。 |