99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

APM32F4 Flash模擬EEPROM介紹和代碼實(shí)現(xiàn)

Geehy極海半導(dǎo)體 ? 來源:Geehy極海半導(dǎo)體 ? 2023-12-01 17:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

《APM32芯得》系列內(nèi)容為用戶使用APM32系列產(chǎn)品的經(jīng)驗(yàn)總結(jié),均轉(zhuǎn)載自21ic論壇極海半導(dǎo)體專區(qū),全文未作任何修改,未經(jīng)原文作者授權(quán)禁止轉(zhuǎn)載。

1. Flash與EEPROM簡(jiǎn)介

1.1 Flash簡(jiǎn)介

Flash,又叫閃存。根據(jù)存儲(chǔ)單元電路的不同,分為NAND Flash和NOR Flash兩種。Nor Flash由于地址線和數(shù)據(jù)線是分開的,可以按字節(jié)讀寫數(shù)據(jù)。這種特性可以用來存儲(chǔ)和運(yùn)行代碼,MCU內(nèi)部的Flash就是一種NOR Flash。

但是無論是哪種Flash,他們寫之前必須先進(jìn)行擦除操作(因?yàn)橹荒軐?shù)據(jù)由1寫為0)。

1.2 EEPROM簡(jiǎn)介

EEPROM,Electrically Erasable Programmable Read Only Memory,即電可擦除可編程只讀存儲(chǔ)器,也是一種非易失性存儲(chǔ)區(qū)。EEPROM也是可以按字節(jié)讀寫數(shù)據(jù)的,但是寫入之前不需要先擦除數(shù)據(jù)。

1.3 Flash與EEPROM對(duì)比

Flash 與 EEPROM都屬于非易失性存儲(chǔ)器,他們都可以掉電保存數(shù)據(jù)。但他們也有很多的區(qū)別,下表列出了Flash與EEPROM的主要區(qū)別:

2b6de45c-902d-11ee-939d-92fbcf53809c.jpg

注:這里對(duì)比的Flash是MCU內(nèi)部的Flash

其實(shí),在Linux的設(shè)備驅(qū)動(dòng)歸類中,F(xiàn)lash其實(shí)是歸類到塊設(shè)備的,因?yàn)樗淖钚〔僮鲉卧巧葏^(qū)/塊,而EEPROM則是一種字符設(shè)備,最小操作單元是字節(jié)。

1.4 Flash模擬EEPROM的優(yōu)勢(shì)

節(jié)約成本,可減少EEPROM芯片的使用

讀寫速率快,MCU內(nèi)部的Flash讀寫速率要遠(yuǎn)遠(yuǎn)高于EEPROM

抗干擾能力強(qiáng),MCU內(nèi)部的Flash沒有使用I2C、SPI這類通訊總線,不存在這類總線被干擾的問題。

2. Flash模擬EEPROM原理

在前面的對(duì)比,我們可以了解到,F(xiàn)lash與EEPROM最大的區(qū)別就是:

Flash寫之前需要擦除

Flash與EEPROM一次操作的數(shù)據(jù)大小不同。雖然MCU內(nèi)部的Flash和EEPROM一樣,可以實(shí)現(xiàn)按字節(jié)的讀寫,但是在寫入的時(shí)候,是必須要先按扇區(qū)擦除的,這里也可以說相當(dāng)于是一次操作的數(shù)據(jù)大小不同。

那么,我們Flash模擬EEPROM主要是模擬實(shí)現(xiàn)什么呢?主要實(shí)現(xiàn)的關(guān)鍵點(diǎn)有:

無需用戶擦除即可按字節(jié)讀寫(擦除操作封裝在函數(shù)內(nèi)部)

擦除數(shù)據(jù)時(shí)不能改變?cè)瓉硪呀?jīng)存儲(chǔ)的數(shù)據(jù)(讀改寫策略)

盡量減少Flash擦除次數(shù),延長Flash壽命(擦除之前先判斷是否已經(jīng)是擦除狀態(tài))

具體如何實(shí)現(xiàn)?

讀操作

MCU內(nèi)部的Flash讀操作很簡(jiǎn)單,直接像內(nèi)存一樣讀即可。例如讀0x08000000地址處的數(shù)據(jù):

*(uint32_t *)0x08000000;

把0x08000000強(qiáng)制轉(zhuǎn)換為一個(gè)地址(指針),然后再解引用即可。

寫操作

由于Flash寫之前,都必須先要按照扇區(qū)進(jìn)行擦除,所以會(huì)麻煩一點(diǎn)。而且,擦除數(shù)據(jù)的時(shí)候,我們不能把原有的數(shù)據(jù)都給擦了,所以可以使用讀改寫的策略。

