這篇文章我們來說一下嵌入式FLASH。
FLASH接口
FLASH接口其實在前面的文章中有提到,可以分為三類:
第一類,64位ITCM接口,該接口連接-M7的ITCM總線,用于指令執行以及數據讀訪問。它不支持寫訪問,支持64個標準化緩存行,256位寬。
第二類,64位AHB接口,該接口通過AHB總線矩陣連接-M7的AXI總線,用于代碼執行以及讀寫訪問。無論尋址的FLASH接口是TCM還是AHB,FLASH上的DMA和外設DMA數據傳輸都通過AHB接口完成。
第三類,32位AHB寄存器接口,該接口主要用于訪問控制寄存器和狀態寄存器。
FLASH構成
F7的FLASH最高有1M字節的用戶閃存,它一共分為八個容量不等的扇區,這樣FLASH分區可以存放不同的應用程序。
在信息塊部分還包括64KB的系統閃存、1024個字節的OTP區和32字節的選項字。
在修改用戶選項字之前,需要向選項密鑰寄存器寫入兩個Key值,然后才能在寄存器中雪茹所需的選項值。
FLASH的擦除和編程操作的并行寬度主要取決于VDD的范圍以及是否有采用外部編程的電壓,最大的擦除和變成操作的并行寬度是在寄存器中的PSIZE這個字段進行設計的,但是要注意這個字段設計的值必須與實際的外部電壓的條件是相符的。
下圖就列出了外部電壓范圍和能夠配置到的最大的并行位數的對應表格
如果PSIZE設置的值和實際使用的外部條件不符,就會造成擦除或者編程操作可能導致不能預料的錯誤,即使能夠讀出數據,但數據的正確性不能保證。對于擦除操作來說,只能按照扇區或者整片擦除,擦除的時間也取決于PSIZE設置的值。
CPU時鐘和FLASH等待周期之間的關系
我們知道FLASH的訪問速度遠遠低于CPU的時鐘,所以為了準確地讀取FLASH的數值必須根據CPU的時鐘頻率和器件電源在FLASH存儲寄存器中正確編寫等待周期,這樣才能保證準確讀取FLASH的數據。
中新增了選項字,,一個是在停止模式下凍結獨立看門狗計數器,還有一個是在待機模式下凍結獨立看門狗計數器,第三個是硬件/軟件窗口看門狗的配置。需要注意的是,當修改這些選項字之后,需要復位系統來使修改起作用。
前面有介紹說F7的啟動模式和之前F4、F3都不一樣,所以相對的它的選項字也有了新的變化。下圖顯示了BOOT引腳為0和1時分別對應的啟動地址的選項字。當外面的BOOT引腳為低電平時,的選項字所定義的就是啟動地址;當BOOT引腳為高電平時,定義的是啟動地址。在和中并不是直接寫的就是啟動地址,它的值和啟動地址之間是有一個對應關系的,下圖也給大家舉了幾個例子。
FLASH編程錯誤
FLASH的編程錯誤又分為寫保護錯誤和編程錯誤。
寫保護錯誤是嘗試在寫保護區域執行編程或擦除操作時,位由硬件置1。
編程錯誤又分為好幾種,一種是編程并行位數錯誤,當訪問寬度和PSIZE所選并行位數類型不一致時,硬件置1;還有一種是編程并齊錯誤,對FLASH進行跨越128位行界限的數據編程操作時,將由硬件置位該標志位;第三種是擦除順序錯誤,如果代碼在控制寄存器未正確配置的情況下對FLASH執行擦除操作系統時間有誤flash,則錯誤標志位將置1;最后一種是操作錯誤,如果檢測到FLASH操作請求,但由于存在并行位數錯誤、對齊錯誤或寫保護錯誤而無法運行,將由硬件對該位置1.只有在使能錯誤中斷后,該位才會置1.
FLASH中斷
FLASH中斷分為兩類,一類是操作結束,一類是錯誤中斷,它們在寄存器中都有對應的事件標志和使能控制位。
F7的FLASH保護和F4是一樣的。FLASH保護又分為讀保護和寫保護,寫保護可以分別對各個扇區進行保護,防止因程序指針錯亂而發生意外的寫操作。FLASH選項寄存器中的nWRP位段包含了復位后扇區0-7的寫保護選項字節值,通過對這些位執行寫操作,可將新的寫保護編程到FLASH。
對于FLASH的寫保護,選項字控制寄存器中對應的位低電平表示寫保護有效,當寫保護有效的時候,不能對已經進行保護的扇區進行編程或者擦除操作,而且只要有一個扇區被寫保護,芯片就不能執行全片擦除。
使能和除能寫保護的操作過程是首先向選項字控制寄存器中的nWRPi位段寫入需要的值,0表示使能寫保護,1表示禁止寫保護,之后置位FLASH選項字控制寄存器中的位,等待BSY位清零之后對于FLASH寫保護的配置就完成了。
FLASH的讀保護分為三個級別
讀保護Level 0就是沒有讀保護,選項字節中的RPD域應該是0xAA,這時候所有啟動配置下,對閃存和備份SRAM的讀操作都允許。
第二個級別是Level 1,當選項字節中的RPD域是非0xAA或者0xCC的值時是處于Level 1級別。在這個級別下,如果用戶從用戶閃存啟動,這時候對閃存的訪問是無限制的,如果是在調試的模式或者是SRAM或系統閃存啟動時,對片上閃存是有訪問限制的,不能讀、編程和擦除,即使這時候nWRP為1也不行,但是可以通過SRAM運行代碼修改選項字節來取消保護,也就是從Level 1降級到Level 0系統時間有誤flash,硬件先對用戶閃存和備份SRAM進行全部擦除,選項字節其他域不受影響。
最高級別的讀保護是Level 2,在這個級別下,選項字節中的RDP域是0xCC,在這個級別,除了Level 1級別的保護,用戶選項字節也不能再修改,也就是不能從Level 2降級到Level 1或Level 0,而且調試功能是被永久性禁止的,系統閃存啟動也被禁止,不能通過修改選項字節。