在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

淺析STM32F207內(nèi)部Flash編程

GReq_mcu168 ? 來源:CSDN技術社區(qū) ? 作者: Firefly_cjd ? 2021-04-07 14:14 ? 次閱讀

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

b0e3104e-9404-11eb-8b86-12bb97331649.png

01概述

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

Flash存儲器有以下特點

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

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

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

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

存儲器的構(gòu)成

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

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

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

選項字節(jié),讀寫保護,BOR水平,軟件/硬件看門狗和復位當設置處于待機和停機狀態(tài)。

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

b0f006f0-9404-11eb-8b86-12bb97331649.png

對比參考手冊的boot部分

b122e638-9404-11eb-8b86-12bb97331649.png

當BOOT0為0是運行主存儲區(qū)

當BOOT0為1,BOOT1為0時運行系統(tǒng)存儲區(qū)

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

02Flash操作

2.1、讀取

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

data32 = *(__IO uint32_t*)Address;

將Address強制轉(zhuǎn)化為32位整型指針,然后取該指針所指向的地址的值,就得到了Address地址上的32位數(shù)據(jù)。

2.2、擦除

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

扇區(qū)擦除步驟

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

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

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

4、等待BSY 位清零

批量擦除步驟

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

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

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

4、等待BSY 位清零

ST提供相應的庫函數(shù)接口

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

注意到,有個特殊的參數(shù)VoltageRange,這是因為

b13ea486-9404-11eb-8b86-12bb97331649.png

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

2.3、寫入

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

復位后,F(xiàn)lash控制器寄存器(FLASH_CR)不允許寫入的,去保護Flash閃存因為電氣原因出現(xiàn)的以外操作,以下是解鎖的步驟

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

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

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

ST提供了庫函數(shù)

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

備注:

當FLASH_SR 寄存器中的BSY 位置為1 后,將不能在寫模式下訪問FLASH_CR 寄存器。BSY 位置為1 后,對該寄存器的任何寫操作嘗試都會導致AHB 總線阻塞,直到BSY位清零

這要求我們在寫入前必須判斷下FLASH_SR寄存器中的BSY位。

ST提供了對用的庫函數(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 位,以確認當前未執(zhí)行任何主要Flash 操作

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

3、通過不同的位寬對指定地址寫入

4、等待BSY 位清零

對于寫入接口,ST提供相應的庫函數(shù),提供了8位,16位,32位的操作,因為我們是3.3V電壓,所以使用32位寫入接口

FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)

2.4、中斷

如果對于寫入要求較高,可以使能中斷,對于寫入完成,寫入錯誤都會有響應的中斷響應。我也沒有詳細研究,參看Flash編程手冊的15.5章節(jié)

03Flash保護

3.1概述

Flash具有讀寫保護機制,主要是用過選項地址實現(xiàn)的。還有一次性編程保護

b166aba2-9404-11eb-8b86-12bb97331649.png

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

b19a8c42-9404-11eb-8b86-12bb97331649.png

用戶修改選項字節(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.

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

ST提供相應的庫函數(shù)

void FLASH_OB_Unlock(void)void FLASH_OB_Lock(void)

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

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

2、在FLASH_OPTCR 寄存器中寫入所需的選項值

3、將FLASH_OPTCR 寄存器中的選項啟動位(OPTSTRT) 置1

4、等待BSY 位清零

3.2 讀保護

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

1等級0:沒有保護

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

2等級1:閃存讀保護

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

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

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

只有在已激活級別1 并請求級別0 時,才會執(zhí)行批量擦除。當提高保護級別(0-》1,1-》2, 0-》2) 時,不會執(zhí)行批量擦除。

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

注意:

在注意中寫道,如果使能了等級2的讀保護,永久禁止JTAG端口(相當于JTAG熔絲)ST也無法進行分析,說白了就是沒辦法再debug了,目前我沒有使用到這個水平的讀保護

讀保護庫函數(shù)

void FLASH_OB_RDPConfig(uint8_t OB_RDP)

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

FlagStatus FLASH_OB_GetRDP(void)

3.3 寫保護

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

寫保護庫函數(shù)

void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState)

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

