基于arm7的(lpc2388)flash的读写操作

发布者:rnm888最新更新时间:2018-05-01 来源: eefocus关键字:arm7  lpc2388  flash  读写操作 手机看文章 扫描二维码
随时随地手机看文章

开始工作不久就碰到一个flash读写的问题。是一块lpc2388的芯片(arm7),


开始总是抱着一arm11的flash读写的方式去看数据手册。看了好长时间都没有一个很好的解决方发。


后来我在keil的库文件中找到:flash的写入方式。如下://C:\Keil\ARM\Flash\LPC2888\FlashPrg.c


/*

 *  Program Page in Flash Memory

 *    Parameter:      adr:  Page Start Address

 *                    sz:   Page Size

 *                    buf:  Page Data

 *    Return Value:   0 - OK,  1 - Failed

 */


int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {

  unsigned long i;


  // Preset data latches

  F_CTRL   = FC_CS | FC_FUNC | FC_WEN | FC_SET_DATA;

  F_CTRL   = FC_CS | FC_FUNC | FC_WEN;


  // Set timer register for programming

  F_PROG_TIME = 800 | FPT_ENABLE;


  // If size is not whole number of words, 

  // fill rest of last word with 0xFF

  if ((sz%4) != 0) {

    *((unsigned long *)buf+(sz/4)) |= or_mask[sz%4];

  }


  // Load data to data latches

  for (i = 0; i < ((sz+3)/4); i++)  {

    M32(adr) = *((unsigned long *)buf);

    buf += 4;

    adr += 4;

  }

  // Load remaining bytes to full page (512) with 0xFF

  for (i = ((sz+3)/4); i < (512/4); i++) {

    M32(adr) = 0xFFFFFFFF;

    adr += 4;

  }


  // Issue program command

  F_CTRL   = FC_CS | FC_FUNC | FC_PROTECT | FC_PROG_REQ;


  while (!(F_STAT & FS_DONE));          // Wait command to finish


  // Disable timer

  F_PROG_TIME = 0;


  return (0);                           // Done successfully

}


这里有很清晰的flash的写入方式,可是读取的方式了。


于是在看手册想找到一个寄存器之类的,进行读取啊。《LPC2388中文资料》在这里居然还是没找到,看下英文的吧,可是英文水平不咋的,还是无济于事啊。


                                **Arm7(lpc2388)Flash的读取**

1

2

后来在经理的帮助下原来lpc2388的flash的读写是这么的简单啊。(其他的单片机没有用到,我想arm系列的单片机可能都是这样子的了)


#define DestAddr    0x00038000      ///276k    0X0007CFFF

//就是一个flash的起始地址,

/*

recindex是一个其实地址的便宜,可以这样理解,可以根据自己的需要便宜,可以是任意值(0~1024)具体的范围的看数据手册。


adata是数据的保存,就是你分配的内存空间

*/

uint32 flash_read_256( int recindex, unsigned char *adata )

{

    unsigned int addr = DestAddr + recindex*256 ;

//把地址加出来

    unsigned char *intd = (unsigned char *)addr , no  ;

//转下

    memcpy( adata , intd , 230 ) ;

//直接memcpy()以内存读取的方式把flash的数据保存到内存中。230是你读取的数据长度,读取的数据长度是随意的,可以是1个也可以使256个,只要你个的内存可以放的下就行了

    return 1 ;     

}


这是写的代码:在下面是我自己整理的代码


/*

 *  Erase Sector in Flash Memory

 *    Parameter:      adr:  Sector Address

 *    Return Value:   0 - OK,  1 - Failed

 */


