新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 關于STM32的FLASH操作

        關于STM32的FLASH操作

        作者: 時間:2016-11-26 來源:網絡 收藏

        選項字節

        選項字節用于存儲芯片使用者對芯片的配置信息。

        目前,所有的STM32101xx、STM32102xx、STM32103xx、STM32105xx、STM32107xx產品,選項字節都是16字節。但是這16字節,每兩個字節組成一個正反對,即,字節1是字節0的反碼,字節3是字節2的反碼,...,字節15是字節14的反碼,所以,芯片使用者只要設置8個字節就行了,另外8個字節系統自動填充為反碼。因此,有時候,也說STM32的選項字節是8個字節,但是占了16字節的空間。

        選項字節的8字節正碼概述如下:

        RDP字節0。讀保護字節,存儲對主存儲塊的讀保護設置。

        USER字節2。用戶字節,配置看門狗、停機、待機。

        Data0字節4。數據字節0,由芯片使用者自由使用。

        Data1字節6。數據字節1,由芯片使用者自由使用。

        WRP0字節8。寫保護字節0,存儲對主存儲塊的寫保護設置。

        WRP1字節10。寫保護字節1,存儲對主存儲塊的寫保護設置。

        WRP2字節12。寫保護字節2,存儲對主存儲塊的寫保護設置。

        WRP3字節14。寫保護字節3,存儲對主存儲塊的寫保護設置。3

        選項字節寫使能

        在FLASH_CR中,有一個OPTWRE位,該位為0時,不允許進行選項字節操作(擦除、編程)。這稱為選項字節寫使能。只有該位為1時,才能進行選項字節操作。

        該位不能軟件置1,但可以軟件清零。只有向FLASH_OPTKEYR依次寫入KEY1和KEY2后,硬件會自動對該位置1,此時,才允許選項字節操作。這稱為解鎖(打開)選項字節寫使能。

        該位為1后,可以由軟件清零,關閉寫使能。

        復位后,該位為0。錯誤操作不會永遠關閉寫使能,只要寫入正確的鍵序列,則又可以打開寫使能。寫使能已打開時,再次打開,不會出錯,并且依然是打開的。

        很顯然,進行選項字節操作前,先要解開閃存鎖,然后打開選項字節寫使能,之后,才能進行選項字節操作。

        選項字節擦除

        建議使用如下步驟對選項字節進行擦除:

        1.檢查FLASH_SR寄存器的BSY位,以確認沒有其他正在進行的閃存操作。

        2.解鎖FLASH_CR寄存器的OPTWRE位。即,打開寫使能。

        3.設置FLASH_CR寄存器的OPTER位為1。選擇選項字節擦除操作。

        4.設置FLASH_CR寄存器的STRT位為1。

        5.等待FLASH_SR寄存器的BSY位變為0,表示操作完成。

        6.查詢FLASH_SR寄存器的EOP位,EOP為1時,表示操作成功。

        7.讀出選項字節并驗證數據。

        由于選項字節只有16字節,因此,擦除時是整個選項字節都被擦除了。

        選項字節編程

        建議使用如下步驟對選項字節進行編程:

        1.檢查FLASH_SR寄存器的BSY位,以確認沒有其他正在進行的編程操作。

        2.解鎖FLASH_CR寄存器的OPTWRE位。即,打開寫使能。

        3.設置FLASH_CR寄存器的OPTPG位為1。選擇編程操作。

        4.寫入要編程的半字到指定的地址。啟動編程操作。

        5.等待FLASH_SR寄存器的BSY位變為0,表示操作完成。

        6.查詢FLASH_SR寄存器的EOP位,EOP為1時,表示操作成功。

        7.讀出寫入的選項字節并驗證數據。

        對選項字節編程時,FPEC使用半字中的低字節并自動地計算出高字節(高字節為低字節的反碼),并開始編程操作,這將保證選項字節和它的反碼始終是正確的。

        主存儲塊的保護

        可以對主存儲塊中的數據進行讀保護、寫保護。

        讀保護用于保護數據不被非法讀出。防止程序泄密。

        寫保護用于保護數據不被非法改寫,增強程序的健壯性。

        讀保護

        主存儲塊啟動讀保護后,簡單的說具有以下特性:

        1.從主存儲塊啟動的程序,可以對整個主存儲塊執行讀操作,不允許對主存儲塊的前4KB進行擦除編程操作,可以對4KB之后的區域進行擦除編程操作。

        2.從SRAM啟動的程序,不能對主存儲塊進行讀、頁擦除、編程操作,但可以進行主存儲塊整片擦除操作。

        3.使用調試接口不能訪問主存儲塊。

        這些特性足以阻止主存儲器數據的非法讀出,又能保證程序的正常運行。

        只有當RDP選項字節的值為RDPRT鍵值時,讀保護才被關閉,否則,讀保護就是啟動的。因此,擦除選項字節的操作,將啟動主存儲塊的讀保護。如果要關閉讀保護,必須將RDP選項字節編程為RDPRT鍵值。并且,如果編程選項字節,使RDP由非鍵值變為鍵值(即由保護變為非保護)時,STM32將會先擦除整個主存儲塊,再編程RDP。

        芯片出廠時,RDP會事先寫入RDPRT鍵值,關閉寫保護功能。

        寫保護

        STM32主存儲塊可以分域進行寫保護。

        如果試圖對寫保護的域進行擦除或編程操作,在閃存狀態寄存器(FLASH_SR)中會返回一個寫保護錯誤標志。

        STM32主存儲塊每個域4KB,WRP0-WRP3選項字節中的每一位對應一個域,位為0時,寫保護有效。對于超過128KB的產品,WRP3.15保護了域31及之后的所有域。

        顯然,擦除選項字節將導致解除主存儲塊的寫保護。

        選項字節與它的寄存器映象

        我們知道,FPEC有兩個寄存器存儲了選項字節的映象。那么,選項字節本體(在FLASH中)與映象(在寄存器中)究竟有什么區別呢?

        選項字節的本體只是個FLASH,它的作用只是掉電存儲選項字節內容而以,真正起作用的是寄存器中的映象。即,一個配置是否有效,不是看本體,而是看映象。而映象是在復位后,用本體的值加載的,此后,除非復位,映象將不再改變。所以,更改本體的數據后,不會立即生效,只有復位加載到映象中后,才會生效。

        有一點要注意的是,當更改本體的值,使主存儲塊讀保護變為不保護時,會先擦除整片主存儲塊,然后再改變本體。這是唯一一個改變本體會引發的動作。但即使這樣,讀保護依然要等到復位后,加載到映象后,才會解除。

        關于FLASH編程手冊中文版的幾處錯誤(不一定是,但是與我的理解不符)

        1.選項字節編程一節中:

        對FPEC解鎖后,必須分別寫入KEY1和KEY2(見2.3.1節)到FLASH_OPTKEYR寄存器,再設置FLASH_CR寄存器的OPTWRE位為’1’,此時可以對選項字節進行編程

        實際上,對FLASH_OPTKEYR寫入KEY1和KEY2后,OPTWRE位會被硬件置1,而不是用軟件寫1。這一點在后面的寄存器描述中也可以得到驗證。

        2.對讀保護的描述中:

        對讀保護的數值對無法理解。正確的應該是,RDP為RDPRT鍵值時,解除讀保護,為其它值時,讀保護生效。


        上一頁 1 2 下一頁

        關鍵詞: STM32FLASH操

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 武城县| 伊川县| 太原市| 阿拉善盟| 庆云县| 阜平县| 兰坪| 大石桥市| 延川县| 类乌齐县| 武鸣县| 五大连池市| 靖安县| 岳普湖县| 惠水县| 烟台市| 霍林郭勒市| 玉溪市| 肥西县| 鄂托克前旗| 吉隆县| 隆安县| 信丰县| 龙江县| 定边县| 澎湖县| 乐昌市| 通海县| 营山县| 鄯善县| 禄丰县| 永寿县| 青川县| 景德镇市| 东平县| 台北县| 长乐市| 广东省| 海城市| 牙克石市| 东兴市|