数码之家

 找回密码
 立即注册
搜索
查看: 3341|回复: 9

[C51] STC15W单片机读内部FLASH数据必须用IAP功能吗?

[复制链接]
发表于 2019-7-19 15:28:45 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我看芯片手册上读字节函数是这样的;
BYTE IapReadByte(WORD addr)
{
    BYTE dat;                       //数据缓冲区

    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_READ;             //设置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;                     //返回
}


太繁琐了,我现在需要遍历一个flash区找关键字节,后面还有大块大块的读取。这样一个字节一个字节的太慢了。flash不能用指针直接读吗?


发表于 2019-7-19 22:51:33 | 显示全部楼层
看相应的手册吧


~~~~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2019-7-20 00:43:56 | 显示全部楼层
模拟的EEPROM,不能直接访问,只能通过IAP接口访问
回复 支持 反对

使用道具 举报

发表于 2019-7-20 08:13:17 | 显示全部楼层
用外置不就行了
回复 支持 反对

使用道具 举报

发表于 2019-7-20 13:10:26 | 显示全部楼层
根据数据手册的理论和相应实践表明,FLASH模拟的EEPROM其实就是跟程序FLASH没啥区别,或者说就是程序FLASH预留的一部分,并关联到IAP的相关硬件接口中。
我们一般用过在程序储存器中预定义数组并且访问的方式,那么对于EEPROM来说,虽然无法直接定义但访问的方式在某些型号中与之前所说的是一致的。
例如:
MOV DPTR,#Target_Address
MOV A,#Offset_Address
MOVC A,@A+DPTR
这是手册告诉你的方法,不用使用IAP接口读取。
回复 支持 反对

使用道具 举报

发表于 2019-7-20 13:13:09 | 显示全部楼层
还有MSC-8051这种架构寻址能力其实很差的,加上对于STC这种具体的MCU来说,其内部FLASH的响应速度是很慢的,要求绝对的速度直接上ARM多好。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-20 16:24:40 | 显示全部楼层
la45088d1 发表于 2019-7-20 13:10
根据数据手册的理论和相应实践表明,FLASH模拟的EEPROM其实就是跟程序FLASH没啥区别,或者说就是程序FLASH ...

这一段有C语言的写法吗?
对方要求用STC51。

这样写的好像不行。
void Readflashdata(uint8 pg,uint8 offset,uint8 *buf,uint8 cnt)
{
    uint8 *ptr=(uint8*)(offset+pg);
    while(cnt--)
     *buf++=*ptr++;
}
回复 支持 反对

使用道具 举报

发表于 2019-7-20 16:51:47 | 显示全部楼层
回路师 发表于 2019-7-20 16:24
这一段有C语言的写法吗?
对方要求用STC51。

亲爱的同学,请打开数据手册的第845页,9.2节,你告诉我,你看到了什么?

尤其注意表格描述,到底哪些是可直读的,哪些是不可直读只能用IAP间接读取的,是不是很清楚啊,问啥不看呢?
这是我的例子,是一个成功应用的案例,你自己下面研究去吧!我跟你说,对于可直读的信号来说,读取方式对了,直读不会有任何问题,除非是STC硬件自己的问题。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +20 收起 理由
2545889167 + 20 干得漂亮

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-22 10:45:06 | 显示全部楼层
钟义亭 发表于 2019-7-20 20:01
IAP:In applicating Programing,在应用编程
ICP:In Circuit Programing,在电路编程

这些我知道。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-22 10:47:37 | 显示全部楼层
la45088d1 发表于 2019-7-20 16:51
亲爱的同学,请打开数据手册的第845页,9.2节,你告诉我,你看到了什么?

尤其注意表格描述,到底哪些是 ...

感谢回复。你确定了我的想法一定能实现。但你并没有解决用C语言怎么实现这个问题。
不过我在想到MOVC只操作CODE量后,想到可以定义CODE指针。
所以我的函数改成这样就可以了。

void Readflashdata(uint8 pg,uint8 offset,uint8 *buf,uint8 cnt)
{
    uint8 code *ptr=(uint8*)(offset+pg);
    while(cnt--)
     *buf++=*ptr++;
}

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-12 20:31 , Processed in 0.171601 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表