国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

歷史上的今天

今天是:2025年07月16日(星期三)

2019年07月16日 | STM32開發(fā)筆記38: 單片機(jī)內(nèi)部Flash的讀寫

發(fā)布者:Huanle 來源: eefocus關(guān)鍵字:STM32  單片機(jī)  內(nèi)部Flash  讀寫 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

單片機(jī)型號:STM32F070F6P6


本文介紹應(yīng)用C語言進(jìn)行單片機(jī)內(nèi)部Flash的讀寫技巧,將從查看文檔開始,到最終完成完整的程序。


單片機(jī)型號:STM32F070F6P6


步驟如下:


1、查看文檔《STM32F030x4/x6/x8/xC and STM32F070x6/xB advanced ARM?-based 32-bit MCUs》確認(rèn)其Flash的內(nèi)部結(jié)構(gòu)。



2、查看文檔確認(rèn)STM32F070F6P6內(nèi)部存儲器地址分配。從下表中得到的主要信息是Main Flash memory的起始地址是0x08000000,長度是32KB,到0x08017FFF結(jié)束(結(jié)束值可不關(guān)心)。



3、繼續(xù)查看Main Flash memory的內(nèi)部結(jié)構(gòu),如下表所示。從此表可以看出其內(nèi)部Flash按1Kbyte進(jìn)行分頁,由于STM32F070F6P6為32KB,所以一共分成32頁,分別為Page0-Page31。這個也與Keil的內(nèi)部設(shè)置是相吻合的,見下圖。


4、建立Flash地址列表,加入如下程序,這些程序參照文檔自己手動完成,在使用時,盡量靠后使用,以免和自身程序所占用的Flash空間重疊。


#define ADDR_FLASH_PAGE_0     ((uint32_t)0x08000000) /* Base @ of Page 0, 1 Kbytes */

#define ADDR_FLASH_PAGE_1     ((uint32_t)0x08000400) /* Base @ of Page 1, 1 Kbytes */

#define ADDR_FLASH_PAGE_2     ((uint32_t)0x08000800) /* Base @ of Page 2, 1 Kbytes */

#define ADDR_FLASH_PAGE_3     ((uint32_t)0x08000C00) /* Base @ of Page 3, 1 Kbytes */

#define ADDR_FLASH_PAGE_4     ((uint32_t)0x08001000) /* Base @ of Page 4, 1 Kbytes */

#define ADDR_FLASH_PAGE_5     ((uint32_t)0x08001400) /* Base @ of Page 5, 1 Kbytes */

#define ADDR_FLASH_PAGE_6     ((uint32_t)0x08001800) /* Base @ of Page 6, 1 Kbytes */

#define ADDR_FLASH_PAGE_7     ((uint32_t)0x08001C00) /* Base @ of Page 7, 1 Kbytes */

#define ADDR_FLASH_PAGE_8     ((uint32_t)0x08002000) /* Base @ of Page 8, 1 Kbytes */

#define ADDR_FLASH_PAGE_9     ((uint32_t)0x08002400) /* Base @ of Page 9, 1 Kbytes */

#define ADDR_FLASH_PAGE_10    ((uint32_t)0x08002800) /* Base @ of Page 10, 1 Kbytes */

#define ADDR_FLASH_PAGE_11    ((uint32_t)0x08002C00) /* Base @ of Page 11, 1 Kbytes */

#define ADDR_FLASH_PAGE_12    ((uint32_t)0x08003000) /* Base @ of Page 12, 1 Kbytes */

#define ADDR_FLASH_PAGE_13    ((uint32_t)0x08003400) /* Base @ of Page 13, 1 Kbytes */

#define ADDR_FLASH_PAGE_14    ((uint32_t)0x08003800) /* Base @ of Page 14, 1 Kbytes */

#define ADDR_FLASH_PAGE_15    ((uint32_t)0x08003C00) /* Base @ of Page 15, 1 Kbytes */

#define ADDR_FLASH_PAGE_16    ((uint32_t)0x08004000) /* Base @ of Page 16, 1 Kbytes */

