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

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

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

3天內不再提示

STM32F207內部Flash編程詳解

GReq_mcu168 ? 來源:玩轉單片機 ? 作者:玩轉單片機 ? 2021-02-23 15:59 ? 次閱讀

本文將根據ST官方Flashprogramming manual,文檔編號:PM0059,講解STM32F207內部Flash編程

01概述

這里的flash是指STM32F207內部集成的Flash

Flash存儲器有以下特點

最大1M字節的能力

128位,也就是16字節寬度的數據讀取

字節,半字,字和雙字寫入

扇區擦除和批量擦除

存儲器的構成

主要存儲區塊包含4個16K字節扇區,1個64K字節扇區和7個128K字節扇區。

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

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

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

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

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

對比參考手冊的boot部分

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

當BOOT0為0是運行主存儲區

當BOOT0為1,BOOT1為0時運行系統存儲區

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

02Flash操作

2.1、讀取

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

data32 = *(__IO uint32_t*)Address;

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

2.2、擦除

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

扇區擦除步驟

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

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

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

4、等待BSY 位清零

批量擦除步驟

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

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

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

4、等待BSY 位清零

ST提供相應的庫函數接口

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

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

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

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

2.3、寫入

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

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

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

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

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

ST提供了庫函數

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

備注:

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

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

ST提供了對用的庫函數

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

寫入步驟

1、檢查FLASH_SR 中的BSY 位,以確認當前未執行任何主要Flash 操作

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

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

4、等待BSY 位清零

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

FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)

2.4、中斷

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

03Flash保護

3.1概述

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

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

這講述了選項字節的構成

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

用戶修改選項字節

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相同,就是要寫入不能的數值

ST提供相應的庫函數

void FLASH_OB_Unlock(void)void FLASH_OB_Lock(void)

修改用戶字節的步驟

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

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

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

4、等待BSY 位清零

3.2 讀保護

從上面概述中得知,Flash讀保護共分三個等級

1等級0:沒有保護

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

2等級1:閃存讀保護

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

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

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

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

3等級2:禁止調試/芯片讀保護

注意:

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

讀保護庫函數

void FLASH_OB_RDPConfig(uint8_t OB_RDP)

查詢讀保護狀態庫函數

FlagStatus FLASH_OB_GetRDP(void)

3.3 寫保護

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

寫保護庫函數

void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState)

查詢寫保護狀態庫函數

uint16_t FLASH_OB_GetWRP(void)

04一次性可編程字節

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

05代碼

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

/** @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 * @{ */

原文標題:STM32 Flash詳解

文章出處:【微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

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

    關注

    456

    文章

    50908

    瀏覽量

    424486
  • FlaSh
    +關注

    關注

    10

    文章

    1638

    瀏覽量

    148158
  • STM32
    +關注

    關注

    2270

    文章

    10906

    瀏覽量

    356479

原文標題:STM32 Flash詳解

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