寫數(shù)據(jù)之前,先在RAM中開辟一個(gè)與扇區(qū)相同大小的緩沖區(qū)。然后把要寫的扇區(qū)數(shù)據(jù)讀到緩存中,然后在緩存中改寫數(shù)據(jù)。最后再擦除扇區(qū)(會(huì)進(jìn)行判斷,如果已經(jīng)是擦除狀態(tài),則無需再次擦除),再把數(shù)據(jù)寫到扇區(qū)。

3. APM32F4系列Flash模擬EEPROM難點(diǎn)

3.1 APM32F4 Flash存儲(chǔ)器結(jié)構(gòu)

我們先了解下APM32F4的Flash存儲(chǔ)結(jié)構(gòu):

2b988ce8-902d-11ee-939d-92fbcf53809c.jpg

我們主要看主存儲(chǔ)模塊,一共分為12個(gè)扇區(qū),最小的是前面4個(gè)扇區(qū)16KB,最大的扇區(qū)大小是128KB。

前面我們說過,F(xiàn)lash模擬EEPROM的一個(gè)關(guān)鍵點(diǎn)就是,在寫數(shù)據(jù)的時(shí)候,不能改變Flash原有的數(shù)據(jù)。而且,解決辦法就是在RAM中開辟一塊和Flash扇區(qū)同樣大小的緩沖區(qū)。

3.2 難點(diǎn)和解決辦法

難點(diǎn):

但問題是:APM32F4系列的RAM大小,給用戶使用的最大大小是128KB,和最大的Flash扇區(qū)大小是一樣大。我們不可能使用APM32F4后面的Flash扇區(qū),作為模擬EEPROM實(shí)現(xiàn)的空間,因?yàn)楦緵]有那么大的RAM空間作為緩存。

但也不能使用第一塊16KB的扇區(qū)大小進(jìn)行模擬,因?yàn)榈谝粋€(gè)扇區(qū)是MCU上電啟動(dòng)會(huì)自動(dòng)取指令的扇區(qū),如果這個(gè)區(qū)域存儲(chǔ)的不是合法的指令,那么會(huì)造成程序跑飛。

總結(jié)起來就是:

Flash扇區(qū)太大,導(dǎo)致RAM不足以開辟同樣大小的緩沖區(qū)

不能使用第一個(gè)扇區(qū),因?yàn)槟莻€(gè)扇區(qū)是MCU啟動(dòng)固定使用的

如何解決:

提供上面分析,能留給我們進(jìn)行Flash模擬EEPROM所使用的扇區(qū)就只有 1~3 這3個(gè)扇區(qū)符合要求。那么我們?nèi)绾问褂肍lash中間的扇區(qū)進(jìn)行實(shí)驗(yàn)?zāi)兀?/p>

我們可以定義一個(gè)const數(shù)組,然后使用編譯器屬性指定該數(shù)組在Flash的起始地址(比如我們指定起始地址就位于第1塊扇區(qū)的首地址),大小是用戶定義的Flash模擬EEPROM的大小。但是必須要必須要是扇區(qū)大小的整數(shù)倍。

代碼如下:

/* Specifies the start address of the sector. The purpose is to occupy a space at the specified address of MCU flash. */

static const uint8_t Flash_Para_Area[FLASH_EE_TOTAL_SIZE] __attribute__((section(".ARM.__at_0x08004000")));

/* The buffer that write or erase sector data */

static uint8_t Flash_EE_Ram_Buffer[FLASH_SECTOR_SIZE];

這個(gè)const的數(shù)組,其實(shí)在代碼中并沒有任何作用,它的目的就是占據(jù)這塊Flash空間,而不讓編譯器鏈接時(shí),把代碼鏈接到這塊區(qū)域,因?yàn)檫@塊區(qū)域是要用于用戶存儲(chǔ)數(shù)據(jù)的,在這個(gè)過程中可能會(huì)被擦除。

3.3 APM32F4 Flash的存儲(chǔ)區(qū)域規(guī)劃

進(jìn)過前面的分析和規(guī)劃,最終APM32F4 Flash的存儲(chǔ)區(qū)域劃分,如下圖:

2bae94d4-902d-11ee-939d-92fbcf53809c.jpg

第1~3這3個(gè)扇區(qū)可以劃分,作為Flash模擬EEPROM的區(qū)域,其他的扇區(qū)都是用于存放代碼的區(qū)域。

4. APM32F4系列Flash模擬EEPROM代碼介紹

