ARM编程中Flash ROM驱动示例

发布者:会弹琴的鲸鱼3312最新更新时间:2013-12-04 来源: 21ic关键字:ARM编程  Flash  ROM驱动 手机看文章 扫描二维码
随时随地手机看文章

Intel Flash芯片 i28f160,i28f320:

i28F320B: 64*64K,64个blocks,4M空间,每个block 64K,第一个64K由8个8*8K小blocks组成.

每个Black可以被独立擦写(寿命周期) 100,000次以上

Flash操作的大概步骤:

flash读写操作中,读应该很简单,和RAM一样,写就复杂一点. 
Intel TE28F320C3的flash是4M空间
flash空间,划分成许多的block,Intel TE28F320C3的flash是4M空间,64个block,每个block由64K.
要对所有的block单独进行操作, 每个操作结束,都需要判断状态, 
每个block操作的大概步骤如下: 
1.unlock 
2.erase 
3.check empty 
所有的block完成上述操作,且状态正确,才能进行下一步,写 
4.write 

arm汇编程序

     LDR r2, =FlashBase                     ;Flash起始地址

//第一步,UNLOCK的64个block,步骤和上边一样


          MOV r1,#63                       ;63x64k block 计数 


01     LDRB   r3, =X16_FLASH_COMMAND_CONFIG_SETUP

          STRB          r3, [r2]           ;该block的首地址  

          LDRB          r3, =X16_FLASH_COMMAND_UNLOCK_BLOCK

          STRB          r3, [r2]           ;将Unlock命令写入

          ADD r2, r2, #0x10000             ;64K
          SUBS          r1, r1, #1
          BNE %b01                            
;Unlock OK                                 ;Unlock 完成

//第二布,擦除blocks

        LDR         r0, =FlashBase
        LDR         r1,=63                       ;擦除 63x64k block
01    LDR     r3, =X16_FLASH_COMMAND_ERASE
        LDR     r2, =X16_FLASH_COMMAND_CONFIRM   
        ORR         r3, r3, r2, LSL #16
        STR         r3, [r0]
        LDR     r3, =X16_FLASH_COMMAND_STATUS ;检查寄存器状态
        STRB    r3, [r0]
02    LDRB    r3, [r0]                              ;读状态
        TST         r3, #X16_FLASH_STATUS_READY 
        BEQ     %b02                          ;若状态ready,执行下一个   
        TST     r3, #X16_FLASH_STATUS_ERROR
        BNE     error_erase_block
        ADD         r0, r0, #0x10000
        SUBS    r1, r1, #1
        BNE         %b01
        B         EraseOK
error_erase_block
..............
;EraseOK                               ;擦除完成

//第三步,检查flash是否为空

;Check Flash Empty
        LDR         r4, =FlashBase
        LDR         r5, =0x100000                    ;检查 1MB
        LDR         r0, =0xffffffff
loop_1
        LDR         r1, [r4]
        CMP         r1, r0                     ;比较地址内容和0xffffffff
        BNE         empty_error
       ADD         r4, r4, #4
        CMP         r4, r5
        BLO         loop_1
        B         CheckOK
empty_error
.................
CheckOK
.................

;Check empty OK                        ;检查完成  

//第四步,写flash

;Burn data to Flash ROM

        LDR         r6, =Length_Flash           ;定义数据长度
        LDR         r0, =FlashBase
        LDR         r1, =BufferBase
        MOV         r9, #0
        LDR         r4,=0x10000000
        LDR         r7,=0xc0001000
        STR         r4,    [r7]
        LDR         r1, [r1, r9]

03    LDR     r3, =X16_FLASH_COMMAND_WRITE
        STRB    r3, [r0]                                         ;把写命令放入Block首地址
       LDR     r3, =X16_FLASH_COMMAND_STATUS   
        LDR         r2, [r7]                                          
        LDR         r5, =0x0000ffff            
        AND         r2, r2, r5
        ORR         r2, r2, r3, LSL #16
        STR         r2, [r0]        
