完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
用N76E003的IAP保存累时数据,一分钟保存一次,
问题是N76E003的IAP是不是每次写数据都要擦除 如果每次擦除不是用不了多久100000次就用完了 部分代码如下: volatile unsigned char code vss_hze_Flash[128] _at_ 0x3800; void Erase_DATAFLASH(u16 IAP_addr) //擦除 { EA=0; TA = 0xAA; //CHPCON受TA保护 TA = 0x55; CHPCON |= 0x01; //IAPEN = 1, 启用IAP模式 TA = 0xAA; //IAPUEN受TA保护 TA = 0x55; IAPUEN |= 0x01; //APUEN = 1, 启用APROM更新 IAPCN = PAGE_ERASE_AP; //擦除页面200h-27Fh IAPAL = IAP_addr; IAPAH = IAP_addr>>8; IAPFD = 0xFF; TA = 0xAA; //IAPUEN受TA保护 TA = 0x55; IAPTRG |= 0x01; //将I写入'1'以触发IAP进程 EA=1; } void write_DATAFLASH(u16 IAP_addr,u8 IAP_data) //写数据 { EA=0; TA = 0xAA; //IAPTRG受TA保护 TA = 0x55; CHPCON |= 0x01; //IAPEN = 1, 启用IAP模式 TA = 0xAA; //IAPUEN受TA保护 TA = 0x55; IAPUEN |= 0x01; //APUEN = 1, 启用APROM更新 IAPCN = BYTE_PROGRAM_AP; // 编程 201h with 55h IAPAL = IAP_addr; IAPAH = IAP_addr>>8; IAPFD = IAP_data; TA = 0xAA; TA = 0x55; IAPTRG |= 0x01; //将I写入'1'以触发IAP进程 TA = 0xAA; //IAPUEN受TA保护 TA = 0x55; IAPUEN &= ~0x01; //APUEN = 0, 禁用APROM更新 TA = 0xAA; //CHPCON受TA保护 TA = 0x55; CHPCON &= ~0x01; //IAPEN = 0, 禁用IAP模式 EA=1; } //调用写16bit数据 Erase_DATAFLASH(0x3800); write_DATAFLASH(0x3800,byte0); write_DATAFLASH(0x3801,byte1); //读数据 byte0=vss_hze_Flash[0]; byte1=vss_hze_Flash[1]; 你开辟一个区,轮番写,不要总对一个固定地址写,循环写。。。 肯定不能总对着一个地址擦写啊,要顶一个循环,比如定义三个擦写的单元,擦除1,写2;擦除2,写3,擦除3写1;这么循环来。
是,我是往60页循环写的,只是觉得这样有点浪费,一页一般就写一字节,擦除还费时间,这方面没有STM8S003的好
你这是浪费啊,你的写法有问题,你不一定每次都擦除啊,定义一个特殊标记,只确认最后一个的,当够一个页了再擦除。。比如一个页面可以写三个单元,你就确认使用最后那个单元的,写满了一个页再擦除了写后面那个页。 只能在0x3800这个地址写数据吗?我用0x4700为什么不行呀 楼主,能不能把你的N76E003R的IAP程序分享一下,谢谢 应该不是这么回事吧,你写满了需要重写时候才擦。 根据需要规划好空间。 你这保存的太频繁了。 建议重新规划,不要对flash擦写太频繁,需要最终保存的时候再写入。 |
|
相关推荐
1个回答
|
|
|
;amp;nbsp; IAP_CONTR = 0x03; //设置成擦除模式 IAP_ADDRH = HIBYTE(IAP_addr); //设置地址 IAP_ADDRL = LOBYTE(IAP_addr); IAP_TRIG = 0x46; //写入特定的指令完成擦除操作 EA = 1;}void Write_DATAFLASH_Byte(unsigned int u16_addr,unsigned char u8_data) //单字节写入{ EA=0; IAP_CONTR = 0x02; //选择单字节写入模式 IAP_ADDRH = HIBYTE(u16_addr); //设置要写入的地址 IAP_ADDRL = LOBYTE(u16_addr); IAP_DATA = u8_data; //写入要保存的数据 IAP_TRIG = 0x46; //启动写入 EA = 1;}
根据代码可以看出,每次写入数据不需要先擦除Flash,而是直接写入数据即可,因为Flash是按字节写入的,可以覆盖之前的数据。但是需要注意的是,每次写入的数据不能超过一页(128字节),否则会覆盖掉之前的数据。因此,每次写入数据时,需要判断写入的地址是否在同一页内,如果不在,则需要先擦除该地址所在的那一页。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
1022 浏览 1 评论
1852 浏览 0 评论
1833 浏览 1 评论
3258 浏览 5 评论
3585 浏览 9 评论
1023浏览 1评论
1851浏览 1评论
如何知道嵌入式电子控制单元 (ECU) 中的RAM使用情况?
1361浏览 1评论
1853浏览 0评论
1179浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 08:03 , Processed in 0.500783 second(s), Total 43, Slave 33 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
571