可以先到Geehy官網(wǎng),下載F4系列的SDK,然后隨便復(fù)制其中一個(gè)例程,在該例程編寫Flash模擬EEPROM的代碼實(shí)現(xiàn)。

4.1 相關(guān)宏定義

/* flash sector satrt address */

#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* 16 Kbytes */

#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* 16 Kbytes */

#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* 16 Kbytes */

/* flash sector size */

#define FLASH_SECTOR_SIZE ((uint32_t)(1024 * 16))

/* flash emulation eeprom total size. This value must be a multiple of 16KB */

#define FLASH_EE_TOTAL_SIZE ((uint32_t)(1024 * 16 * 2))

/* flash emulation eeprom sector start address, it's must be sector aligned */

#define FLASH_EE_START_ADDR ADDR_FLASH_SECTOR_1

/* flash emulation eeprom sector start address */

#define FLASH_EE_END_ADDR (ADDR_FLASH_SECTOR_1 + FLASH_EE_TOTAL_SIZE)

FLASH_SECTOT_SIZE:定義的Flash的扇區(qū)大小。不同系列的MCU,扇區(qū)大小不一樣。

FLASH_EE_TOTAL_SIZE:Flash模擬EEPROM的Flash總大小,該大小必須是扇區(qū)大小的整數(shù)倍。在F4上最多也只有3*16KB總大小。

FLASH_EE_START_ADDR:Flash模擬EEPROM的Flash起始地址,起始地址是必須要扇區(qū)對(duì)齊的。即只能是扇區(qū)的起始地址。

4.2 讀寫接口函數(shù)

我們?cè)谑褂眠^程中,只需要使用讀數(shù)據(jù)、寫數(shù)據(jù)接口函數(shù)即可。

/*

* readAddr: 讀數(shù)據(jù)起始地址

* pData: 指針,指向保存讀出的數(shù)據(jù)的緩沖區(qū)

* len: 讀取數(shù)據(jù)的長度

*/

void Flash_EE_Read(uint32_t readAddr, uint8_t* pData, uint32_t len);

/*

* readAddr: 寫數(shù)據(jù)起始地址

* pData: 指針,指向需要寫入數(shù)據(jù)的緩沖區(qū)

* len: 寫入數(shù)據(jù)的長度

*/

void Flash_EE_Write(uint32_t writeAddr, uint8_t* pData, uint32_t len);

5. 另一種Flash模擬EEPROM方案介紹

前面介紹的,是Flash模擬EEPROM的其中一種方案。特點(diǎn)是直接對(duì)Flash進(jìn)行操作,但也是實(shí)現(xiàn)了對(duì)Flash按字節(jié)的讀寫操作,而且不會(huì)改變Flash原有的存儲(chǔ)數(shù)據(jù),而且還可以跨扇區(qū)進(jìn)行讀寫數(shù)據(jù)。

另外,還有另一種Flash模擬EEPROM的實(shí)現(xiàn)方案。

5.1 數(shù)據(jù)存儲(chǔ)格式

該方案需要使用至少兩塊相同的扇區(qū)/頁,使用至少兩個(gè)相同大小的扇區(qū)/頁,其中一個(gè)扇區(qū)處于有效狀態(tài),而另一個(gè)扇區(qū)處于擦除狀態(tài)。然后每4個(gè)字節(jié)分為:2字節(jié)data + 2字節(jié)virtual address 的存儲(chǔ)格式。具體數(shù)據(jù)存儲(chǔ)格式如下:

2bc9e0ea-902d-11ee-939d-92fbcf53809c.jpg

其中:

每個(gè)頁的第一個(gè)存儲(chǔ)區(qū),保存當(dāng)前的頁狀態(tài)。

flash address:就是MCU flash的實(shí)際地址,在代碼中并沒有使用到,只用到頁起始和結(jié)束地址。

data:用戶存儲(chǔ)的數(shù)據(jù)。

virtual address:對(duì)應(yīng)數(shù)據(jù)的虛擬地址,在讀數(shù)據(jù)時(shí),我們需要根據(jù)這個(gè)虛擬地址進(jìn)行尋址。

存儲(chǔ)變量的個(gè)數(shù):扇區(qū)大小 / 4 - 1。比如 2KB / 4 – 1 = 511,即最多可以存儲(chǔ)511個(gè)變量。

5.2 扇區(qū)/頁狀態(tài)

每個(gè)扇區(qū)/頁都有三種狀態(tài):

有效狀態(tài):該頁包含所有的有效數(shù)據(jù),讀寫數(shù)據(jù)在該頁進(jìn)行

