91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

3天內不再提示

STM32學習筆記:讀寫內部Flash

GReq_mcu168 ? 來源:玩轉單片機 ? 2019-11-26 14:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、介紹

首先我們需要了解一個內存映射:

stm32的flash地址起始于0x0800 0000,結束地址是0x0800 0000加上芯片實際的flash大小,不同的芯片flash大小不同。

RAM起始地址是0x2000 0000,結束地址是0x2000 0000加上芯片的RAM大小。不同的芯片RAM也不同。

Flash中的內容一般用來存儲代碼和一些定義為const的數據,斷電不丟失,
RAM可以理解為內存,用來存儲代碼運行時的數據,變量等等。掉電數據丟失。

STM32將外設等都映射為地址的形式,對地址的操作就是對外設的操作。
stm32的外設地址從0x4000 0000開始,可以看到在庫文件中,是通過基于0x4000 0000地址的偏移量來操作寄存器以及外設的。

一般情況下,程序文件是從 0x0800 0000 地址寫入,這個是STM32開始執行的地方,0x0800 0004是STM32的中斷向量表的起始地址。
在使用keil進行編寫程序時,其編程地址的設置一般是這樣的:

程序的寫入地址從0x08000000(數好零的個數)開始的,其大小為0x80000也就是512K的空間,換句話說就是告訴編譯器flash的空間是從0x08000000-0x08080000,RAM的地址從0x20000000開始,大小為0x10000也就是64K的RAM。這與STM32的內存地址映射關系是對應的。

M3復位后,從0x08000004取出復位中斷的地址,并且跳轉到復位中斷程序,中斷執行完之后會跳到我們的main函數,main函數里邊一般是一個死循環,進去后就不會再退出,當有中斷發生的時候,M3將PC指針強制跳轉回中斷向量表,然后根據中斷源進入對應的中斷函數,執行完中斷函數之后,再次返回main函數中。大致的流程就是這樣。

1.1、內部Flash的構成:

STM32F429 的內部 FLASH 包含主存儲器、系統存儲器、 OTP 區域以及選項字節區域,它們的地址分布及大小如下:

STM32F103的中容量內部 FLASH 包含主存儲器、系統存儲器、 OTP 區域以及選項字節區域,它們的地址分布及大小如下:

注意STM32F105VC的是有64K或128頁x2K=256k字節的內置閃存存儲器,用于存放程序和數據。

主存儲器:一般我們說 STM32 內部 FLASH 的時候,都是指這個主存儲器區域它是存儲用戶應用程序的空間,芯片型號說明中的 1M FLASH、 2M FLASH 都是指這個區域的大小。與其它 FLASH 一樣,在寫入數據前,要先按扇區擦除,

系統存儲區:系統存儲區是用戶不能訪問的區域,它在芯片出廠時已經固化了啟動代碼,它負責實現串口、 USB 以及 CAN 等 ISP 燒錄功能。

OTP 區域:OTP(One Time Program),指的是只能寫入一次的存儲區域,容量為 512 字節,寫入后數據就無法再更改, OTP 常用于存儲應用程序的加密密鑰。

選項字節:選項字節用于配置 FLASH 的讀寫保護、電源管理中的 BOR 級別、軟件/硬件看門狗等功能,這部分共 32 字節。可以通過修改 FLASH 的選項控制寄存器修改。

1.2、對內部Flash的寫入過程:

1. 解鎖 (固定的KEY值)
(1) 往 Flash 密鑰寄存器 FLASH_KEYR 中寫入 KEY1 = 0x45670123
(2) 再往 Flash 密鑰寄存器 FLASH_KEYR 中寫入 KEY2 = 0xCDEF89AB
2. 數據操作位數
最大操作位數會影響擦除和寫入的速度,其中 64 位寬度的操作除了配置寄存器位外,還需要在 Vpp 引腳外加一個 8-9V 的電壓源,且其供電間不得超過一小時,否則 FLASH可能損壞,所以 64 位寬度的操作一般是在量產時對 FLASH 寫入應用程序時才使用,大部分應用場合都是用 32 位的寬度。
3. 擦除扇區
在寫入新的數據前,需要先擦除存儲區域, STM32 提供了扇區擦除指令和整個FLASH 擦除(批量擦除)的指令,批量擦除指令僅針對主存儲區。
扇區擦除的過程如下:
(1) 檢查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以確認當前未執行任何
Flash 操作;
(2) 在 FLASH_CR 寄存器中,將“激活扇區擦除寄存器位 SER ”置 1,并設置“扇
區編號寄存器位 SNB”,選擇要擦除的扇區;
(3) 將 FLASH_CR 寄存器中的“開始擦除寄存器位 STRT ”置 1,開始擦除;
(4) 等待 BSY 位被清零時,表示擦除完成。
4. 寫入數據
擦除完畢后即可寫入數據,寫入數據的過程并不是僅僅使用指針向地址賦值,賦值前還還需要配置一系列的寄存器,步驟如下:
(1) 檢查 FLASH_SR 中的 BSY 位,以確認當前未執行任何其它的內部 Flash 操作;
(2) 將 FLASH_CR 寄存器中的 “激活編程寄存器位 PG” 置 1;
(3) 針對所需存儲器地址(主存儲器塊或 OTP 區域內)執行數據寫入操作;
(4) 等待 BSY 位被清零時,表示寫入完成。