02    LDR         r3, [r0]                                 ;读状态寄存器状态
        TST         r3, #X16_FLASH_STATUS_READY   
        BEQ     %b02                          ;若状态ready,执行下一个

        LDR     r3, =X16_FLASH_COMMAND_WRITE
        LDR         r2, [r7]            
        LDR         r5, =0xffff0000                             ;
        AND         r2, r2, r5
        ORR         r3, r3, r2
        STR         r3, [r0]

        LDR     r3, =X16_FLASH_COMMAND_STATUS
        STRB    r3, [r0]            
02    LDR         r3, [r0]                             ; read status
        TST         r3, #X16_FLASH_STATUS_READY
        BEQ     %b02

        LDR     r4, =X16_FLASH_COMMAND_READ
        STRB    r4, [r0]
        ADD         r0, r0, #4
        LDR         r8, [r7]
        ADD         r8, r8,#1
        STR         r8, [r7]
        ADD         r8, r8, #4
writenext

        SUBS     r6, r6, #4         ;if no finished goto 03
        BHI         %b03
        TST     r3, #X16_FLASH_STATUS_ERROR
        BNE     error_write
        LDR     r3, =X16_FLASH_COMMAND_READ
        STRB    r3, [r0]
        B         BurnOK
error_write
    ..........
BurnOK

关键字:ARM编程  Flash  ROM驱动 引用地址:ARM编程中Flash ROM驱动示例

上一篇:基于ARM的三轴伺服控制系统人机界面设计
下一篇:ARM编程中的ARM Boot 示例

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

ulink-Jlink下在ramflash中调试STM32的方法
Keil MDK3.20 在ULINK下调试stm32方法 1. 程序在RAM中运行 要点:(1)程序的下载地址改到RAM空间中 (2)程序的debug之前要设定SP,PC指针到Ram空间 新建工程,选择STM32 的具体型号,我买的万利的开发板,选择stm32f103Vb。 设定程序下载地址,如下图所示,IROM1的地址指向了STM32的ram空间。 空间大小如何分配取决于自己的需求。本款处理器内部ram大小为20K,分配16K给只读区,4K给可读可写区。这样IROM设定的大小为0x4000,IRAM1的起始就变为0X20004000,大小只剩下0X1000。 Debug标签选择ULINK1 Corte
[单片机]
ulink-Jlink下在<font color='red'>ram</font>和<font color='red'>flash</font>中调试STM32的方法
STM32 Flash读写;Flash地址对应的存储内容及方式
概念:计算机中最小的信息单位是bit,也就是一个二进制位,8个bit组成一个Byte,也就是1个字节, 1个存储单元存放1个字节,每个存储单元对应一个32位(bit)地址,所以重要的话说三遍:对于32bit的ARM CPU 一个32位地址指向1个字节!!! 一个32位地址指向1个字节!!! 一个32位地址指向1个字节!!! 我们常说的flash空间,多少多少K,指的是多少多少K byte 假如我们执行下面的函数操作: FlashWriteWord_P(0x1082,&WordVar); /* 向0x1082、0x1083中写入0xABCD */ 经过编译,从map文件查看flash内容如下: 注意,前面的1
[单片机]
STM32F030用IAR+JLINK在线调试无法下载FLASH问题
今天遇到STM32 下载问题,百度半天没找到解决办法;在此记录一笔: 环境: IAR 7.2 开发板: STM32F103C8T6 下载方式: SWD 下载失败的log大概如下: Fri Nov 14, 2014 17:22:59: ST-Link firmware too old Fri Nov 14, 2014 17:22:59: Connected to ST-Link/V2 Firmware V2.J21.S4 (Probe no: D1A2B612) Fri Nov 14, 2014 17:22:59: Selecting SWD as current target interface. Fri Nov 14, 20
[单片机]
msp430 内存Flash 读写
  1、msp430的存储结构采用冯。依曼结构,即RAM和Flash在同一个寻址空间内统一编址,没有代码空间和数据空间之分。   2、Flash是以段为为基本结构进行存储的。总体上分三部分:   Flash主存储区: 用于存储程序代码,被分成4个扇区,每个扇区分128seg, 每个seg段 大小为 64 * 1024 / 128 = 512B。 Flash控制器可以以位、字节、或者字的格式写入Flash控制器。但是控制器最小的擦除单位是段 。   BSL存储区: 是存储器的引导加载存储器,可以用于存储引导加载程序,分4段,每段512B,每段可以单独擦除、信息存储区: 主要用于存储需要掉电后永久保存的数据,分4段,每段128
[单片机]
msp430 <font color='red'>内存</font><font color='red'>Flash</font> 读写
中国 NAND Flash 制造的现况、发展与机会
    紫光旗下同方国芯提出私募 800 亿元人民币的增资案,用于 Flash 产业。本篇报告分析中国和国际在 NAND 的现况和计画,讨论中国在 NAND 的发展机会。 拓墣产业研究所(TRI)在 2015 年报告中提到,2015 年 11 月 6 日中国同方国芯电子股份有限公司资产重整后,将成为紫光集团下的子公司。此外,同方国芯也提出私募 800 亿元人民币增资案,主要用于建造 Flash 工厂(75%)、收购力成 25%(4.7%),以及收购产业链上下游厂商(20.3%)。 若此 800 亿元人民币增资案通过政府审核同意执行,将是中国上交所成立至今最大的资金募集案。另一方面,若以 2014
[手机便携]
基于TMS320DM642的编程
  引言   一个完整的嵌入式系统必须要有一个合适的存储器存放用户代码。Flash是一种非易失性存储器,而且具有电可擦写、容量大、价格便宜等特点,通常可用于在DSP系统中存放用户代码。   Flash在正常使用前要进行编程,即将用户代码写入Flash。在系统编程方法不需要其它编程设备和编程电源,只借助于仿真器,可直接通过DSP烧写程序对Flash进行编程。本文所使用的编程方法就属于在系统编程。   本文首先介绍常见的Flash编程方法,然后详细介绍本文方法的原理,以及DSP系统上电加载原理,最后给出整个实现过程并分析了Flash编程时需要注意的一些问题。        图1 系统上电的工作步骤      图2 程序
[嵌入式]
基于TMS320DM642的<font color='red'>编程</font>
STM32F207内部Flash编程详解
本文将根据ST官方Flashprogramming manual,文档编号:PM0059,讲解STM32F207内部Flash编程。 01概述 这里的flash是指STM32F207内部集成的Flash Flash存储器有以下特点 最大1M字节的能力 128位,也就是16字节宽度的数据读取 字节,半字,字和双字写入 扇区擦除和批量擦除 存储器的构成 主要存储区块包含4个16K字节扇区,1个64K字节扇区和7个128K字节扇区。 系统存储器是用于在系统boot模式启动设备的。这一块是预留给ST的。包括bootloader程序,boot程序用于通过以下接口对Flash进行编程。USART1、USART3、CAN2、USB OTG
[单片机]
STM32F207内部<font color='red'>Flash</font><font color='red'>编程</font>详解
stm32f407 内部flash保存数据
#include stm32f4xx.h //FLASH起始地址 #define STM32_FLASH_BASE 0x08000000 //STM32 FLASH的起始地址 #define FLASH_SAVE_ADDR 0x080A0000 //保存地址 //FLASH 扇区的起始地址 #define ADDR_FLASH_SECTOR_0 ((u32)0x08000000) //扇区0起始地址, 16 Kbytes #define ADDR_FLASH_SECTOR_1 ((u32)0x08004000) //扇区1起始地址, 16 Kbytes #define ADDR_FLASH_S
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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