0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32F207內(nèi)部Flash編程詳解

GReq_mcu168 ? 來(lái)源:玩轉(zhuǎn)單片機(jī) ? 作者:玩轉(zhuǎn)單片機(jī) ? 2021-02-23 15:59 ? 次閱讀

本文將根據(jù)ST官方Flashprogramming manual,文檔編號(hào):PM0059,講解STM32F207內(nèi)部Flash編程。

01概述

這里的flash是指STM32F207內(nèi)部集成的Flash

Flash存儲(chǔ)器有以下特點(diǎn)

最大1M字節(jié)的能力

128位,也就是16字節(jié)寬度的數(shù)據(jù)讀取

字節(jié),半字,字和雙字寫入

扇區(qū)擦除和批量擦除

存儲(chǔ)器的構(gòu)成

主要存儲(chǔ)區(qū)塊包含4個(gè)16K字節(jié)扇區(qū),1個(gè)64K字節(jié)扇區(qū)和7個(gè)128K字節(jié)扇區(qū)。

系統(tǒng)存儲(chǔ)器是用于在系統(tǒng)boot模式啟動(dòng)設(shè)備的。這一塊是預(yù)留給ST的。包括bootloader程序,boot程序用于通過(guò)以下接口對(duì)Flash進(jìn)行編程。USART1、USART3、CAN2、USB OTG FS設(shè)備模式(DFU:設(shè)備固件升級(jí))。boot程序由ST制造期間編寫,用于保護(hù)防止錯(cuò)誤寫入和擦除操作。

512OTP(一次性編程)字節(jié)用于用戶數(shù)據(jù)。OTP區(qū)域包含16個(gè)附加的字節(jié),用于鎖定響應(yīng)的OTP數(shù)據(jù)。

選項(xiàng)字節(jié),讀寫保護(hù),BOR水平,軟件/硬件看門狗和復(fù)位當(dāng)設(shè)置處于待機(jī)和停機(jī)狀態(tài)。

低功耗模式(參考參考手冊(cè)的PWR部分)

2415eede-74dd-11eb-8b86-12bb97331649.png

對(duì)比參考手冊(cè)的boot部分

24be43d6-74dd-11eb-8b86-12bb97331649.png

當(dāng)BOOT0為0是運(yùn)行主存儲(chǔ)區(qū)

當(dāng)BOOT0為1,BOOT1為0時(shí)運(yùn)行系統(tǒng)存儲(chǔ)區(qū)

系統(tǒng)存儲(chǔ)區(qū)運(yùn)行的是ST出廠的bootloader代碼,跳過(guò)過(guò)了用戶的代碼。如果在應(yīng)用層代碼鎖定了JTAG管腳(將JTAG管腳用于普通GPIO),我們可以通過(guò)修改boot管腳狀態(tài),進(jìn)入系統(tǒng)存儲(chǔ)中,再進(jìn)行debug。

02Flash操作

2.1、讀取

內(nèi)置的Flash是處于CortexM3的數(shù)據(jù)總線上的,所以可以在通用地址空間之間尋址,任何32位數(shù)據(jù)的讀操作都能訪問(wèn)Flash上的數(shù)據(jù)。

data32 = *(__IO uint32_t*)Address;

將Address強(qiáng)制轉(zhuǎn)化為32位整型指針,然后取該指針?biāo)赶虻牡刂返闹?,就得到了Address地址上的32位數(shù)據(jù)。

2.2、擦除

Flash 擦除操作可針對(duì)扇區(qū)或整個(gè)Flash(批量擦除)執(zhí)行。執(zhí)行批量擦除時(shí),不會(huì)影響OTP扇區(qū)或配置扇區(qū)。

扇區(qū)擦除步驟

1、檢查FLASH_SR 寄存器中的BSY 位,以確認(rèn)當(dāng)前未執(zhí)行任何Flash 操作

2、在FLASH_CR 寄存器中將SER 位置1 并選擇要擦除的扇區(qū)(SNB)(主存儲(chǔ)器塊中的12個(gè)扇區(qū)之一)

3、將FLASH_CR 寄存器中的STRT 位置1

4、等待BSY 位清零

批量擦除步驟

1、檢查FLASH_SR 寄存器中的BSY 位,以確認(rèn)當(dāng)前未執(zhí)行任何Flash 操作

2、將FLASH_CR 寄存器中的MER 位置1

3、將FLASH_CR 寄存器中的STRT 位置1