收藏 人收藏

    評論

    相關推薦

    如何將stm32f207的以太網庫中lwip1.3.2升級到1.4.1?

    如何將stm32f207的以太網庫中lwip1.3.2升級到1.4.1
    發表于 05-17 08:04

    把外圍電路電源都關閉了,只給stm32f207供電遇到的電流問題求解

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

    請問STM32F207STM32F407,100pin的能同時使用以太網和FSMC嗎?

    RT, 請問大家,我想選擇100pin的207或者407的MCU,想同時以太網和驅動RA8875,最好再支持NORFALSH,不知道STM32上有沒有什么限制。
    發表于 05-15 07:49

    請問STM32F207的MCO是否比STM32F107差?

    我用STM32F107做一個帶以太網通訊功能的產品,超頻到100MHz左右,一切工作正常。于是換成STM32F207,我拿了兩個STM32F207樣品,一個沒問題,另一個MCO輸出的50MHz不準,導致以太PHY(LAN8720
    發表于 05-14 08:05

    STM32F207網絡接收數據,為什么看不到接收的數據?

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

    STM32F207利用DMA功能能實現串口1與串口6之間雙向通信嗎?

    請問一下大家,STM32F207利用DMA功能能實現串口1與串口6之間雙向通信么?建立通信橋梁不需要CPU參與。
    發表于 04-29 08:53

    關于STM32F207VF外設USB接口遇到的問題求解

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

    STM32F103VCT6 J-LINK V8選用Secure ship加密時,芯片無法運行怎么解決?

    ;project settings->production->Secure ship時,設備能正常運行,反正則不能運行。 該加密方式在之前的項目STM32F207上面執行
    發表于 04-26 07:42

    STM32L475VE內部Flash編程出現ECCD錯誤的原因?

    使用的芯片型號 STM32L475VE,使用 HAL 庫 `HAL_FLASH_Program` API 對 內部 Flash 進行編程,出
    發表于 04-26 07:21

    STM32F207 CubeMx FreeRtos Lwip無法建立多個端口怎么解決?

    剛剛轉入Freertos陣營,就遇到了問題,卡住了,在此懸賞200-500大洋求助。 項目信息: CPU:STM32F207VC PHY:KSZ8041NL 協議棧:LWIP OS:Freertos
    發表于 04-23 07:40

    stm32f207片內flash的前114個字節莫名其妙的變成了0x00的原因?

    stm32f207片內flash的前114個字節莫名其妙的變成了0x00,這是什么問題??會有哪些原因呢?沒有對0x8000000 開始的地址操作,因為這段地址是放應用程序的。
    發表于 04-22 07:00

    請問STM32F207不支持作為TFTP客戶端嗎?

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

    STM32F207死機PC跑飛的原因?怎么解決?

    STM32F207ZET6,使用過程發現有死機跑飛,分析了一下過程,是在正常刷屏的過程中觸發了一次ADC的DMA完成中斷,中斷中執行了一些保存數據到對應結構體的任務,然后中斷返回的時候,pc指針跑飛,進了HardFault中斷,就死機了。是否有大佬有興趣協助排查分析,可以帶費用溝通
    發表于 03-19 07:04

    stm32f207為什么無法同時接上兩個不同串口的數據?

    stm32f207ve芯片,使用rtthread操作系統,同時使用uart2、uart4、uart5同時發送數據,下一級設備接收到數據后立馬回復數據,三條數據幾乎同時接收,大概率會丟失數據,往往只能
    發表于 03-12 07:29

    stm32f103 flash模擬eeprom

    STM32F103的Flash存儲器可以模擬EEPROM的功能,在本文中我們將詳細介紹如何使用STM32F103的Flash存儲器來實現EEPROM。 概述 EEPROM(Elect
    的頭像 發表于 01-09 11:21 ?2096次閱讀
    主站蜘蛛池模板: 99久久99久久免费精品蜜桃| 国产精品伦视频观看免费| 最好看最新的中文字幕1| 狠狠色噜噜狠狠狠狠黑人| 看全色黄大色大片免费| 好大好硬好深好爽视频h| se01亚洲| 久久婷五月| tube性欧美另类| 一区二区三区视频| 劳拉淫欲护士bd字幕| 亚洲国产综合久久精品| 色婷婷激婷婷深爱五月小说| 欧美激情综合| 国产一级爱c片免费播放| 搞逼综合网| 日本欧美一区二区三区免费不卡| 日本一区二区三区不卡在线看| 狠狠色噜噜综合社区| 亚洲大成色www永久网址| 日韩美aaa特级毛片| 国内精品久久久久影院薰衣草| 夜夜春夜夜夜夜猛噜噜噜噜噜| 欧美黄色大片免费观看| 天天插天天干| 国产人人爱| 亚洲区在线播放| 亚洲 午夜在线一区| 91大神亚洲影视在线| 国产性老妇女做爰在线| 特黄一级黄色片| 久久久久国产精品免费免费不卡| 综合五月天婷婷丁香| 久操免费在线视频| 亚洲狼色专区| 性无码专区无码| 精品综合久久88色鬼首页| 亚洲精品久久片久久| 在线观看黄色的网站| 曰韩一级| 亚洲va中文字幕无码|