新聞中心

關(guān)于STM32的FLASH操作

作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏

選項(xiàng)字節(jié)

選項(xiàng)字節(jié)用于存儲(chǔ)芯片使用者對(duì)芯片的配置信息。

目前,所有的STM32101xx、STM32102xx、STM32103xx、STM32105xx、STM32107xx產(chǎn)品,選項(xiàng)字節(jié)都是16字節(jié)。但是這16字節(jié),每?jī)蓚€(gè)字節(jié)組成一個(gè)正反對(duì),即,字節(jié)1是字節(jié)0的反碼,字節(jié)3是字節(jié)2的反碼,...,字節(jié)15是字節(jié)14的反碼,所以,芯片使用者只要設(shè)置8個(gè)字節(jié)就行了,另外8個(gè)字節(jié)系統(tǒng)自動(dòng)填充為反碼。因此,有時(shí)候,也說STM32的選項(xiàng)字節(jié)是8個(gè)字節(jié),但是占了16字節(jié)的空間。

選項(xiàng)字節(jié)的8字節(jié)正碼概述如下:

RDP字節(jié)0。讀保護(hù)字節(jié),存儲(chǔ)對(duì)主存儲(chǔ)塊的讀保護(hù)設(shè)置。

USER字節(jié)2。用戶字節(jié),配置看門狗、停機(jī)、待機(jī)。

Data0字節(jié)4。數(shù)據(jù)字節(jié)0,由芯片使用者自由使用。

Data1字節(jié)6。數(shù)據(jù)字節(jié)1,由芯片使用者自由使用。

WRP0字節(jié)8。寫保護(hù)字節(jié)0,存儲(chǔ)對(duì)主存儲(chǔ)塊的寫保護(hù)設(shè)置。

WRP1字節(jié)10。寫保護(hù)字節(jié)1,存儲(chǔ)對(duì)主存儲(chǔ)塊的寫保護(hù)設(shè)置。

WRP2字節(jié)12。寫保護(hù)字節(jié)2,存儲(chǔ)對(duì)主存儲(chǔ)塊的寫保護(hù)設(shè)置。

WRP3字節(jié)14。寫保護(hù)字節(jié)3,存儲(chǔ)對(duì)主存儲(chǔ)塊的寫保護(hù)設(shè)置。3

選項(xiàng)字節(jié)寫使能

在FLASH_CR中,有一個(gè)OPTWRE位,該位為0時(shí),不允許進(jìn)行選項(xiàng)字節(jié)操作(擦除、編程)。這稱為選項(xiàng)字節(jié)寫使能。只有該位為1時(shí),才能進(jìn)行選項(xiàng)字節(jié)操作。

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

該位為1后,可以由軟件清零,關(guān)閉寫使能。

復(fù)位后,該位為0。錯(cuò)誤操作不會(huì)永遠(yuǎn)關(guān)閉寫使能,只要寫入正確的鍵序列,則又可以打開寫使能。寫使能已打開時(shí),再次打開,不會(huì)出錯(cuò),并且依然是打開的。

很顯然,進(jìn)行選項(xiàng)字節(jié)操作前,先要解開閃存鎖,然后打開選項(xiàng)字節(jié)寫使能,之后,才能進(jìn)行選項(xiàng)字節(jié)操作。

選項(xiàng)字節(jié)擦除

建議使用如下步驟對(duì)選項(xiàng)字節(jié)進(jìn)行擦除:

1.檢查FLASH_SR寄存器的BSY位,以確認(rèn)沒有其他正在進(jìn)行的閃存操作。

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

3.設(shè)置FLASH_CR寄存器的OPTER位為1。選擇選項(xiàng)字節(jié)擦除操作。

4.設(shè)置FLASH_CR寄存器的STRT位為1。

5.等待FLASH_SR寄存器的BSY位變?yōu)?,表示操作完成。

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

7.讀出選項(xiàng)字節(jié)并驗(yàn)證數(shù)據(jù)。

由于選項(xiàng)字節(jié)只有16字節(jié),因此,擦除時(shí)是整個(gè)選項(xiàng)字節(jié)都被擦除了。

選項(xiàng)字節(jié)編程

建議使用如下步驟對(duì)選項(xiàng)字節(jié)進(jìn)行編程:

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

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

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

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

5.等待FLASH_SR寄存器的BSY位變?yōu)?,表示操作完成。

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

7.讀出寫入的選項(xiàng)字節(jié)并驗(yàn)證數(shù)據(jù)。

對(duì)選項(xiàng)字節(jié)編程時(shí),F(xiàn)PEC使用半字中的低字節(jié)并自動(dòng)地計(jì)算出高字節(jié)(高字節(jié)為低字節(jié)的反碼),并開始編程操作,這將保證選項(xiàng)字節(jié)和它的反碼始終是正確的。

主存儲(chǔ)塊的保護(hù)

可以對(duì)主存儲(chǔ)塊中的數(shù)據(jù)進(jìn)行讀保護(hù)、寫保護(hù)。

讀保護(hù)用于保護(hù)數(shù)據(jù)不被非法讀出。防止程序泄密。