uint16_t FLASH_OB_GetWRP(void)

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

沒有使用過,使用了芯片就廢了吧,沒有做過這個等級等保護,可以參看Flash編程手冊的2.7章節(jié)

05代碼

關于讀寫保護代碼如何調(diào)用的問題,在stm32f2xx_flash.c文件中有調(diào)用說明。

/** @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 * @{ */
編輯:lyn

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

    關注

    10

    文章

    1672

    瀏覽量

    151200
  • 存儲器
    +關注

    關注

    38

    文章

    7641

    瀏覽量

    166666
  • STM32
    +關注

    關注

    2291

    文章

    11019

    瀏覽量

    363034

原文標題:STM32 Flash詳解

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    第二十九章 讀寫內(nèi)部FLASH

    本文介紹了W55MH32內(nèi)部FLASH,其含主存儲、系統(tǒng)存儲等,可存儲代碼及掉電保存數(shù)據(jù)。讀寫需解鎖、擦除頁等步驟,標準庫提供相關函數(shù)。還展示了擦除編程測試及模擬EEPROM讀寫的實驗。
    的頭像 發(fā)表于 06-20 14:09 ?279次閱讀
    第二十九章 讀寫<b class='flag-5'>內(nèi)部</b><b class='flag-5'>FLASH</b>

    STM32F3系列、STM32F4系列、STM32L4系列和STM32L4+系列Cortex-M4編程手冊

    電子發(fā)燒友網(wǎng)站提供《STM32F3系列、STM32F4系列、STM32L4系列和STM32L4+系列Cortex-M4編程手冊.pdf》資料
    發(fā)表于 06-06 17:06 ?4次下載

    STM32F40xxx和STM32f41xx flash編程手冊

    PM0081_STM32F40xxx and STM32F41xxx單片機編程手冊
    發(fā)表于 06-06 17:02 ?3次下載

    STM32F030內(nèi)部晶振怎么設置,內(nèi)部晶振是延時函數(shù)怎么設置?

    STM32F030內(nèi)部晶振怎么設置,內(nèi)部晶振是延時函數(shù)怎么設置 使用STM32F030時沒使用內(nèi)部晶振怎么設置,使用
    發(fā)表于 04-23 07:45

    STM32F10xxx單片機編程手冊

    電子發(fā)燒友網(wǎng)站提供《STM32F10xxx單片機編程手冊.pdf》資料免費下載
    發(fā)表于 04-14 14:56 ?8次下載

    STM32F103x8 STM32F103xB單片機數(shù)據(jù)手冊

    STM32F103x8STM32F103xB單片機數(shù)據(jù)手冊
    發(fā)表于 04-14 14:55 ?2次下載

    STM32F103×8/STM32F103×B MCU手冊

    參考第2.2節(jié):整個系列的完全兼容性。中密度STM32F103xx數(shù)據(jù)手冊必須與低、中、高密度STM 32 f 10 xx參考手冊一起閱讀。有關數(shù)據(jù)手冊和參考手冊的設備勘誤表信息,請參考STM32F103x8/Berrata表(
    發(fā)表于 03-18 16:37 ?0次下載

    STM32F207VET6的flash是512KB的,為什么對0x080A0000后512KB的內(nèi)存進行操作程序沒有問題呢?

    STM32F207VET6的flash是512KB的,為什么對0x080A0000后512KB的內(nèi)存進行操作程序沒有問題?
    發(fā)表于 03-12 07:19

    使用STM32F030時沒使用內(nèi)部晶振怎么設置,使用內(nèi)部晶振時延時函數(shù)怎么寫?

    STM32F030內(nèi)部晶振怎么設置,內(nèi)部晶振是延時函數(shù)怎么設置 使用STM32F030時沒使用內(nèi)部晶振怎么設置,使用
    發(fā)表于 03-07 08:13

    cubeide的代碼怎么編譯到內(nèi)部+外部FLASH里面去?

    我有一個項目,準備使用GUI和AI,準備使用STM32U5,但是編譯出來的代碼很多,STM32U5的內(nèi)部FLASH不夠用,準備使用OSPI擴展外部F
    發(fā)表于 03-07 07:48

    GD32F207xx數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《GD32F207xx數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 01-16 15:12 ?0次下載
    GD32<b class='flag-5'>F207</b>xx數(shù)據(jù)表

    STM32F405xx和STM32F407xx微控制器數(shù)據(jù)手冊

    電子發(fā)燒友網(wǎng)站提供《STM32F405xx和STM32F407xx微控制器數(shù)據(jù)手冊.pdf》資料免費下載
    發(fā)表于 01-03 14:49 ?2次下載

    CYPRESS FLASH MCU Programmer for F2MC-16FX

    Software version: V01L18程序的功能:可以對集成在微控制器中的flash執(zhí)行擦除、空白檢查、編程和驗證、讀取和比較以及復制。啟動編程器軟件打開對話框,如下所示:兼容的MCU(注
    發(fā)表于 12-23 11:25 ?2次下載

    STM32C011開發(fā)(2)----nBOOT_SEL設置

    程序接口(UART、USB DFU、I2C、SPI和CAN)讀取、寫入及驗證器件內(nèi)存。 STM32CubeProgrammer的功能廣泛,可以對STM32內(nèi)部存儲器(如Flash、R
    的頭像 發(fā)表于 12-16 17:27 ?1845次閱讀
    <b class='flag-5'>STM32</b>C011開發(fā)(2)----nBOOT_SEL設置

    STM32WB55RG開發(fā)(2)----STM32CubeProgrammer燒錄

    程序接口(UART、USB DFU、I2C、SPI和CAN)讀取、寫入及驗證器件內(nèi)存。 STM32CubeProgrammer的功能廣泛,可以對STM32內(nèi)部存儲器(如Flash、R
    的頭像 發(fā)表于 12-16 15:52 ?1685次閱讀
    <b class='flag-5'>STM32</b>WB55RG開發(fā)(2)----<b class='flag-5'>STM32</b>CubeProgrammer燒錄
    主站蜘蛛池模板: 久久国产午夜精品理论片34页 | 中国china体内裑精亚洲毛片 | 亚洲一二三区在线观看 | 色噜噜亚洲精品中文字幕 | 三级aa久久| 日本一区二区精品88 | 他也色在线 | 欧美一级在线全免费 | 两性色午夜视频免费播放 | 亚洲欧美日韩在线精品2021 | 伊人成综合 | 九月婷婷综合婷婷 | 国产欧美精品午夜在线播放 | 亚洲精品美女 | 国产人成高清视频观看 | 天天舔天天爱 | 欧美性色欧美a在线观看 | 性过程很黄的小说男男 | 亚洲男人的天堂在线观看 | 亚洲国产精品久久精品怡红院 | 久久精品国产亚洲5555 | 欧美黄三级在线观看 | 亚洲日韩图片专区第1页 | 国产传媒在线观看视频免费观看 | 国产拳头交一区二区 | 色偷偷女男人的天堂亚洲网 | 日韩欧美高清一区 | 久久香蕉国产精品一区二区三 | 天堂中文在线观看 | 99视频在线永久免费观看 | 激情网址在线观看 | 久久午夜视频 | 狂捣猛撞侍卫攻双性王爷受 | 欧美日本视频一区 | 99国内视频 | 四虎影院大全 | 色宅男看片午夜大片免费看 | 夜夜艹日日干 | 国产一级aa大片毛片 | 69精品在线观看 | 最新午夜宅男 |