int EraseSector (unsigned long adr) {

  unsigned long n;


  n = GetSecNum(adr);                          // Get Sector Number


  IAP.cmd    = 50;                             // Prepare Sector for Erase

  IAP.par[0] = n;                              // Start Sector

  IAP.par[1] = n;                              // End Sector

  IAP_Call (&IAP.cmd, &IAP.stat);              // Call IAP Command

  if (IAP.stat) return (1);                    // Command Failed


  IAP.cmd    = 52;                             // Erase Sector

  IAP.par[0] = n;                              // Start Sector

  IAP.par[1] = n;                              // End Sector

  IAP.par[2] = CCLK;                           // CCLK in kHz

  IAP_Call (&IAP.cmd, &IAP.stat);              // Call IAP Command

  if (IAP.stat) return (1);                    // Command Failed


  return (0);                                  // Finished without Errors

}



/*

 *  Program Page in Flash Memory

 *    Parameter:      adr:  Page Start Address

 *                    sz:   Page Size

 *                    buf:  Page Data

 *    Return Value:   0 - OK,  1 - Failed

 */


int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {

  unsigned long n;


#if SET_VALID_CODE != 0                        // Set valid User Code Signature

  if (adr == 0) {                              // Check for Vector Table

    n = *((unsigned long *)(buf + 0x00)) +

        *((unsigned long *)(buf + 0x04)) +

        *((unsigned long *)(buf + 0x08)) +

        *((unsigned long *)(buf + 0x0C)) +

        *((unsigned long *)(buf + 0x10)) +

        *((unsigned long *)(buf + 0x14)) +

        *((unsigned long *)(buf + 0x18));

    *((unsigned long *)(buf + 0x1C)) = 0 - n;  // Signature at Reserved Vector

  }

#endif


  n = GetSecNum(adr);                          // Get Sector Number


  IAP.cmd    = 50;                             // Prepare Sector for Write

  IAP.par[0] = n;                              // Start Sector

  IAP.par[1] = n;                              // End Sector

  IAP_Call (&IAP.cmd, &IAP.stat);              // Call IAP Command

  if (IAP.stat) return (1);                    // Command Failed


  IAP.cmd    = 51;                             // Copy RAM to Flash

  IAP.par[0] = adr;                            // Destination Flash Address

  IAP.par[1] = (unsigned long)buf;             // Source RAM Address

  IAP.par[2] = 1024;                           // Fixed Page Size

  IAP.par[3] = CCLK;                           // CCLK in kHz

  IAP_Call (&IAP.cmd, &IAP.stat);              // Call IAP Command

  if (IAP.stat) return (1);                    // Command Failed


  return (0);                                  // Finished without Errors

}


自由发挥的:


/*

块的选择

*/

int SelSector(unsigned char sec1,unsigned char sec2)

{

    flash_paramin[0] = IAP_SELECTOR;

    flash_paramin[1] = sec1;

    flash_paramin[2] = sec2;

    (*(void(*)())STAT_ADR)(flash_paramin,flash_paramout);

//STAT_ADR是需要查数据手册来确定地址的。就是一个地址

    return(flash_paramout[0]);  

}


//擦除

Int EraseSector(unsigned int sec1,unsigned int sec2)

{

    flash_paramin[0] = IAP_ERASESECTOR;

    flash_paramin[1] = sec1;

    flash_paramin[2] = sec2;

    flash_paramin[3] = IAP_FCCLK;

    (*(void(*)())STAT_ADR)(flash_paramin,flash_paramout);

    return(flash_paramout[0]);  

}


//写入

int RamToFlash(unsigned int dst, unsigned int src, unsigned int no)

{

    flash_paramin[0] = IAP_RAMTOFLASH;

    flash_paramin[1] = dst; 

    flash_paramin[2] = src;

    flash_paramin[3] = no;

    flash_paramin[4] = IAP_FCCLK;

    (*(void(*)())STAT_ADR)(flash_paramin,flash_paramout); 

    return(flash_paramout[0]);  

}


//比较

int flash_Compare(unsigned int dst, unsigned int src, unsigned int no)