4、等待BSY 位清零

ST提供相應(yīng)的庫(kù)函數(shù)接口

FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_tVoltageRange)FLASH_Status FLASH_EraseAllSectors(uint8_tVoltageRange)

注意到,有個(gè)特殊的參數(shù)VoltageRange,這是因?yàn)?/p>

2532f118-74dd-11eb-8b86-12bb97331649.png

這里就不再翻譯了,就是在不同電壓下數(shù)據(jù)訪問(wèn)的位數(shù)不同,我們是3.3V,所以是32位數(shù)據(jù),這也就是在讀數(shù)據(jù)是為什么要讀取32位的原因。

2.3、寫入

寫入之前必須擦除,這里和NorFlash操作是相同的

復(fù)位后,F(xiàn)lash控制器寄存器(FLASH_CR)不允許寫入的,去保護(hù)Flash閃存因?yàn)?a target="_blank">電氣原因出現(xiàn)的以外操作,以下是解鎖的步驟

1、在Flash 密鑰寄存器(FLASH_KEYR) 中寫入KEY1 = 0x45670123

2、在Flash 密鑰寄存器(FLASH_KEYR) 中寫入KEY2 = 0xCDEF89AB

將FLASH_CR 寄存器中的LOCK 位置為1 后,可通過(guò)軟件再次鎖定FLASH_CR 寄存器

ST提供了庫(kù)函數(shù)

FLASH_Unlock();//解鎖FLASH_Lock();//重新上鎖

備注:

當(dāng)FLASH_SR 寄存器中的BSY 位置為1 后,將不能在寫模式下訪問(wèn)FLASH_CR 寄存器。BSY 位置為1 后,對(duì)該寄存器的任何寫操作嘗試都會(huì)導(dǎo)致AHB 總線阻塞,直到BSY位清零

這要求我們?cè)趯懭肭氨仨毰袛嘞翭LASH_SR寄存器中的BSY位。

ST提供了對(duì)用的庫(kù)函數(shù)

FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR| FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);

寫入步驟

1、檢查FLASH_SR 中的BSY 位,以確認(rèn)當(dāng)前未執(zhí)行任何主要Flash 操作

2、將FLASH_CR 寄存器中的PG 位置1。

3、通過(guò)不同的位寬對(duì)指定地址寫入

4、等待BSY 位清零

對(duì)于寫入接口,ST提供相應(yīng)的庫(kù)函數(shù),提供了8位,16位,32位的操作,因?yàn)槲覀兪?.3V電壓,所以使用32位寫入接口

FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)

2.4、中斷

如果對(duì)于寫入要求較高,可以使能中斷,對(duì)于寫入完成,寫入錯(cuò)誤都會(huì)有響應(yīng)的中斷響應(yīng)。我也沒(méi)有詳細(xì)研究,參看Flash編程手冊(cè)的15.5章節(jié)

03Flash保護(hù)

3.1概述

Flash具有讀寫保護(hù)機(jī)制,主要是用過(guò)選項(xiàng)地址實(shí)現(xiàn)的。還有一次性編程保護(hù)

263292a8-74dd-11eb-8b86-12bb97331649.png

這講述了選項(xiàng)字節(jié)的構(gòu)成

2686cd1e-74dd-11eb-8b86-12bb97331649.png

用戶修改選項(xiàng)字節(jié)

To run any operation on this sector, the option lock bit (OPTLOCK) inthe Flash option control register (FLASH_OPTCR) must be cleared. Tobe allowed to clear this bit, you have to perform the followingsequence:

1. Write OPTKEY1 = 0x0819 2A3B in the Flash option key register(FLASH_OPTKEYR)

2. Write OPTKEY2 = 0x4C5D 6E7F in the Flash option key register(FLASH_OPTKEYR)

The user option bytes can be protected against unwanted erase/programoperations by setting the OPTLOCK bit by software.

這個(gè)上面講述的解鎖Flash相同,就是要寫入不能的數(shù)值

ST提供相應(yīng)的庫(kù)函數(shù)

void FLASH_OB_Unlock(void)void FLASH_OB_Lock(void)

修改用戶字節(jié)的步驟

1、檢查FLASH_SR 寄存器中的BSY 位,以確認(rèn)當(dāng)前未執(zhí)行任何Flash 操作

2、在FLASH_OPTCR 寄存器中寫入所需的選項(xiàng)值

