popo_new 发表于 2017-6-10 13:08:49

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

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();
}

xingkong911 发表于 2017-6-10 13:14:38

放在前面16个4K的区间不就行了?

levy 发表于 2017-6-10 13:22:15

资料说的一次最多写4K,你可以分8次写入就行了

popo_new 发表于 2017-6-10 13:52:52

levy 发表于 2017-6-10 13:22
资料说的一次最多写4K,你可以分8次写入就行了

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

levy 发表于 2017-6-10 14:01:13

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

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

leafstamen 发表于 2017-6-10 14:16:32

只有写扇区首地址的时候擦除一次,后面的地方不用擦除直接写。

STT 发表于 2017-6-10 14:20:56

1个sector 4KB 1个sector16个page 1个page256byte   每次写入最小单位是256byte32K数据 从第16扇区开始写 到扇区首地址就擦除不是首地址就写入 每隔扇区擦除一次就可 写完第一个4K后 写17号扇区 先擦17扇区不会影响16扇区的

weichao4808335 发表于 2017-6-11 23:15:58

flash可以一次擦处,多次写入,知道地址不同

postek 发表于 2017-6-12 08:15:19

哎呀我操,这问题,给我都快整懵圈了。 似乎那句话都是对的 。

wt3333 发表于 2017-6-12 09:20:46

(没看代码)扇区参数和写入是分开的,多次写入就可以了

nongxiaoming 发表于 2017-6-12 09:46:22

楼主搞笑吧,一个块你只要擦除一次就可以写很多次了,只要你写的那个区域是没有写过的。比如32K的块你就是擦除,然后写第一个4k,第二个4K,第三个4K……只要你写是数据地址是之前没写过的就行了。所有的flash都是这么来操作的。难道ST的128K的块你要擦除然后写128K?你这个buffer那得多大?

Alan_Zhang 发表于 2017-6-12 12:23:13

我用过这个芯片,在线升级100k都可以写

armstrong 发表于 2017-6-25 18:52:30

谁让你每次写之前都擦除扇区的?

waterghost 发表于 2017-6-25 19:13:57

想当年我不知道flash要擦出。

popo_new 发表于 2017-6-26 09:26:07

搞定了,只有遇到首地址时,才擦除flash,主要是对于这句理解的太机械了,“在写入flash时应先擦除”
页: [1]
查看完整版本: LPC1768 flash 最多只能写4K,求教如何解决?