{

    flash_paramin[0] = IAP_COMPARE; 

    flash_paramin[1] = dst;

    flash_paramin[2] = src;

    flash_paramin[3] = no;

    (*(void(*)())STAT_ADR)(flash_paramin,flash_paramout);

    return( flash_paramout[0]); 

}

//块的计算

unsigned long GetSecNum_6208 (unsigned long adr, unsigned char *firstflag) 

{

    unsigned long n ;


    *firstflag = 0 ;


    n = (adr >> 12) & 0x7F;                      // Pseudo Sector Number

    if (n >= 0x78) {                             // High Small 4kB Sectors

        n -= 0x62;


        // addr 

        if( (adr & 0xFFF) == 0 ) {

            *firstflag = 1 ;

        } 

    }

    else if (n >= 0x08) {                        // Large 32kB Sectors

        n = 0x07 + (n >> 3);


        // addr 

        if( (adr & 0x7FFF) == 0 ) {

            *firstflag = 1 ;

        } 

    }

    return (n);                                  // Sector Number

}



对于写入,可以直接看keil的库文件的写法。

    no = GetSecNum( addr, &firstflag );    

    if( firstflag ) {

        recode =SelSector( no , no);

        if(0 != recode) SerOutput("flash_SelSector 1 error\n");

        recode = EraseSector( no , no );

        if(0 != recode) SerOutput("flash_EraseSector error\n");

    }


    recode = Compare( addr, (uint32)&flash_SendData, FLASH_SEG_SIZE);

    if( 0 != recode ){

        no = GetSecNum( addr );


        recode = SelSector( no, no);

        if(0 != recode) SerOutput("flash_SelSector 2 error\n");


        recode = RamToFlash( addr , (uint32)&flash_SendData, FLASH_SEG_SIZE);

        if(0 != recode) SerOutput("flash_RamToFlash error\n");


        SerOutput("flash_Compare 1 ERROR\n");

    }

    else SerOutput("flash_Compare 1 SUCCESS\n");


关键字:arm7  lpc2388  flash  读写操作 引用地址:基于arm7的(lpc2388)flash的读写操作

上一篇:最简单bootloader的实现与分析
下一篇:STM32 flash 读写操作

推荐阅读最新更新时间:2024-03-16 16:01