1.3、查看工程內存的分布:

由于內部 FLASH 本身存儲有程序數據,若不是有意刪除某段程序代碼,一般不應修改程序空間的內容,所以在使用內部 FLASH 存儲其它數據前需要了解哪一些空間已經寫入了程序代碼,存儲了程序代碼的扇區都不應作任何修改。通過查詢應用程序編譯時產生的“ *.map”后綴文件,
打開 map 文件后,查看文件最后部分的區域,可以看到一段以“ Memory Map of the
image”開頭的記錄(若找不到可用查找功能定位),

【注】ROM加載空間

這一段是某工程的 ROM 存儲器分布映像,在 STM32 芯片中, ROM 區域的內容就是 指存儲到內部 FLASH 的代碼。
在上面 map 文件的描述中,我們了解到加載及執行空間的基地址(Base)都是0x08000000,它正好是 STM32 內部 FLASH 的首地址,即 STM32 的程序存儲空間就直接是執行空間;它們的大小(Size)分別為 0x00000b50 及 0x00000b3c,執行空間的 ROM 比較小的原因就是因為部分 RW-data 類型的變量被拷貝到 RAM 空間了;它們的最大空間(Max)均為 0x00100000,即 1M 字節,它指的是內部 FLASH 的最大空間。

計算程序占用的空間時,需要使用加載區域的大小進行計算,本例子中應用程序使用
的內部 FLASH 是從 0x08000000 至(0x08000000+0x00000b50)地址的空間區域。
所以從扇區 1(地址 0x08004000)后的存儲空間都可以作其它用途,使用這些存儲空間時不會篡改應用程序空間的數據。
具體可參考原子的例程:實驗四十一:FLASH 模擬 EEPROM 實驗

文章引用地址:https://blog.csdn.net/qq_33559992/article/details/77676716

感謝原文作者

二、代碼拆分介紹(以STM32F105系列為例,如上圖表5所示)

2.1 讀/寫入數據流程

寫數據流程

2.1.1、Flash 解鎖,直接調用#include "stm32f10x_flash.h"中的void FLASH_Unlock(void)函數,這個函數是官方提供的

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

    關注

    31

    文章

    5434

    瀏覽量

    124455
  • FlaSh
    +關注

    關注

    10

    文章

    1679

    瀏覽量

    151790
  • STM32
    +關注

    關注

    2293

    文章

    11032

    瀏覽量

    364825