#define ADDR_FLASH_PAGE_17    ((uint32_t)0x08004400) /* Base @ of Page 17, 1 Kbytes */

#define ADDR_FLASH_PAGE_18    ((uint32_t)0x08004800) /* Base @ of Page 18, 1 Kbytes */

#define ADDR_FLASH_PAGE_19    ((uint32_t)0x08004C00) /* Base @ of Page 19, 1 Kbytes */

#define ADDR_FLASH_PAGE_20    ((uint32_t)0x08005000) /* Base @ of Page 20, 1 Kbytes */

#define ADDR_FLASH_PAGE_21    ((uint32_t)0x08005400) /* Base @ of Page 21, 1 Kbytes */

#define ADDR_FLASH_PAGE_22    ((uint32_t)0x08005800) /* Base @ of Page 22, 1 Kbytes */

#define ADDR_FLASH_PAGE_23    ((uint32_t)0x08005C00) /* Base @ of Page 23, 1 Kbytes */

#define ADDR_FLASH_PAGE_24    ((uint32_t)0x08006000) /* Base @ of Page 24, 1 Kbytes */

#define ADDR_FLASH_PAGE_25    ((uint32_t)0x08006400) /* Base @ of Page 25, 1 Kbytes */

#define ADDR_FLASH_PAGE_26    ((uint32_t)0x08006800) /* Base @ of Page 26, 1 Kbytes */

#define ADDR_FLASH_PAGE_27    ((uint32_t)0x08006C00) /* Base @ of Page 27, 1 Kbytes */

#define ADDR_FLASH_PAGE_28    ((uint32_t)0x08007000) /* Base @ of Page 28, 1 Kbytes */

#define ADDR_FLASH_PAGE_29    ((uint32_t)0x08007400) /* Base @ of Page 29, 1 Kbytes */

#define ADDR_FLASH_PAGE_30    ((uint32_t)0x08007800) /* Base @ of Page 30, 1 Kbytes */

#define ADDR_FLASH_PAGE_31    ((uint32_t)0x08007C00) /* Base @ of Page 31, 1 Kbytes */

6、建立CFlash類,代碼如下:


class CFlash

{

public:

    void UnLockFalsh(void);

    void LockFlash(void);

    boolean ErasePage(uint32_t u32_Page);

    boolean WriteDataToFlash(uint32_t address, uint8_t data3, uint8_t data2, uint8_t data1, uint8_t data0);

    boolean WriteDataToFlash(uint32_t address, uint16_t data1, uint16_t data0);

    boolean WriteDataToFlash(uint32_t address, uint32_t data);

    void ReadDataFromFlash(uint32_t address, uint8_t *data3, uint8_t *data2, uint8_t *data1, uint8_t *data0);

    void ReadDataFromFlash(uint32_t address, uint16_t *data1, uint16_t *data0);

    void ReadDataFromFlash(uint32_t address, uint32_t *data);

};

7、以下是上述成員函數(shù)的具體實現(xiàn),參考使用即可。


#include "include.h"

 

void CFlash::UnLockFalsh(void)

{

    HAL_FLASH_Unlock();

}

 

void CFlash::LockFlash(void)

{

    HAL_FLASH_Lock();

}

boolean CFlash::ErasePage(uint32_t u32_Page)

{

    FLASH_EraseInitTypeDef EraseInitStruct;

    uint32_t PageError = 0;

 

    EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;

    EraseInitStruct.PageAddress = u32_Page;

    EraseInitStruct.NbPages = 1;

    if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)

    {

        return TRUE;

    }

    return FALSE;

}

 

boolean CFlash::WriteDataToFlash(uint32_t address, uint8_t data3, uint8_t data2, uint8_t data1, uint8_t data0)

{

    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, (data3 << 24) | (data2 << 16) | (data1 << 8) | data0) != HAL_OK)

    {

        return FALSE;

    }

    return TRUE;

}

 

boolean CFlash::WriteDataToFlash(uint32_t address, uint16_t data1, uint16_t data0)