3、將FLASH_OPTCR 寄存器中的選項(xiàng)啟動(dòng)位(OPTSTRT) 置1

4、等待BSY 位清零

3.2 讀保護(hù)

從上面概述中得知,F(xiàn)lash讀保護(hù)共分三個(gè)等級(jí)

1等級(jí)0:沒(méi)有保護(hù)

將0xAA 寫入讀保護(hù)選項(xiàng)字節(jié)(RDP) 時(shí),讀保護(hù)級(jí)別即設(shè)為0。此時(shí),在所有自舉配置(Flash用戶自舉、調(diào)試或從RAM 自舉)中,均可執(zhí)行與Flash 或備份SRAM 相關(guān)的所有讀/寫操作(如果未設(shè)置寫保護(hù))。

2等級(jí)1:閃存讀保護(hù)

這是擦除選項(xiàng)字節(jié)后的默認(rèn)讀保護(hù)級(jí)別。將任意值(分別用于設(shè)置級(jí)別0 和級(jí)別2 的0xAA和0xCC 除外)寫入RDP 選項(xiàng)字節(jié)時(shí),即激活讀保護(hù)級(jí)別1。設(shè)置讀保護(hù)級(jí)別1 后:

-在連接調(diào)試功能或從RAM 進(jìn)行自舉時(shí),將不執(zhí)行任何Flash 訪問(wèn)(讀取、擦除和編程)。Flash 讀請(qǐng)求將導(dǎo)致總線錯(cuò)誤。而在使用Flash 用戶自舉功能或在系統(tǒng)存儲(chǔ)器自舉模式下操作時(shí),則可執(zhí)行所有操作

-激活級(jí)別1 后,如果將保護(hù)選項(xiàng)字節(jié)(RDP) 編程為級(jí)別0,則將對(duì)Flash 和備份SRAM執(zhí)行批量擦除。因此,在取消讀保護(hù)之前,用戶代碼區(qū)域會(huì)清零。批量擦除操作僅擦除用戶代碼區(qū)域。包括寫保護(hù)在內(nèi)的其它選項(xiàng)字節(jié)將保持與批量擦除操作前相同。OTP 區(qū)域不受批量擦除操作的影響,同樣保持不變。

只有在已激活級(jí)別1 并請(qǐng)求級(jí)別0 時(shí),才會(huì)執(zhí)行批量擦除。當(dāng)提高保護(hù)級(jí)別(0-》1,1-》2, 0-》2) 時(shí),不會(huì)執(zhí)行批量擦除。

3等級(jí)2:禁止調(diào)試/芯片讀保護(hù)

注意:

在注意中寫道,如果使能了等級(jí)2的讀保護(hù),永久禁止JTAG端口(相當(dāng)于JTAG熔絲)ST也無(wú)法進(jìn)行分析,說(shuō)白了就是沒(méi)辦法再debug了,目前我沒(méi)有使用到這個(gè)水平的讀保護(hù)

讀保護(hù)庫(kù)函數(shù)

void FLASH_OB_RDPConfig(uint8_t OB_RDP)

查詢讀保護(hù)狀態(tài)庫(kù)函數(shù)

FlagStatus FLASH_OB_GetRDP(void)

3.3 寫保護(hù)

Flash 中的用戶扇區(qū)(0到11)具備寫保護(hù)功能,可防止因程序計(jì)數(shù)器(PC) 跑飛而發(fā)生意外的寫操作。當(dāng)扇區(qū)i 中的非寫保護(hù)位(nWRPi, 0 ≤ i ≤ 11) 為低電平時(shí),無(wú)法對(duì)扇區(qū)i 執(zhí)行擦除或編程操作。因此,如果某個(gè)扇區(qū)處于寫保護(hù)狀態(tài),則無(wú)法執(zhí)行批量擦除。如果嘗試對(duì)Flash 中處于寫保護(hù)狀態(tài)的區(qū)域執(zhí)行擦除/編程操作(由寫保護(hù)位保護(hù)的扇區(qū)、鎖定的OTP 區(qū)域或永遠(yuǎn)不能執(zhí)行寫操作的Flash 區(qū)域,例如ICP),則FLASH_SR 寄存器中的寫保護(hù)錯(cuò)誤標(biāo)志位(WRPERR) 將置1。

寫保護(hù)庫(kù)函數(shù)

void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState)

查詢寫保護(hù)狀態(tài)庫(kù)函數(shù)

uint16_t FLASH_OB_GetWRP(void)