STM32-FSMC-NOR FLASH
一、基本概念(详细内容见st网站stm32应用笔记AN2784) 1. FSMC配置 控制一个NOR闪存存储器,需要FSMC提供下述功能: ●选择合适的存储块映射NOR闪存存储器:共有4个独立的存储块可以用于与NOR闪存、SRAM和PSRAM存储器接口,每个存储块都有一个专用的片选管脚。 ●使用或禁止地址/数据总线的复用功能。 ●选择所用的存储器类型:NOR闪存、SRAM或PSRAM。 ●定义外部存储器的数据总线宽度:8或16位。 ●使用或关闭同步NOR闪存存储器的突发访问模式。 ●配置等待信号的使用:开启或关闭,极性设置,时序配置。 ●使用或关闭扩展模式:扩展模式用于访问那些具有不同读写操作时序的存储器。 因为NOR闪存/SRA
[单片机]
STM32_SPI读写Flash
今天讲解“STM32F103 SPI读写Flash”,其实这第一阶段主要是讲解STM32的SPI功能,所有今天的重点是SPI,关于FLASH我应该要在后面再次讲述。 今天提供并讲解的软件工程,基于软件工程“A0.0.0(STM32F10x_TIM延时)”修改而来。若不知道如何而来,请关注微信公众号“EmbeddDeveloper”获取更多信息。 本着免费分享的原则,将讲解的工程源代码分享给大家,还望看到的朋友关注和推广一下微信公众号,增加一下人气。 每天提供下载的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘。 今天的软件工程下载地址(360云盘): https://yunpan.cn/cPzhMX
[单片机]
STM32_SPI<font color='red'>读写</font><font color='red'>Flash</font>
STM32F7xx —— 内部flash
这个就没什么好说的了,直接上代码了,主要封装了三个函数,擦除,写flash,读flash。 // STM32F767IGT6: 1M flash // STM32F767ZIT6: 2M flash #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 32 Kbytes */ #define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08008000) /* Base @ of Sector 1, 32 Kbytes */ #define ADDR_FLASH_SECTOR_2 ((uint32_
[单片机]
STM32—SPI读写FLASH
FLASH简介 FLASH俗称闪存,和EEPROM一样,都是掉电数据不丢失的非易失行存储器,但FLASH的存储容量普遍大于EEPROM,现在像如U盘、SD卡、SSD固态硬盘以及STM32芯片内部存储程序的设备都是FLASH类型的存储器。由此可见FLASH对于我们学习和工作的重要性,EEPROM可以实现单字节的擦写,而FLASH都是一大片的擦写,就像是大规模杀伤性武器,其最小擦除单位:扇区的大小也是4KB。 我们此次通过SPI对FLASH存储芯片W25Q64进行读写擦除的操作。 对于FLASH内部结构的详细说明博主会专门整理一篇博客来说明,所以关于FLASH芯片的相关原理,本文中只做简单说明,侧重代码部分。 FLASH详细说明的
[单片机]
STM32—SPI<font color='red'>读写</font><font color='red'>FLASH</font>
联盛德W801系列1-flash保存数据例程:保存wifi配网信息
1.W801内部flash资料 1.1 W801内部flash用途分区 W801的内部flash大小是2M 字节,物理地址是0x08000000-0x081FFFFF. 在CDK的例程中,flash内部各个地址段有特定的用途,看看这种《内部flash分区表》: 其中留给用户使用的范围就是“User Area”【0x081C0000 ~ (0x081FC000-1)】。 1.2 内部flash的擦除写入特性 擦除的最小单位是扇区,每个扇区4k 字节;同一个扇区的内容会同时被擦除,所以改变同个扇区的部分内容时,必须把其他内容临时保存后,一起重新写入。 这一点,库函数 int tls_fls_write(u32 addr, u8
[单片机]
联盛德W801系列1-<font color='red'>flash</font>保存数据例程:保存wifi配网信息
NAND Flash的驱动程序设计方案
NAND Flash的驱动程序设计方案 以三星公司K9F2808UOB为例,设计了NAND Flash与S3C2410的接口电路,介绍了NAND Flash在ARM嵌入式系统中的设计与实现方法,并在UBoot上进行了验证。所设计的驱动易于移植,可简化嵌入式系统开发。 关键词 ARM UBoot NAND Flash K9F2808UOB 驱动程序 引言   当前各类嵌入式系统开发设计中,存储模块设计是不可或缺的重要方面。NOR和 NAND是目前市场上两种主要的非易失闪存技术。NOR Flash存储器的容量较小、写入速度较慢,但因其随机读取速度快,因此在嵌入式系统中,常用于程序代码的存储。与NOR相比,NAND闪存的优
[模拟电子]
NAND <font color='red'>Flash</font>的驱动程序设计方案
Flash编程器的FPGA实现
1 引言 闪速存储器(FLASH Memory)以其集成度高、成本低、使用方便等许多优点,广泛应用于通讯设备、办公设备、家用电器、医疗设备等领域。利用其保存信息的非易失性和在线更新数据参数的特性,可将其作为具有一定灵活性的只读存储器(ROM)使用。 现在的数字电路应用系统设计中,经常遇到大容量的数据存储问题。Flash由于容量大、存储速度快、体积小、功耗低等诸多优点,而成为应用系统中数据存储器件的首选。由于在研制实时信号处理系统时,需要一块大容量的Flash来存储坐标变换的数据作查找表,因此面临一个如何对Flash进行编程,将数据写入Flash的问题。由于我们选用的Flash芯片为SST39SF010/020,是最
[工业控制]
<font color='red'>Flash</font>编程器的FPGA实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved