Flash ROM编程示例
2013-01-30
标签:

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 计数

01LDRBr3, =X16_FLASH_COMMAND_CONFIG_SETUP

STRBr3, [r2];该block的首地址

LDRBr3, =X16_FLASH_COMMAND_UNLOCK_BLOCK

STRBr3, [r2];将Unlock命令写入

ADD r2, r2, #0x10000;64K

SUBSr1, r1, #1

BNE %b01

;Unlock OK;Unlock 完成

//第二布,擦除blocks

LDRr0, =FlashBase

LDRr1,=63;擦除 63x64k block

01LDRr3, =X16_FLASH_COMMAND_ERASE

LDRr2, =X16_FLASH_COMMAND_CONFIRM

ORRr3, r3, r2, LSL #16

STRr3, [r0]

LDRr3, =X16_FLASH_COMMAND_STATUS ;检查寄存器状态

STRBr3, [r0]

02LDRBr3, [r0];读状态

TSTr3, #X16_FLASH_STATUS_READY

BEQ%b02;若状态ready,执行下一个

TSTr3, #X16_FLASH_STATUS_ERROR

BNEerror_erase_block

ADDr0, r0, #0x10000

SUBSr1, r1, #1

BNE%b01

BEraseOK

error_erase_block

..............

;EraseOK;擦除完成

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

;Check Flash Empty

LDRr4, =FlashBase

LDRr5, =0x100000;检查 1MB

LDRr0, =0xffffffff

loop_1

LDRr1, [r4]

CMPr1, r0;比较地址内容和0xffffffff

BNEempty_error

ADDr4, r4, #4

CMPr4, r5

BLOloop_1

BCheckOK

empty_error

.................

CheckOK

.................

;Check empty OK;检查完成

//第四步,写flash

;Burn data to Flash ROM

LDRr6, =Length_Flash;定义数据长度

LDRr0, =FlashBase

LDRr1, =BufferBase

MOVr9, #0

LDRr4,=0x10000000

LDRr7,=0xc0001000

STRr4,[r7]

LDRr1, [r1, r9]

03LDRr3, =X16_FLASH_COMMAND_WRITE

STRBr3, [r0];把写命令放入Block首地址

LDRr3, =X16_FLASH_COMMAND_STATUS

LDRr2, [r7]

LDRr5, =0x0000ffff

ANDr2, r2, r5

ORRr2, r2, r3, LSL #16

STRr2, [r0]

02LDRr3, [r0];读状态寄存器状态

TSTr3, #X16_FLASH_STATUS_READY

BEQ%b02;若状态ready,执行下一个

LDRr3, =X16_FLASH_COMMAND_WRITE

LDRr2, [r7]

LDRr5, =0xffff0000;

ANDr2, r2, r5

ORRr3, r3, r2

STRr3, [r0]

LDRr3, =X16_FLASH_COMMAND_STATUS

STRBr3, [r0]

02LDRr3, [r0]; read status

TSTr3, #X16_FLASH_STATUS_READY

BEQ%b02

LDRr4, =X16_FLASH_COMMAND_READ

STRBr4, [r0]

ADDr0, r0, #4

LDRr8, [r7]

ADDr8, r8,#1

STRr8, [r7]

ADDr8, r8, #4

writenext

SUBSr6, r6, #4;if no finished goto 03

BHI%b03

TSTr3, #X16_FLASH_STATUS_ERROR

BNEerror_write

LDRr3, =X16_FLASH_COMMAND_READ

STRBr3, [r0]

BBurnOK

error_write

..........

BurnOK

可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号