04一次性可編程字節(jié)

沒(méi)有使用過(guò),使用了芯片就廢了吧,沒(méi)有做過(guò)這個(gè)等級(jí)等保護(hù),可以參看Flash編程手冊(cè)的2.7章節(jié)

05代碼

關(guān)于讀寫保護(hù)代碼如何調(diào)用的問(wèn)題,在stm32f2xx_flash.c文件中有調(diào)用說(shuō)明。

/** @defgroup FLASH_Group3 Option Bytes Programming functions * @brief Option Bytes Programming functions *@verbatim =============================================================================== Option Bytes Programming functions ===============================================================================

This group includes the following functions: - void FLASH_OB_Unlock(void) - void FLASH_OB_Lock(void) - void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState) - void FLASH_OB_RDPConfig(uint8_t OB_RDP) - void FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) - void FLASH_OB_BORConfig(uint8_t OB_BOR) - FLASH_Status FLASH_ProgramOTP(uint32_t Address, uint32_t Data) - FLASH_Status FLASH_OB_Launch(void) - uint32_t FLASH_OB_GetUser(void) - uint8_t FLASH_OB_GetWRP(void) - uint8_t FLASH_OB_GetRDP(void) - uint8_t FLASH_OB_GetBOR(void) Any operation of erase or program should follow these steps: 1. Call the FLASH_OB_Unlock() function to enable the FLASH option control register access

2. Call one or several functions to program the desired Option Bytes: - void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState) =》 to Enable/Disable the desired sector write protection - void FLASH_OB_RDPConfig(uint8_t OB_RDP) =》 to set the desired read Protection Level - void FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) =》 to configure the user Option Bytes. - void FLASH_OB_BORConfig(uint8_t OB_BOR) =》 to set the BOR Level

3. Once all needed Option Bytes to be programmed are correctly written, call the FLASH_OB_Launch() function to launch the Option Bytes programming process. @note When changing the IWDG mode from HW to SW or from SW to HW, a system reset is needed to make the change effective.

4. Call the FLASH_OB_Lock() function to disable the FLASH option control register access (recommended to protect the Option Bytes against possible unwanted operations) @endverbatim * @{ */

原文標(biāo)題:STM32 Flash詳解

文章出處:【微信公眾號(hào):玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 芯片
    +關(guān)注

    關(guān)注

    452

    文章

    50005

    瀏覽量

    419702
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1610

    瀏覽量

    147573
  • STM32
    +關(guān)注

    關(guān)注

    2263

    文章

    10847

    瀏覽量

    353807

