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();
}
放在前面16个4K的区间不就行了? 资料说的一次最多写4K,你可以分8次写入就行了 levy 发表于 2017-6-10 13:22
资料说的一次最多写4K,你可以分8次写入就行了
第一次写入4K,在准备写第二次之前,它会先擦除,再写新的4K,第一次的4K就不见了 popo_new 发表于 2017-6-10 13:52
第一次写入4K,在准备写第二次之前,它会先擦除,再写新的4K,第一次的4K就不见了 ...
你就不能不擦除啊???? 只有写扇区首地址的时候擦除一次,后面的地方不用擦除直接写。 1个sector 4KB 1个sector16个page 1个page256byte 每次写入最小单位是256byte32K数据 从第16扇区开始写 到扇区首地址就擦除不是首地址就写入 每隔扇区擦除一次就可 写完第一个4K后 写17号扇区 先擦17扇区不会影响16扇区的
flash可以一次擦处,多次写入,知道地址不同 哎呀我操,这问题,给我都快整懵圈了。 似乎那句话都是对的 。 (没看代码)扇区参数和写入是分开的,多次写入就可以了 楼主搞笑吧,一个块你只要擦除一次就可以写很多次了,只要你写的那个区域是没有写过的。比如32K的块你就是擦除,然后写第一个4k,第二个4K,第三个4K……只要你写是数据地址是之前没写过的就行了。所有的flash都是这么来操作的。难道ST的128K的块你要擦除然后写128K?你这个buffer那得多大? 我用过这个芯片,在线升级100k都可以写 谁让你每次写之前都擦除扇区的? 想当年我不知道flash要擦出。 搞定了,只有遇到首地址时,才擦除flash,主要是对于这句理解的太机械了,“在写入flash时应先擦除”
页:
[1]