{

    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, (data1 << 16) |  data0) != HAL_OK)

    {

        return FALSE;

    }

    return TRUE;

}

 

boolean CFlash::WriteDataToFlash(uint32_t address, uint32_t data)

{

    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data) != HAL_OK)

    {

        return FALSE;

    }

    return TRUE;

}

 

 

void CFlash::ReadDataFromFlash(uint32_t address, uint8_t *data3, uint8_t *data2, uint8_t *data1, uint8_t *data0)

{

    uint32_t u32_Data;

    u32_Data = *(__IO uint32_t *)(address);

    if (data3 != NULL)

    {

        *data3 = (u32_Data >> 24) & 0xff;

    }

    if (data2 != NULL)

    {

        *data2 = (u32_Data >> 16) & 0xff;

    }

    if (data1 != NULL)

    {

        *data1 = (u32_Data >> 8) & 0xff;

    }

    if (data0 != NULL)

    {

        *data0 = u32_Data & 0xff;

    }

}

 

void CFlash::ReadDataFromFlash(uint32_t address, uint16_t *data1, uint16_t *data0)

{

    uint32_t u32_Data;

    u32_Data = *(__IO uint32_t *)(address);

    *data1 = (u32_Data >> 16) & 0xffff;

    *data0 = u32_Data & 0xffff;

}

 

void CFlash::ReadDataFromFlash(uint32_t address, uint32_t *data)

{

    *data =  *(__IO uint32_t *)(address);

}

8、到此,就可以直接進(jìn)行Flash讀寫操作了。


關(guān)鍵字:STM32  單片機(jī)  內(nèi)部Flash  讀寫 引用地址:STM32開發(fā)筆記38: 單片機(jī)內(nèi)部Flash的讀寫

上一篇:STM32開發(fā)筆記39: Keil打開時提示”Warning #440“警告的解決方法
下一篇:STM32開發(fā)筆記37: 485總線的收發(fā)切換時間

推薦閱讀

物流配送領(lǐng)域近兩年仿佛成為了機(jī)器人行業(yè)兵家必爭之地,玩家亦是從傳統(tǒng)互聯(lián)網(wǎng)巨頭到創(chuàng)業(yè)新秀各色都有,并且各家有各家的優(yōu)勢和章法——電商背景的巨頭有完整的物流配送業(yè)務(wù)線,自己就是優(yōu)質(zhì)的機(jī)器人落地場景;較早進(jìn)入到酒店等相關(guān)細(xì)分領(lǐng)域的機(jī)器人公司,在已有行業(yè)中積累了一定程度的品牌知名度;甚至還有一些非常“小眾”的入局者,比如,從事電梯物聯(lián)...
2018年社交機(jī)器人倒閉潮的到來,讓行業(yè)進(jìn)入到一個冷靜期,存活下來的企業(yè)開始在資本浪潮褪去、發(fā)展遭遇瓶頸及業(yè)內(nèi)形勢嚴(yán)峻之際,思索新的出路與前途。2019年7月2日,大連達(dá)沃斯發(fā)布了年度十大新興技術(shù)榜單,社交機(jī)器人名列其中。業(yè)界一致認(rèn)為,這一新興技術(shù)通過人機(jī)交互的形式,擁有改善世界狀況的強大力量??烧l曾想,在此之前行業(yè)已經(jīng)有三家明星創(chuàng)企宣布...
7月7日,德納股份有限公司(紐交所代碼:DAN)發(fā)布了適用于物料搬運的新型驅(qū)動技術(shù),包括適用于電驅(qū)動應(yīng)用的低電壓、高效能電機(jī),以及適用于I、IV和V系列工業(yè)叉車的模塊化、高效能的新系列驅(qū)動橋。新技術(shù)展示了德納如何向傳統(tǒng)車架螺栓連接以及整體集成電橋的叉車設(shè)計提供模塊化的系統(tǒng)。產(chǎn)品的多樣性有助于制造商降低系統(tǒng)復(fù)雜性,縮短開發(fā)以及引進(jìn)新品的時...
前言我們可以使用BDM設(shè)備很方便地?zé)龑憜纹瑱C(jī)程序、查看內(nèi)存、調(diào)試程序。但是反過來想,我辛辛苦苦寫的程序,寫的算法,別人不也可以使用BDM設(shè)備很方便的讀出來看么!雖然別人只能看到二進(jìn)制代碼,或者說匯編代碼,但是到底經(jīng)過分析還是能知道你的程序怎么寫的,這還得了!??!幸好,MC9S12(X)提供了加密功能(手冊上對應(yīng)Secure這個單詞),BDM是無法讀取處于...