原文標(biāo)題:STM32 Flash詳解

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何將stm32f207的以太網(wǎng)庫(kù)中l(wèi)wip1.3.2升級(jí)到1.4.1?

    如何將stm32f207的以太網(wǎng)庫(kù)中l(wèi)wip1.3.2升級(jí)到1.4.1
    發(fā)表于 05-17 08:04

    把外圍電路電源都關(guān)閉了,只給stm32f207供電遇到的電流問(wèn)題求解

    我把外圍電路電源都關(guān)閉了,只給 stm32f207供電。 進(jìn)入STOP模式后電流還有6.5mA。 但是禁用外圍時(shí)鐘后返而電流變大了8.6mA了! RCC_AHB1PeriphClockCmd
    發(fā)表于 05-17 07:08

    請(qǐng)問(wèn)STM32F207STM32F407,100pin的能同時(shí)使用以太網(wǎng)和FSMC嗎?

    RT, 請(qǐng)問(wèn)大家,我想選擇100pin的207或者407的MCU,想同時(shí)以太網(wǎng)和驅(qū)動(dòng)RA8875,最好再支持NORFALSH,不知道STM32上有沒(méi)有什么限制。
    發(fā)表于 05-15 07:49

    請(qǐng)問(wèn)STM32F207的MCO是否比STM32F107差?

    我用STM32F107做一個(gè)帶以太網(wǎng)通訊功能的產(chǎn)品,超頻到100MHz左右,一切工作正常。于是換成STM32F207,我拿了兩個(gè)STM32F207樣品,一個(gè)沒(méi)問(wèn)題,另一個(gè)MCO輸出的50MHz不準(zhǔn),導(dǎo)致以太PHY(LAN8720
    發(fā)表于 05-14 08:05

    STM32F207網(wǎng)絡(luò)接收數(shù)據(jù),為什么看不到接收的數(shù)據(jù)?

    我手里有STM32F207的開(kāi)發(fā)板,正在試驗(yàn)TCP ECHO SERVER. static err_t tcp_echoserver_recv(void *arg, struct tcp_pcb
    發(fā)表于 05-13 06:23

    STM32F207利用DMA功能能實(shí)現(xiàn)串口1與串口6之間雙向通信嗎?

    請(qǐng)問(wèn)一下大家,STM32F207利用DMA功能能實(shí)現(xiàn)串口1與串口6之間雙向通信么?建立通信橋梁不需要CPU參與。
    發(fā)表于 04-29 08:53

    關(guān)于STM32F207VF外設(shè)USB接口遇到的問(wèn)題求解

    ,PA11,PA10 上嗎? (2)STM32F207VF IC 如果作為USB device 使用,必須要接外部晶振嗎?如果沒(méi)有外部晶振知識(shí)通過(guò)設(shè)置內(nèi)部時(shí)鐘可以嗎?
    發(fā)表于 04-29 07:29

    STM32F103VCT6 J-LINK V8選用Secure ship加密時(shí),芯片無(wú)法運(yùn)行怎么解決?

    ;project settings->production->Secure ship時(shí),設(shè)備能正常運(yùn)行,反正則不能運(yùn)行。 該加密方式在之前的項(xiàng)目STM32F207上面執(zhí)行
    發(fā)表于 04-26 07:42

    STM32F207 CubeMx FreeRtos Lwip無(wú)法建立多個(gè)端口怎么解決?

    剛剛轉(zhuǎn)入Freertos陣營(yíng),就遇到了問(wèn)題,卡住了,在此懸賞200-500大洋求助。 項(xiàng)目信息: CPU:STM32F207VC PHY:KSZ8041NL 協(xié)議棧:LWIP OS:Freertos
    發(fā)表于 04-23 07:40

    stm32f207片內(nèi)flash的前114個(gè)字節(jié)莫名其妙的變成了0x00的原因?

    stm32f207片內(nèi)flash的前114個(gè)字節(jié)莫名其妙的變成了0x00,這是什么問(wèn)題??會(huì)有哪些原因呢?沒(méi)有對(duì)0x8000000 開(kāi)始的地址操作,因?yàn)檫@段地址是放應(yīng)用程序的。
    發(fā)表于 04-22 07:00

    請(qǐng)問(wèn)STM32F207不支持作為TFTP客戶端嗎?

    STM32F207不支持作為TFTP客戶端嗎
    發(fā)表于 04-16 07:29

    STM32F207死機(jī)PC跑飛的原因?怎么解決?

    STM32F207ZET6,使用過(guò)程發(fā)現(xiàn)有死機(jī)跑飛,分析了一下過(guò)程,是在正常刷屏的過(guò)程中觸發(fā)了一次ADC的DMA完成中斷,中斷中執(zhí)行了一些保存數(shù)據(jù)到對(duì)應(yīng)結(jié)構(gòu)體的任務(wù),然后中斷返回的時(shí)候,pc指針跑飛,進(jìn)了HardFault中斷,就死機(jī)了。是否有大佬有興趣協(xié)助排查分析,可以帶費(fèi)用溝通
    發(fā)表于 03-19 07:04

    stm32f207為什么無(wú)法同時(shí)接上兩個(gè)不同串口的數(shù)據(jù)?

    stm32f207ve芯片,使用rtthread操作系統(tǒng),同時(shí)使用uart2、uart4、uart5同時(shí)發(fā)送數(shù)據(jù),下一級(jí)設(shè)備接收到數(shù)據(jù)后立馬回復(fù)數(shù)據(jù),三條數(shù)據(jù)幾乎同時(shí)接收,大概率會(huì)丟失數(shù)據(jù),往往只能
    發(fā)表于 03-12 07:29

    stm32f103 flash模擬eeprom

    STM32F103的Flash存儲(chǔ)器可以模擬EEPROM的功能,在本文中我們將詳細(xì)介紹如何使用STM32F103的Flash存儲(chǔ)器來(lái)實(shí)現(xiàn)EEPROM。 概述 EEPROM(Elect
    的頭像 發(fā)表于 01-09 11:21 ?1772次閱讀

    STM32F207VC、STM32F205VC例程

    STM32F207VC、STM32F205VC例程| name ? ? ? ? ? ? ? ? | 描述 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? || :------------------- | ------------
    發(fā)表于 11-16 17:02 ?5次下載