网站导航: 首页 > 设计参考 > 正文 文章搜索
Flash ROM编程示例
 
文章编号:
090104164748
文章分类: 单片机 ARM
点 击:
...
关 键 词: Flash
文章来源:
网络
摘 要:
Flash操作的大概步骤:第一步,UNLOCK的64个block,步骤和上边一样。第二步,擦除blocks。第三步,检查flash是否为空。第四步,写flash

    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,步骤和上边一样


 
  1.           MOV r1,#63                       ;63x64k block 计数   
  2.   
  3.   
  4. 01     LDRB   r3, =X16_FLASH_COMMAND_CONFIG_SETUP   
  5.   
  6.           STRB          r3, [r2]           ;该block的首地址    
  7.   
  8.           LDRB          r3, =X16_FLASH_COMMAND_UNLOCK_BLOCK   
  9.   
  10.           STRB          r3, [r2]           ;将Unlock命令写入  
  11.   
  12.           ADD r2r2, #0x10000             ;64K  
  13.           SUBS          r1r1#1  
  14.           BNE %b01                               
  15. ;Unlock OK                                 ;Unlock 完成  

 

        //第二布,擦除blocks

 
  1.         LDR         r0, =FlashBase   
  2.         LDR         r1,=63                       ;擦除 63x64k block  
  3. 01    LDR     r3, =X16_FLASH_COMMAND_ERASE   
  4.         LDR     r2, =X16_FLASH_COMMAND_CONFIRM      
  5.         ORR         r3r3r2, LSL #16  
  6.         STR         r3, [r0]   
  7.         LDR     r3, =X16_FLASH_COMMAND_STATUS ;检查寄存器状态  
  8.         STRB    r3, [r0]   
  9. 02    LDRB    r3, [r0]                              ;读状态  
  10.         TST         r3, #X16_FLASH_STATUS_READY    
  11.         BEQ     %b02                          ;若状态ready,执行下一个     
  12.         TST     r3, #X16_FLASH_STATUS_ERROR   
  13.         BNE     error_erase_block   
  14.         ADD         r0r0, #0x10000   
  15.         SUBS    r1r1#1  
  16.         BNE         %b01   
  17.         B         EraseOK   
  18. error_erase_block   
  19. ..............   
  20. ;EraseOK                               ;擦除完成  

 

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

 
  1. ;Check Flash Empty  
  2.         LDR         r4, =FlashBase   
  3.         LDR         r5, =0x100000                    ;检查 1MB  
  4.         LDR         r0, =0xffffffff   
  5. loop_1   
  6.         LDR         r1, [r4]   
  7.         CMP         r1r0                     ;比较地址内容和0xffffffff  
  8.         BNE         empty_error   
  9.        ADD         r4r4#4  
  10.         CMP         r4r5  
  11.         BLO         loop_1   
  12.         B         CheckOK   
  13. empty_error   
  14. .................   
  15. CheckOK   
  16. .................   
  17.   
  18. ;Check empty OK                        ;检查完成    

        //第四步,写flash

 
  1. ;Burn data to Flash ROM  
  2.   
  3.         LDR         r6, =Length_Flash           ;定义数据长度  
  4.         LDR         r0, =FlashBase   
  5.         LDR         r1, =BufferBase   
  6.         MOV         r9#0  
  7.         LDR         r4,=0x10000000   
  8.         LDR         r7,=0xc0001000   
  9.         STR         r4,    [r7]   
  10.         LDR         r1, [r1r9]   
  11.   
  12. 03    LDR     r3, =X16_FLASH_COMMAND_WRITE   
  13.         STRB    r3, [r0]                                         ;把写命令放入Block首地址  
  14.        LDR     r3, =X16_FLASH_COMMAND_STATUS      
  15.         LDR         r2, [r7]                                             
  16.         LDR         r5, =0x0000ffff               
  17.         AND         r2r2r5  
  18.         ORR         r2r2r3, LSL #16  
  19.         STR         r2, [r0]           
  20. 02    LDR         r3, [r0]                                 ;读状态寄存器状态  
  21.         TST         r3, #X16_FLASH_STATUS_READY      
  22.         BEQ     %b02                          ;若状态ready,执行下一个  
  23.   
  24.         LDR     r3, =X16_FLASH_COMMAND_WRITE   
  25.         LDR         r2, [r7]               
  26.         LDR         r5, =0xffff0000                             ;  
  27.         AND         r2r2r5  
  28.         ORR         r3r3r2  
  29.         STR         r3, [r0]   
  30.   
  31.         LDR     r3, =X16_FLASH_COMMAND_STATUS   
  32.         STRB    r3, [r0]               
  33. 02    LDR         r3, [r0]                             ; read status  
  34.         TST         r3, #X16_FLASH_STATUS_READY   
  35.         BEQ     %b02   
  36.   
  37.         LDR     r4, =X16_FLASH_COMMAND_READ   
  38.         STRB    r4, [r0]   
  39.         ADD         r0r0#4  
  40.         LDR         r8, [r7]   
  41.         ADD         r8r8,#1  
  42.         STR         r8, [r7]   
  43.         ADD         r8r8#4  
  44. writenext   
  45.   
  46.         SUBS     r6r6#4         ;if no finished goto 03  
  47.         BHI         %b03   
  48.         TST     r3, #X16_FLASH_STATUS_ERROR   
  49.         BNE     error_write   
  50.         LDR     r3, =X16_FLASH_COMMAND_READ   
  51.         STRB    r3, [r0]   
  52.         B         BurnOK   
  53. error_write   
  54.     ..........   
  55. BurnOK   

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4