擦除狀態(tài):就是一個(gè)空的頁

數(shù)據(jù)傳輸狀態(tài):當(dāng)一個(gè)頁寫滿時(shí),把已經(jīng)寫滿的頁的有效數(shù)據(jù)復(fù)制到本頁的狀態(tài)

5.3 數(shù)據(jù)更新過程

該方案有數(shù)據(jù)讀、寫、轉(zhuǎn)移三種過程:

寫數(shù)據(jù):從頁起始地址開始尋址,找到第一個(gè)已經(jīng)被擦除的區(qū)域(比如前面的數(shù)據(jù)存儲(chǔ)格式的圖片,flash address = 24的位置),然后把數(shù)據(jù)和對(duì)應(yīng)的虛擬地址一起寫入。當(dāng)?shù)诙胃膶懲惶摂M地址處的值時(shí),會(huì)在Flash新的位置,存儲(chǔ)該虛擬地址的值。比如比如前面圖片的flash address = 20的地址處,存儲(chǔ)的虛擬地址是0x7777,是第二次出現(xiàn)的虛擬地址,修改數(shù)據(jù)就是會(huì)這樣在新的位置存儲(chǔ)新的值。其中最后一次存儲(chǔ)的數(shù)據(jù),才是有效數(shù)據(jù)。

讀數(shù)據(jù):從頁結(jié)束地址開始尋址,找到對(duì)應(yīng)地址最后一次改變的數(shù)據(jù)(其實(shí)就是有效數(shù)據(jù))。比如前面的數(shù)據(jù)存儲(chǔ)格式的圖片,有兩個(gè)0x7777地址對(duì)應(yīng)的數(shù)據(jù),只會(huì)返回最后一次改變的數(shù)據(jù)。

數(shù)據(jù)轉(zhuǎn)移:當(dāng)頁0寫滿時(shí),會(huì)把該頁的有效數(shù)據(jù)全部復(fù)制到另外一個(gè)空頁(頁1)。然后再擦除頁0,把頁1標(biāo)記為有效狀態(tài),再頁1繼續(xù)寫數(shù)據(jù)。

6. 后續(xù)補(bǔ)充

目前,我只實(shí)現(xiàn)了Flash模擬EEPROM第一種方法的代碼。這里留個(gè)坑,我后續(xù)會(huì)實(shí)現(xiàn)APM32F4系列的第二種Flash模擬EEPROM的代碼。

如果還有時(shí)間的話,把APM32F1系列的MCU,也一起實(shí)現(xiàn)了Flash模擬EEPROM的代碼吧。

反正暫且先留個(gè)坑吧。

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

    關(guān)注

    9

    文章

    1086

    瀏覽量

    83788
  • 數(shù)據(jù)線
    +關(guān)注

    關(guān)注

    8

    文章

    298

    瀏覽量

    42780
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70776

原文標(biāo)題:APM32芯得 EP.26 | APM32F4 Flash模擬EEPROM介紹和代碼實(shí)現(xiàn)

