<br />Intel Flash芯片 i28f160,i28f320:<br /><br />i28F320B: 64*64K,64个blocks,4M空间,每个block 64K,第一个64K由8个8*8K小blocks组成.<br /><br />每个Black可以被独立擦写(寿命周期) 100,000次以上<br /><br />Flash操作的大概步骤:<br /><br />flash读写操作中,读应该很简单,和RAM一样,写就复杂一点. <br />Intel TE28F320C3的flash是4M空间 <br />flash空间,划分成许多的block,Intel TE28F320C3的flash是4M空间,64个block,每个block由64K. <br />要对所有的block单独进行操作, 每个操作结束,都需要判断状态, <br />每个block操作的大概步骤如下: <br />1.unlock <br />2.erase <br />3.check empty <br />所有的block完成上述操作,且状态正确,才能进行下一步,写 <br />4.write <br /><br />ARM汇编程序 <br /><br /> LDR r2, =FlashBase ;Flash起始地址<br /><br />//第一步,UNLOCK的64个block,步骤和上边一样 <br /><br /><br /> MOV r1,#63 ;63x64k block 计数 <br /><br /><br />01 LDRB r3, =X16_FLASH_COMMAND_CONFIG_SETUP <br /><br /> STRB r3, [r2] ;该block的首地址 <br /><br /> LDRB r3, =X16_FLASH_COMMAND_UNLOCK_BLOCK <br /><br /> STRB r3, [r2] ;将Unlock命令写入 <br /><br /> ADD r2, r2, #0x10000 ;64K<br /> SUBS r1, r1, #1 <br /> BNE %b01 <br />;Unlock OK ;Unlock 完成 <br /><br /><br />//第二布,擦除blocks<br /><br /> LDR r0, =FlashBase<br /> LDR r1,=63 ;擦除 63x64k block<br />01 LDR r3, =X16_FLASH_COMMAND_ERASE<br /> LDR r2, =X16_FLASH_COMMAND_CONFIRM <br /> ORR r3, r3, r2, LSL #16<br /> STR r3, [r0]<br /> LDR r3, =X16_FLASH_COMMAND_STATUS ;检查寄存器状态<br /> STRB r3, [r0]<br />02 LDRB r3, [r0] ;读状态<br /> TST r3, #X16_FLASH_STATUS_READY <br /> BEQ %b02 ;若状态ready,执行下一个 <br /> TST r3, #X16_FLASH_STATUS_ERROR<br /> BNE error_erase_block<br /> ADD r0, r0, #0x10000<br /> SUBS r1, r1, #1<br /> BNE %b01<br /> B EraseOK<br />error_erase_block<br />..............<br />;EraseOK ;擦除完成<br /><br />//第三步,检查flash是否为空<br /><br />;Check Flash Empty<br /> LDR r4, =FlashBase<br /> LDR r5, =0x100000 ;检查 1MB<br /> LDR r0, =0xffffffff<br />loop_1<br /> LDR r1, [r4]<br /> CMP r1, r0 ;比较地址内容和0xffffffff<br /> BNE empty_error<br /> ADD r4, r4, #4<br /> CMP r4, r5<br /> BLO loop_1<br /> B CheckOK<br />empty_error<br />.................<br />CheckOK<br />.................<br /><br />;Check empty OK ;检查完成 <br /><br />//第四步,写flash<br /><br />;Burn data to Flash ROM<br /><br /> LDR r6, =Length_Flash ;定义数据长度<br /> LDR r0, =FlashBase<br /> LDR r1, =BufferBase<br /> MOV r9, #0<br /> LDR r4,=0x10000000<br /> LDR r7,=0xc0001000<br /> STR r4, [r7]<br /> LDR r1, [r1, r9]<br /><br />03 LDR r3, =X16_FLASH_COMMAND_WRITE<br /> STRB r3, [r0] ;把写命令放入Block首地址 <br /> LDR r3, =X16_FLASH_COMMAND_STATUS <br /> LDR r2, [r7] <br /> LDR r5, =0x0000ffff <br /> AND r2, r2, r5<br /> ORR r2, r2, r3, LSL #16<br /> STR r2, [r0] <br />02 LDR r3, [r0] ;读状态寄存器状态<br /> TST r3, #X16_FLASH_STATUS_READY <br /> BEQ %b02 ;若状态ready,执行下一个<br /><br /> LDR r3, =X16_FLASH_COMMAND_WRITE<br /> LDR r2, [r7] <br /> LDR r5, =0xffff0000 ;<br /> AND r2, r2, r5<br /> ORR r3, r3, r2<br /> STR r3, [r0]<br /><br /> LDR r3, =X16_FLASH_COMMAND_STATUS<br /> STRB r3, [r0] <br />02 LDR r3, [r0] ; read status<br /> TST r3, #X16_FLASH_STATUS_READY<br /> BEQ %b02<br /><br /> LDR r4, =X16_FLASH_COMMAND_READ<br /> STRB r4, [r0]<br /> ADD r0, r0, #4<br /> LDR r8, [r7]<br /> ADD r8, r8,#1<br /> STR r8, [r7]<br /> ADD r8, r8, #4<br />writenext<br /><br /> SUBS r6, r6, #4 ;if no finished goto 03<br /> BHI %b03<br /> TST r3, #X16_FLASH_STATUS_ERROR<br /> BNE error_write<br /> LDR r3, =X16_FLASH_COMMAND_READ<br /> STRB r3, [r0]<br /> B BurnOK<br />error_write<br /> ..........<br />BurnOK<br /><br />本**来自中国IT实验室http://embed.chinaitlab.com/ |
|