Flash可以通過四個間接寄存器訪問:FLASHCON、FLASHADR、FLASHDAT和FLASHSCL。每個寄存器通過間接讀和間接寫來訪問。
FLASHCON
FLASHCON是一個8-bit寄存器,用於控制FLASH邏輯應答對FLASHDAT寄存器的讀和寫。FLASHCON寄存器由ReadMode和WriteMode設置組成,具體如下:
7:4 | 3:0 |
---|---|
WriteMode | ReadMode |
ReadMode | 描述 |
---|---|
0000 | FLBUSY Polling |
0010 | Initiate FLASH read;Increment FLASHADR |
注:未註明的狀態都是保留狀態
WriteMode | 描述 |
---|---|
0000 | FLBUSY Polling |
0001 | Initiate FLASH Write;Increment FLASHADR |
0010 | Initiate page erase on current page if FLASHDAT = 0xA5; Initiate erase of entire FLASH if FLASHDAT = 0xA5 and FLASHADR is set to the address of the FLASH Read Lock Byte or the FLASH Write/Erase Lock Byte. |
注:未註明的狀態都是保留狀態
FLASHADR
FLASHADR是一個16bit位寬的寄存器,用於指定讀操作或寫操作的目的地址。FLASHADR在完成一次讀操作或寫操作後會自動增加。
FLASHDAT
FLASHDAT是一個10-bit位寬的寄存器,包含8bit數據,1bit FLFail和1bit的FLBusy。
9:2 | 1 | 0 |
---|---|---|
FLData | FLFail | FLBusy |
對FLASHDAT寫操作僅僅需要8bit,因爲被鎖存的最後一位假定是MSB位置。
對FLASHDAT讀操作要求11個DR_SHIFT週期,8Cycle用於FLDATA,1個週期用於FLFail,1個週期用於FLBusy,1個週期用於Busy。
FLBusy輪詢需要至少兩個DR_SHIFT週期,一個週期用於FLBust,另一個週期用於Busy。
FLASHSCL
FLASHSCL是一個8bit寄存器,用於設置FLASH操作時序所需要的預分頻值。當工作在內部2MHz系統時鐘時,該寄存器應該配置爲0x86.
7:4 | 3:0 |
---|---|
1000 | 0110 |
FLASH訪問流程
在FLASH被編程前,設備需要被複位,看門狗需要被設置爲離線模式,否則看門狗可能在FLASH編程過程中發起系統復位,進而導致不確定的行爲。
禁用看門狗定時器(WDT)
流程圖顯示了禁用看門狗定時器的過程,整個過程如下:
- 系統通過加載0x2FFF到指令寄存器迫使系統復位;
- 加載0x1004到指令寄存器讀取IDCODE,通過在TDI寫入0x0000_0000,從而在接收端TDO獲得IDCODE;
- 所有後續的指令地址都需要設置StateCntl爲0x4,這樣使得CPU核處於SUSPEND狀態,使得FLASH處於Off-Line。
讀取FLASH內部的一個字節
具體流程如下:
- 加載0x86到FLASHSCL,使用內部2MHz系統時鐘設置合適的FLASH時序。這可以通過一個對FLASHSCL的間接寫0x86來實現;
- 將讀操作的目標地址加載到FLASHADR;
- 加載0x01到FLASHCON,發起一次讀操作;
- 通過讀FLASHDAT發起讀,這是一次間接讀0bit操作;
- 加載0x00到FLASHCON來輪詢FLBusy,查看是否處於忙狀態;
- 輪詢FLBusy直到該信號變低,表示讀操作已完成;
- 讀FLASHDAT;