文章出處:【微信號(hào):geehysemi,微信公眾號(hào):Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于APM32F407如何制作I2C EEPROM(AT24C02型號(hào))的MDK-Keil下載算法

    基于APM32F407如何制作I2C EEPROM(AT24C02型號(hào))的Keil下載算法,這樣在我們下載代碼時(shí)可以一鍵把數(shù)據(jù)燒錄到EEPROM中。
    的頭像 發(fā)表于 04-11 11:06 ?1217次閱讀
    基于<b class='flag-5'>APM32F</b>407如何制作I2C <b class='flag-5'>EEPROM</b>(AT24C02型號(hào))的MDK-Keil下載算法

    FLASH模擬EEPROM

    原理介紹 前幾章節(jié)所敘述的 FLASH 模擬 EEPROM 機(jī)制,在存儲(chǔ)少量數(shù)據(jù)時(shí)具有使用便捷、存儲(chǔ)可靠的優(yōu)點(diǎn)。但是在存儲(chǔ)大量數(shù)據(jù)或者想實(shí)現(xiàn)
    發(fā)表于 07-16 15:13

    如何利用STM32的FLASH模擬EEPROM

    ;不過FLASH的容量還是可觀的,我們可以利用FLASH模擬EEPROM。根據(jù)《STM32F10X閃存編程》中的
    發(fā)表于 12-09 07:13

    使用STM32F10x片內(nèi)的Flash存儲(chǔ)器實(shí)現(xiàn)軟件模擬EEPROM的方法

    本文檔適用于STM32F1系列微控制器。介紹了外部EEPROM和嵌入式Flash存儲(chǔ)器之間的不同,描述了使用STM32F10x片內(nèi)的
    發(fā)表于 12-01 06:16

    STM32 FLASH模擬EEPROM資料

    STM32 FLASH模擬EEPROM資料,mcu,單片機(jī)相關(guān)的知識(shí)及內(nèi)容。
    發(fā)表于 03-10 17:14 ?19次下載

    N76E003的EEPROM問題解決方案:使用Data Flash模擬EEPROM

    介紹如何使用Data Flash模擬EEPROM,并且利用SRAM加速 資料讀寫的速度。內(nèi)容包含原理介紹、性能數(shù)據(jù)以及使用建議。附 錄提供范
    發(fā)表于 07-30 09:28 ?29次下載
    N76E003的<b class='flag-5'>EEPROM</b>問題解決方案:使用Data <b class='flag-5'>Flash</b><b class='flag-5'>模擬</b><b class='flag-5'>EEPROM</b>

    STM32F103C8T6使用內(nèi)部Flash的第63頁保存參數(shù)

    ;不過FLASH的容量還是可觀的,我們可以利用FLASH模擬EEPROM。根據(jù)《STM32F10X閃存編程》中的
    發(fā)表于 11-26 16:51 ?23次下載
    STM32<b class='flag-5'>F</b>103C8T6使用內(nèi)部<b class='flag-5'>Flash</b>的第63頁保存參數(shù)

    實(shí)現(xiàn)簡(jiǎn)單的SPI讀寫FLASH

    實(shí)現(xiàn)簡(jiǎn)單的SPI讀寫FLASH一、前言繼上篇文章SPI的相關(guān)知識(shí),本章主要介紹使用SPI協(xié)議實(shí)現(xiàn)簡(jiǎn)單的讀寫FLASH,寫入功能主要
    發(fā)表于 11-26 19:21 ?23次下載
    <b class='flag-5'>實(shí)現(xiàn)</b>簡(jiǎn)單的SPI讀寫<b class='flag-5'>FLASH</b>

    STM32F103:內(nèi)部Flash模擬EEPROM

    的內(nèi)部Flash模擬EEPROM實(shí)現(xiàn)可以多次擦寫,掉電又可以保存數(shù)據(jù)的功能。二、原理1. STM32F103系列芯片按內(nèi)部
    發(fā)表于 12-02 11:36 ?34次下載
    STM32<b class='flag-5'>F</b>103:內(nèi)部<b class='flag-5'>Flash</b><b class='flag-5'>模擬</b><b class='flag-5'>EEPROM</b>

    APM32F103RCT6_Flash_擦寫失敗

    APM32F103RCT6_Flash_擦寫失敗
    發(fā)表于 11-09 21:03 ?1次下載
    <b class='flag-5'>APM32F103RCT6_Flash</b>_擦寫失敗

    APM32F407ZGT6_Flash_在地址中重復(fù)寫入相同字節(jié),代碼不跑

    APM32F407ZGT6_Flash_在地址中重復(fù)寫入相同字節(jié),代碼不跑
    發(fā)表于 11-09 21:03 ?1次下載
    <b class='flag-5'>APM32F407ZGT6_Flash</b>_在地址中重復(fù)寫入相同字節(jié),<b class='flag-5'>代碼</b>不跑

    APM32F030C8T6_Flash_Flash讀寫設(shè)計(jì)注意事項(xiàng)

    APM32F030C8T6_Flash_Flash讀寫設(shè)計(jì)注意事項(xiàng)
    發(fā)表于 11-09 21:03 ?3次下載
    <b class='flag-5'>APM32F030C8T6_Flash_Flash</b>讀寫設(shè)計(jì)注意事項(xiàng)

    APME103 EEPROM仿真代碼實(shí)現(xiàn)

    本應(yīng)用筆記描述了一種通過使用 APM32 器件的片上閃存模擬 EEPROM 機(jī)制來替代 EEPROM 的軟件解決方案。
    發(fā)表于 06-21 15:25 ?0次下載
    APME103 <b class='flag-5'>EEPROM</b>仿真<b class='flag-5'>代碼</b><b class='flag-5'>實(shí)現(xiàn)</b>

    使用MCU Flash模擬EEPROM

    使用MCU Flash模擬EEPROM
    的頭像 發(fā)表于 10-18 18:01 ?947次閱讀

    stm32f103 flash模擬eeprom

    ,STM32F103的Flash存儲(chǔ)器可以模擬EEPROM的功能,在本文中我們將詳細(xì)介紹如何使用STM32
    的頭像 發(fā)表于 01-09 11:21 ?2832次閱讀