寫保護(hù)用于保護(hù)數(shù)據(jù)不被非法改寫,增強(qiáng)程序的健壯性。

讀保護(hù)

主存儲(chǔ)塊啟動(dòng)讀保護(hù)后,簡(jiǎn)單的說具有以下特性:

1.從主存儲(chǔ)塊啟動(dòng)的程序,可以對(duì)整個(gè)主存儲(chǔ)塊執(zhí)行讀操作,不允許對(duì)主存儲(chǔ)塊的前4KB進(jìn)行擦除編程操作,可以對(duì)4KB之后的區(qū)域進(jìn)行擦除編程操作。

2.從SRAM啟動(dòng)的程序,不能對(duì)主存儲(chǔ)塊進(jìn)行讀、頁(yè)擦除、編程操作,但可以進(jìn)行主存儲(chǔ)塊整片擦除操作。

3.使用調(diào)試接口不能訪問主存儲(chǔ)塊。

這些特性足以阻止主存儲(chǔ)器數(shù)據(jù)的非法讀出,又能保證程序的正常運(yùn)行。

只有當(dāng)RDP選項(xiàng)字節(jié)的值為RDPRT鍵值時(shí),讀保護(hù)才被關(guān)閉,否則,讀保護(hù)就是啟動(dòng)的。因此,擦除選項(xiàng)字節(jié)的操作,將啟動(dòng)主存儲(chǔ)塊的讀保護(hù)。如果要關(guān)閉讀保護(hù),必須將RDP選項(xiàng)字節(jié)編程為RDPRT鍵值。并且,如果編程選項(xiàng)字節(jié),使RDP由非鍵值變?yōu)殒I值(即由保護(hù)變?yōu)榉潜Wo(hù))時(shí),STM32將會(huì)先擦除整個(gè)主存儲(chǔ)塊,再編程RDP。

芯片出廠時(shí),RDP會(huì)事先寫入RDPRT鍵值,關(guān)閉寫保護(hù)功能。

寫保護(hù)

STM32主存儲(chǔ)塊可以分域進(jìn)行寫保護(hù)。

如果試圖對(duì)寫保護(hù)的域進(jìn)行擦除或編程操作,在閃存狀態(tài)寄存器(FLASH_SR)中會(huì)返回一個(gè)寫保護(hù)錯(cuò)誤標(biāo)志。

STM32主存儲(chǔ)塊每個(gè)域4KB,WRP0-WRP3選項(xiàng)字節(jié)中的每一位對(duì)應(yīng)一個(gè)域,位為0時(shí),寫保護(hù)有效。對(duì)于超過128KB的產(chǎn)品,WRP3.15保護(hù)了域31及之后的所有域。

顯然,擦除選項(xiàng)字節(jié)將導(dǎo)致解除主存儲(chǔ)塊的寫保護(hù)。

選項(xiàng)字節(jié)與它的寄存器映象

我們知道,F(xiàn)PEC有兩個(gè)寄存器存儲(chǔ)了選項(xiàng)字節(jié)的映象。那么,選項(xiàng)字節(jié)本體(在FLASH中)與映象(在寄存器中)究竟有什么區(qū)別呢?

選項(xiàng)字節(jié)的本體只是個(gè)FLASH,它的作用只是掉電存儲(chǔ)選項(xiàng)字節(jié)內(nèi)容而以,真正起作用的是寄存器中的映象。即,一個(gè)配置是否有效,不是看本體,而是看映象。而映象是在復(fù)位后,用本體的值加載的,此后,除非復(fù)位,映象將不再改變。所以,更改本體的數(shù)據(jù)后,不會(huì)立即生效,只有復(fù)位加載到映象中后,才會(huì)生效。

有一點(diǎn)要注意的是,當(dāng)更改本體的值,使主存儲(chǔ)塊讀保護(hù)變?yōu)椴槐Wo(hù)時(shí),會(huì)先擦除整片主存儲(chǔ)塊,然后再改變本體。這是唯一一個(gè)改變本體會(huì)引發(fā)的動(dòng)作。但即使這樣,讀保護(hù)依然要等到復(fù)位后,加載到映象后,才會(huì)解除。

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

1.選項(xiàng)字節(jié)編程一節(jié)中:

對(duì)FPEC解鎖后,必須分別寫入KEY1和KEY2(見2.3.1節(jié))到FLASH_OPTKEYR寄存器,再設(shè)置FLASH_CR寄存器的OPTWRE位為’1’,此時(shí)可以對(duì)選項(xiàng)字節(jié)進(jìn)行編程

實(shí)際上,對(duì)FLASH_OPTKEYR寫入KEY1和KEY2后,OPTWRE位會(huì)被硬件置1,而不是用軟件寫1。這一點(diǎn)在后面的寄存器描述中也可以得到驗(yàn)證。

2.對(duì)讀保護(hù)的描述中:

對(duì)讀保護(hù)的數(shù)值對(duì)無法理解。正確的應(yīng)該是,RDP為RDPRT鍵值時(shí),解除讀保護(hù),為其它值時(shí),讀保護(hù)生效。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: STM32FLASH操

評(píng)論


技術(shù)專區(qū)

關(guān)閉