搜索
bottom↓
回复: 14

LPC1768 flash 最多只能写4K,求教如何解决?

[复制链接]

出0入0汤圆

发表于 2017-6-10 13:08:49 | 显示全部楼层 |阅读模式
LPC1768 Flash 总共有512K,其中:
0~15 扇区为 4K   有16个;
16~29扇区为32K共有14个;
4x16 + 32x14=2x32+32x14=16x32=512K希望

我有一个比较大的数组(采样记录来的),32K希望存入16~29扇区其中之一.试过无数遍,最
多只能存4K,28K空间白白浪费。因为每次写之间,都要做擦除。所能扇区虽有32K,但我只能用到4K。
后来在数据手册上也查到了,flash最多只能写4K(请见附件)
其它网友有好办法吗?还是我的方法有错误?谢谢指教

附mem_copy函数:

//ucSec1 启始扇区
//ucSec2 结束扇区
//Iadd1  启始地址
//Iadd2  结束地址
//Inum   复制字节个数,为512/1024/4096
void Write_flash_04(uint8_t ucSec1, uint8_t ucSec2,uint32_t Iadd1, uint16_t *Iadd2, uint32_t Inum)
{
        uint32_t i1,i2;       
        extern uint16_t tr_span;
       
    IAP_Entry = (void(*)())IAP_ENTER_ADR;                               // 初始化函数指针IAP_Entry
    __disable_irq();                                                    // 在IAP操作前必须关闭所有中断  
   
    parIdRead();                                                        // 读器件ID                     
    codeIdBoot();                                                       // 读Boot版本号
   Mcu_ID= parIdserial();   
    sectorPrepare(ucSec1,ucSec2);                                                 // 准备扇区29               
    sectorErase(ucSec1,ucSec2);                                                   // 擦除扇区29                  
    blankChk(ucSec1,ucSec2) ;                                                     // 查空扇区29                  
//   
    sectorPrepare(ucSec1,ucSec2);                                                 // 选择扇区29  
  flash_code=ramCopy(Iadd1 ,        (uint32_t)(Iadd2),      4*Inum);    // 写数据到扇区1      复制字节个数,为256/512/1024/4096
    __enable_irq();
}

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2017-6-10 13:14:38 | 显示全部楼层
放在前面16个4K的区间不就行了?

出0入0汤圆

发表于 2017-6-10 13:22:15 | 显示全部楼层
资料说的一次最多写4K,你可以分8次写入就行了

出0入0汤圆

 楼主| 发表于 2017-6-10 13:52:52 | 显示全部楼层
levy 发表于 2017-6-10 13:22
资料说的一次最多写4K,你可以分8次写入就行了

第一次写入4K,在准备写第二次之前,它会先擦除,再写新的4K,第一次的4K就不见了

出0入0汤圆

发表于 2017-6-10 14:01:13 | 显示全部楼层
popo_new 发表于 2017-6-10 13:52
第一次写入4K,在准备写第二次之前,它会先擦除,再写新的4K,第一次的4K就不见了 ...

你就不能不擦除啊????

出0入57汤圆

发表于 2017-6-10 14:16:32 | 显示全部楼层
只有写扇区首地址的时候擦除一次,后面的地方不用擦除直接写。

出0入0汤圆

发表于 2017-6-10 14:20:56 | 显示全部楼层
1个sector 4KB 1个sector16个page 1个page256byte   每次写入最小单位是256byte  32K数据 从第16扇区开始写 到扇区首地址就擦除  不是首地址就写入 每隔扇区擦除一次就可 写完第一个4K后 写17号扇区 先擦17扇区  不会影响16扇区的

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2017-6-11 23:15:58 来自手机 | 显示全部楼层
flash可以一次擦处,多次写入,知道地址不同

出0入0汤圆

发表于 2017-6-12 08:15:19 | 显示全部楼层
哎呀我操,这问题,给我都快整懵圈了。 似乎那句话都是对的 。

出5入8汤圆

发表于 2017-6-12 09:20:46 | 显示全部楼层
(没看代码)扇区参数和写入是分开的,多次写入就可以了

出0入0汤圆

发表于 2017-6-12 09:46:22 | 显示全部楼层
楼主搞笑吧,一个块你只要擦除一次就可以写很多次了,只要你写的那个区域是没有写过的。比如32K的块你就是擦除,然后写第一个4k,第二个4K,第三个4K……只要你写是数据地址是之前没写过的就行了。所有的flash都是这么来操作的。难道ST的128K的块你要擦除然后写128K?你这个buffer那得多大?

出0入0汤圆

发表于 2017-6-12 12:23:13 来自手机 | 显示全部楼层
我用过这个芯片,在线升级100k都可以写

出870入263汤圆

发表于 2017-6-25 18:52:30 | 显示全部楼层
谁让你每次写之前都擦除扇区的?

出0入0汤圆

发表于 2017-6-25 19:13:57 来自手机 | 显示全部楼层
想当年我不知道flash要擦出。

出0入0汤圆

 楼主| 发表于 2017-6-26 09:26:07 | 显示全部楼层
搞定了,只有遇到首地址时,才擦除flash,主要是对于这句理解的太机械了,“在写入flash时应先擦除”
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 20:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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