原文標題:STM32學習筆記:讀寫內部Flash(附代碼)

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    hpm6364內部flash使用時的openocd配置問題.

    /yasuoHPM6000xilieMCUFlashshiyongzhinanyiruheshiyongpianneiFlash120231101151455.pdf)中提到使用內部flash時openocd 的腳本文件應改為如下: f
    發表于 07-12 19:48

    第二十九章 讀寫內部FLASH

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

    STM32L476 Flash擦除失敗的原因?

    開發板MCU型號:STM32L476RG 同樣的固件在開發板中flash讀寫擦除操作都沒問題,但在產品中擦除函數返回成功,但flash中的數據其實并沒有擦除。 這兩款MCU在
    發表于 04-23 08:26

    STM32Cube學習筆記 (十六篇全)

    資料介紹: STM32Cube學習筆記,一步一步手把手帶你進入STM32Cube的世界,包括點燈,按鍵,串口,ADC,DAC等等一共16篇。 純分享貼,有需要可以直接下載附件獲取完
    發表于 03-22 17:02

    IPC2221簡略學習筆記

    關于IPC2221的學習筆記
    發表于 03-14 18:07 ?5次下載

    STM32C031F4 FLASH存儲器讀寫例程各位高能不能提供一個?

    STM32C031F4FLASH存儲器 讀寫例程 各位高能不能提供一個謝謝大家
    發表于 03-13 07:37

    請問STM32訪問FPGA內部SRAM部分區域為何只能讀不能寫?

    通過SPI總線訪問Flash; FPGA已經被配置OK; 因為新增加了功能,需要通過STM32讀寫FPGA內部SRAM的特定區域。測試時卻發現只有地址0x60000004、0x6000
    發表于 03-12 07:59

    STM32H750內部flash讀寫的疑問求解

    請教下,STM32H750XBHx我看資料內置flash為128K,并且flash擦除的最小單元也是128K。這樣的話我有數據要保存應該怎樣處理好呢?寫數據時是要將程序部分一起擦除再寫回去嗎?這樣會不會有風險?
    發表于 03-12 06:29

    cubeide的代碼怎么編譯到內部+外部FLASH里面去?

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

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

    程序接口(UART、USB DFU、I2C、SPI和CAN)讀取、寫入及驗證器件內存。 STM32CubeProgrammer的功能廣泛,可以對STM32內部存儲器(如Flash、R
    的頭像 發表于 12-16 15:52 ?1945次閱讀
    <b class='flag-5'>STM32</b>WB55RG開發(2)----<b class='flag-5'>STM32</b>CubeProgrammer燒錄

    Air201模組教程:SPI通信與外部Flash的連接之道!

    今天我們要學習的是Air201定位模組LuatOS快速入門,本文將通過Air201+擴展板讀寫外部flash的演示,教你使用SPI示例,可根據實際需求靈活應用。
    的頭像 發表于 11-18 00:23 ?935次閱讀
    Air201模組教程:SPI通信與外部<b class='flag-5'>Flash</b>的連接之道!

    LuatOS入門課|Air201模組與SPI Flash的交互藝術

    今天我會把我了解的關于如何使用SPI讀寫外部Flash教給大家,本文將通過Air201+擴展板讀寫外部flash的演示,教你使用SPI示例,可根據實際需求靈活應用。
    的頭像 發表于 11-17 09:51 ?634次閱讀
    LuatOS入門課|Air201模組與SPI <b class='flag-5'>Flash</b>的交互藝術

    EEPROM輕量級的簡易類文件的數據讀寫庫:EEPROMFS

    雖然 EEPROM 相對 Flash 讀寫速度更慢,但 EEPROM 一些獨有特性是 Flash 無法實現的,比如字節讀寫操作。 所以,EEPROM至今依然應用在很多電子設備上,而且市
    的頭像 發表于 11-15 16:31 ?1188次閱讀
    EEPROM輕量級的簡易類文件的數據<b class='flag-5'>讀寫</b>庫:EEPROMFS

    STM32CUBEMX(10)--Flash讀寫

    概述 本例程主要講解如何對芯片自帶Flash進行讀寫,用芯片內部Flash可以對一些需要斷電保存的數據進行保存,無需加外部得存儲芯片,本例程采用的是
    發表于 09-10 15:36

    第一篇:V1.5-STM32f103c8t6智能小車筆記 標準庫開發 6612電機驅動新手入門項目

    這是全網最詳細、性價比最高的STM32實戰項目入門教程,通過合理的硬件設計和詳細的視頻筆記介紹,硬件使用STM32F103主控資料多方便學習,通過3萬字
    的頭像 發表于 08-12 18:25 ?2557次閱讀
    第一篇:V1.5-<b class='flag-5'>STM32</b>f103c8t6智能小車<b class='flag-5'>筆記</b> 標準庫開發 6612電機驅動新手入門項目
    主站蜘蛛池模板: 欧美一级特黄aaaaaa在线看片 | 日韩毛片| 天天舔天天 | 天天弄 | 狠狠色丁香久久综合五月 | 国产1024一区二区你懂的 | 在线观看免费国产 | 国产二区三区毛片 | 免费大片黄在线观看日本 | 天天干干天天 | 国产在线五月综合婷婷 | 色噜噜噜噜噜 | 深夜福利一区 | 久久国产乱子伦精品免费强 | 欧洲不卡一卡2卡三卡4卡网站 | 天天插伊人 | 色综合久久综合欧美综合网 | 欧美 变态 另类 人妖班 | 五月激情六月婷婷 | 双性人皇上被c到哭 | 久久永久免费视频 | 亚洲欧美日韩国产一区二区三区精品 | 奇米影视亚洲春色77777 | 操操干 | 狠狠色狠色综合曰曰 | 亚洲人成伊人成综合网久久 | 在线看欧美成人中文字幕视频 | 天堂电影在线 | 中国农村一级片 | 国产在线播放成人免费 | 成人人免费夜夜视频观看 | 性夜黄a爽爽免费视频国产 羞羞答答xxdd影院欧美 | 欧美人与z0zoxxxx特 | 国产精品久久久精品视频 | 久久久久久久成人午夜精品福利 | 特级a毛片| 午夜免费视频观看在线播放 | 2021年最热新版天堂资源中文 | 特黄特色大片免费视频播放 | 在线亚洲精品中文字幕美乳 | 伊人福利视频 |