史海拾趣

問答坊 | AI 解惑

中國數(shù)碼相機(jī)標(biāo)準(zhǔn)將出臺 功能大戰(zhàn)暫時落幕

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 編輯 中國數(shù)碼相機(jī)產(chǎn)量逐年增大,成全球市場主要生產(chǎn)基地。2009年,全球數(shù)碼相機(jī)出貨量約1.06億臺,據(jù)工業(yè)和信息化部對電子信息產(chǎn)品的統(tǒng)計顯示,2009年1-11月中國數(shù)碼相機(jī)產(chǎn)量為7296.8萬臺,測算200 ...…

查看全部問答∨

EVC安裝問題請教

我的pc上有安裝VS2005,現(xiàn)在想安裝EVC,安裝過程中出現(xiàn) encoutered a critical error的提示后,自動停止安裝。 不知道是什么原因。 聽說是和VS2005有沖突,必須先安裝EVC,在安裝VS2005。 不知道哪位同仁有遇到這個情況,有么有在不卸載VS2005的 ...…

查看全部問答∨

在windows下能不能用telent代替超級終端???

在開發(fā)板上調(diào)試u-boot和uclinux時,超級終端在那個框外的信息都給亂碼了,看不清楚,有沒有可以直接全部顯示的方法?或者用telent行不行?…

查看全部問答∨

請問哪里有win xp sp2 checked build下載?

因為要做xp xp2下面的驅(qū)動程序,需要xp sp2的checked build,請問哪里可以下載的到?謝謝?!?

查看全部問答∨

UCOSII源碼剖析

有做過 UCOSII 源碼剖析的嗎 有做過 UCGUI  開發(fā)的嗎…

查看全部問答∨

求教,MDK里面#include 的問題!老是找不到文件

最近有keil,編譯周立功的uCosii源程序的時候不報錯,但是我把他里面的所有文件復(fù)制到另外一個文件夾,然后新建一個工程,在MDK里將所有文件都加進(jìn)去,可是問題就出來了,老是出現(xiàn)下面的問題: error:  #5: cannot open source input fi ...…

查看全部問答∨

關(guān)于6416收發(fā)ttl電平的問題!

我現(xiàn)在用的是DEC-6416,需要發(fā)送和接收ttl電平(控制其他儀表) 我已經(jīng)打電話詢問過了,技術(shù)人員說可以通過RS232 來實現(xiàn),但是沒有例程提供 請問應(yīng)該怎么實現(xiàn)呢? …

查看全部問答∨

一個問題,新手學(xué)LaunchPad上的,G2231,以后用更高級的MSP430,代碼是不是差不多?

G2231資源少了。以后肯定得升級。我現(xiàn)在G2231都沒入門,就準(zhǔn)備買個msp430f149或者更新的元件,自己做個板子玩玩 問題是。 LaunchPad有仿真器,學(xué)起來可能會方便吧,盡管我不會用仿真器。 學(xué)會G2231再去整F149,程序是不是一樣的 那些寄存器什么 ...…

查看全部問答∨

學(xué)習(xí)PCB制作流程

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 編輯 PCB加工工 PCB(印刷電路板)的原料是玻璃纖維,這種材料我們在日常生活中出處可見,比如防火布、防火氈 的核心就是玻璃纖維,玻璃纖維很容易和樹脂相結(jié)合,我們把結(jié)構(gòu)緊密、強度高的玻纖布 ...…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved