• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > ARM編程中Flash ROM驅動示例

    ARM編程中Flash ROM驅動示例

    作者: 時間:2013-12-04 來源:網絡 收藏

    Intel 芯片 i28f160,i28f320:

    i28F320B: 64*64K,64個blocks,4M空間,每個block 64K,第一個64K由8個8*8K小blocks組成.

    每個Black可以被獨立擦寫(壽命周期) 100,000次以上

    操作的大概步驟:

    flash讀寫操作中,讀應該很簡單,和RAM一樣,寫就復雜一點.
    IntelTE28F320C3的flash是4M空間
    flash空間,劃分成許多的block,IntelTE28F320C3的flash是4M空間,64個block,每個block由64K.
    要對所有的block單獨進行操作,每個操作結束,都需要判斷狀態,
    每個block操作的大概步驟如下:
    1.unlock
    2.erase
    3.checkempty
    所有的block完成上述操作,且狀態正確,才能進行下一步,寫
    4.write

    arm匯編程序

    LDR r2,=Base ;Flash起始地址

    //第一步,UNLOCK的64個block,步驟和上邊一樣


    MOV r1,#63 ;63x64kblock 計數


    01 LDRB r3,=X16_FLASH_COMMAND_CONFIG_SETUP

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

    LDRBr3,=X16_FLASH_COMMAND_UNLOCK_BLOCK

    STRB r3,[r2] ;將Unlock命令寫入

    ADD r2,r2,#0x10000 ;64K
    SUBS r1,r1,#1
    BNE %b01
    ;UnlockOK ;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驅動

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 永仁县| 平江县| 贞丰县| 商河县| 杭州市| 万源市| 樟树市| 犍为县| 呼图壁县| 临武县| 贵德县| 凯里市| 将乐县| 宁安市| 亚东县| 昌平区| 房山区| 马尔康县| 衡山县| 荔波县| 龙州县| 凤凰县| 弥勒县| 板桥市| 乌什县| 深水埗区| 石泉县| 开阳县| 黑水县| 连江县| 逊克县| 房产| 靖边县| 四会市| 太仆寺旗| 神池县| 中卫市| 宁蒗| 巨野县| 宁乡县| 邓州市|