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

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

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

STM8S_ 007_片內(nèi)FLASH和EEPROM編程

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 2020-03-20 10:00 ? 次閱讀

寫在前面 Ⅰ

我們都知道FLASH和EEPROM這兩種存儲器,但是大部分人了解的都是專門的FLASH和EEPROM芯片,如:W25Q16和ATAT24C08(外部)儲存芯片。

外部存儲芯片和本文說的內(nèi)部FLASH和EEPROM最大的區(qū)別就是在于:內(nèi)部FLASH和EEPROM是不需要SPI、I2C等進(jìn)行操作,也就是說同等情況下,內(nèi)部FLASH和EEPROM的讀寫要快一點(diǎn)。

STM8的FLASH除了儲存程序代碼之外,就是用于用戶編程(存儲數(shù)據(jù)),不像之前的51芯片不能利用內(nèi)部儲存代碼的FLASH。

為方便大家閱讀,本文內(nèi)容已經(jīng)整理成PDF文件:

http://pan.baidu.com/s/1i5uWhJR

片內(nèi)FLASH和EEPROM基礎(chǔ)知識 Ⅱ

STM8內(nèi)部的FLASH程序存儲器和數(shù)據(jù)EEPROM由一組通用寄存器來控制。用戶可以使用這些寄存器來編程或擦除存儲器的內(nèi)容、設(shè)置寫保護(hù)、或者配置特定的低功耗模式。用戶也可以對器件的選項(xiàng)字節(jié)(Option byte)進(jìn)行編程。

1.關(guān)于存儲的名詞

塊(BLOCK):一個(gè)塊是指可由一個(gè)簡單編程操作編程或擦除的一組字節(jié)。塊級的操作非???,是標(biāo)準(zhǔn)的編程和擦除操作。請參考表4來了解塊的大小。

頁(PAGE):一頁由一組塊組成。 STM8S 器件擁有啟動代碼,程序代碼和數(shù)據(jù)EEPROM,這些區(qū)域都由特定的結(jié)構(gòu)所保護(hù)。通過對特定的選項(xiàng)字節(jié)進(jìn)行操作,這些區(qū)域的大小能夠以頁為單位來進(jìn)行調(diào)整。

2.主要特性

● STM8S分為兩個(gè)存儲器陣列:

─ 最多至 128K字節(jié)的FLASH程序存儲器,不同的器件容量有所不同。

─ 最多至 2K字節(jié)的數(shù)據(jù)EEPROM(包括option byte-選擇字節(jié)),不同的器件容量有所不同。

● 編程模式

─ 字節(jié)編程和自動快速字節(jié)編程(沒有擦除操作)

─ 字編程

─ 塊編程和快速塊編程(沒有擦除操作)

─ 在編程/擦除操作結(jié)束時(shí)和發(fā)生非法編程操作時(shí)產(chǎn)生中斷

● 讀同時(shí)寫(RWW)功能。該特性并不是所有STM8S器件都擁有。請參考具體的數(shù)據(jù)手冊了解更多細(xì)節(jié)。

● 在應(yīng)用編程(IAP)和在線編程(ICP)能力。

● 保護(hù)特性

─ 存儲器讀保護(hù)(ROP)

─ 基于存儲器存取安全系統(tǒng)(MASS 密鑰)的程序存儲器寫保護(hù)

─ 基于存儲器存取安全系統(tǒng)(MASS 密鑰)的數(shù)據(jù)存儲器寫保護(hù)

─ 可編程的用戶啟動代碼區(qū)域(UBC)寫保護(hù)

● 在待機(jī)(Halt)模式和活躍待機(jī)(Active-halt)模式下,存儲器可配置為運(yùn)行狀態(tài)和掉電狀態(tài)。

3.存儲器組織結(jié)構(gòu)

STM8S的EEPROM以32位字長(每字4字節(jié))為基礎(chǔ)組織起來。根據(jù)不同的器件,存儲器組織機(jī)構(gòu)有所不同:

●小容量STM8S器件

─ 8K FLASH 程序存儲器,每頁 64 字節(jié),共 128 頁

─ 640 字節(jié)數(shù)據(jù) EEPROM,每頁 64 字節(jié),共 10 頁。數(shù)據(jù) EEPROM 包括一頁的選項(xiàng)字節(jié)(64字節(jié))。

●中容量STM8S器件

─ 從 16K 到 32K FLASH 程序存儲器,每頁 512 字節(jié),最多64頁

─ 1K 字節(jié)數(shù)據(jù) EEPROM,每頁 512 字節(jié),共 2 頁。數(shù)據(jù) EEPROM 包括一頁的選項(xiàng)字節(jié)(512 字節(jié))。

●大容量STM8S器件

─ 從 64K 到 128K FLASH 程序存儲器,每頁 512 字節(jié),最多256頁

─ 從 1K 到 2K 字節(jié)數(shù)據(jù) EEPROM,每頁 512 字節(jié),共 4 頁。數(shù)據(jù) EEPROM 包括一頁的選項(xiàng)字節(jié)(512 字節(jié))。

4.存儲器編程

在嘗試執(zhí)行任何編程操作之前,必須對主程序存儲器FLASH和DATA區(qū)域解鎖。

編程分類:字節(jié)編程、字編程、塊編程和選項(xiàng)字節(jié)編程。

字節(jié)編程

可以對主程序存儲器和DATA區(qū)域逐字節(jié)地編程。要對一個(gè)字節(jié)編程,應(yīng)用程序可直接向目標(biāo)地址寫入數(shù)據(jù)。

● 在主程序存儲器中

當(dāng)字節(jié)編程操作執(zhí)行時(shí),應(yīng)用程序停止運(yùn)行。

● 在DATA區(qū)域中

─ 有 RWW 功能的器件:在 IAP 模式下,應(yīng)用程序不停止運(yùn)行,字節(jié)編程進(jìn)行操作。

─ 無 RWW 功能的器件:當(dāng)字節(jié)編程操作執(zhí)行時(shí),應(yīng)用程序停止運(yùn)行。

要擦除一個(gè)字節(jié),向?qū)?yīng)的字節(jié)簡單寫入’0x00即可。

應(yīng)用程序可以通過讀FLASH_IAPSR寄存器來校驗(yàn)編程或擦除操作是否已被正確執(zhí)行:

● 在一次成功的編程操作后EOP位被置1。

● 當(dāng)軟件試圖對一個(gè)被保護(hù)的頁進(jìn)行寫操作時(shí)WP_PG_DIS位被置1。在這種情況下,寫操作不會被執(zhí)行。

如果FLASH_CR1中的IE位已經(jīng)被預(yù)先使能,則只要這些標(biāo)志位(EOP/WP_PG_DIS)中有一個(gè)被置位就會產(chǎn)生一個(gè)中斷。

字編程

字寫入操作允許一次對整個(gè)4字節(jié)的字進(jìn)行編程,從而將編程時(shí)間縮短。

主程序存儲器和DATA EEPROM都可以進(jìn)行字操作。在一些STM8S器件中,也擁有當(dāng)EEPROM在進(jìn)行寫操作時(shí)同時(shí)具備RWW功能。

塊編程

塊編程比字節(jié)編程和字編程都要快。在塊編程操作中,整個(gè)塊的編程或擦除在一個(gè)編程周期就可以完成。

在主程序存儲器FLASH和DATA區(qū)域都可以執(zhí)行塊操作。

● 在主程序存儲器中

用于塊編程的代碼必須全部在RAM中執(zhí)行。

● 在DATA區(qū)域中

─ 有RWW功能的器件: DATA 塊操作可在主程序存儲器中執(zhí)行,然而數(shù)據(jù)裝載階段必須在RAM中執(zhí)行。

─ 無RWW功能的器件:用于塊編程的代碼必須全部在RAM中執(zhí)行。

一共有三種可能的塊操作:

● 塊編程(也叫標(biāo)準(zhǔn)塊編程):整個(gè)塊在編程前被自動擦除。

● 快速塊編程:在編程前沒有預(yù)先的塊擦除操作。

● 塊擦除。

在塊編程時(shí),中斷被硬件自動屏蔽。

標(biāo)準(zhǔn)塊編程

塊編程操作允許一次對整個(gè)塊進(jìn)行編程,整個(gè)塊在編程前被自動擦除。

快速塊編程

快速塊編程允許不擦除存儲器內(nèi)容就對塊進(jìn)行編程,因此快速塊編程的編程速度是標(biāo)準(zhǔn)塊編程的兩倍。

警告: 在執(zhí)行快速塊編程之前如果這個(gè)塊不是空的話,不能保證寫入的數(shù)據(jù)無誤。

選項(xiàng)字節(jié)(Option byte)編程

對選項(xiàng)字節(jié)編程和對DATA EEPROM區(qū)域編程非常相似。

應(yīng)用程序可直接向目標(biāo)地址進(jìn)行寫操作。利用STM8的RWW功能,在對選項(xiàng)字節(jié)寫操作的同時(shí)程序不必停下來。

軟件工程源代碼 Ⅲ

1、關(guān)于工程

本文提供的工程代碼是基于前面軟件工程“STM8S-A04_UART基本收發(fā)數(shù)據(jù)”增加FLASH修改而來。初學(xué)的朋友可以參看我前面對應(yīng)的基礎(chǔ)文章,那些文章講的比較詳細(xì)。

工程源代碼主要實(shí)現(xiàn)功能:寫入FLASH或EEPROM并讀取寫入的數(shù)據(jù),通過UART打印來觀察讀取的數(shù)據(jù)是否和寫入的一直。

提供兩個(gè)工程:STM8S-A07_內(nèi)部FLASH編程和STM8S-A07_內(nèi)部EEPROM編程

這兩個(gè)工程需要注意讀寫操作的地址不同,見下圖:

本文重點(diǎn)的函數(shù)接口:

FLASH_WriteNByte:FLASH寫N字節(jié)

FLASH_ReadNByte: FLASH讀N字節(jié)

EEPROM_WriteNByte:EEPROM寫N字節(jié)

EEPROM_ReadNByte:EEPROM讀N字節(jié)

2.代碼分析說明

A.FLASH_WriteNByte:FLASH寫N字節(jié)

void FLASH_WriteNByte(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t nByte)

{

FLASH_Unlock(FLASH_MEMTYPE_PROG);

while(FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET);

while(nByte--)

{

FLASH_ProgramByte(WriteAddr, *pBuffer);

WriteAddr++;

pBuffer++;

FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);

}

FLASH_Lock(FLASH_MEMTYPE_PROG);

}

這里需要注意:1.寫之前解鎖,寫完需要上鎖;2.我們提供的代碼是字節(jié)操作,因此,每次操作需要“等待上次寫操作完成”。

B.FLASH_ReadNByte:FLASH讀N字節(jié)

void FLASH_ReadNByte(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t nByte)

{

while(nByte--)

{

*pBuffer = FLASH_ReadByte(ReadAddr);

ReadAddr++;

pBuffer++;

}

}

讀操作一般都很簡單,不管是讀FLASH還是EEPROM,基本上操作都類似。為什么我們買的U盤讀取速度遠(yuǎn)大于寫的速度,原因就在這里。

C.EEPROM_WriteNByte:EEPROM寫N字節(jié)

void EEPROM_WriteNByte(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t nByte)

{

FLASH_Unlock(FLASH_MEMTYPE_DATA);

while(FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);

while(nByte--)

{

FLASH_ProgramByte(WriteAddr, *pBuffer);

WriteAddr++;

pBuffer++;

FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

}

FLASH_Lock(FLASH_MEMTYPE_DATA);

}

和FLASH的寫對比,可以看得出來,他們之間的差別在于參數(shù):FLASH_MEMTYPE_DATA.

D.EEPROM_ReadNByte:EEPROM讀N字節(jié)

void EEPROM_ReadNByte(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t nByte)

{

while(nByte--)

{

*pBuffer = FLASH_ReadByte(ReadAddr);

ReadAddr++;

pBuffer++;

}

}

E.main函數(shù)讀寫驗(yàn)證

FLASH_WriteNByte(WriteBuf, FLASH_ADDR, BUF_SIZE);

TIMDelay_Nms(500);

FLASH_ReadNByte(ReadBuf, FLASH_ADDR, BUF_SIZE);

UART1_SendNByte(ReadBuf, BUF_SIZE);

通過UART打印“讀BUF”的數(shù)據(jù),可以看得出來,我們從FLASH中寫入的數(shù)據(jù)是否正確。

兩個(gè)工程代碼實(shí)現(xiàn)功能都一樣,注意地址。

打印數(shù)據(jù)如下:

00 00 00 00 00 00 00 00 00 00(打印未讀寫操作之前的“讀BUF”數(shù)據(jù))

41 31 42 32 43 33 44 34 45 35(十六進(jìn)制顯示)

A1B2C3D4E5(字符形式顯示)

下載

STM8S資料

http://pan.baidu.com/s/1o7Tb9Yq

軟件源代碼工程(STM8S-A07_內(nèi)部xxx編程):

http://pan.baidu.com/s/1c2EcRo0

提示:如果網(wǎng)盤鏈接失效,可以微信公眾號“底部菜單”查看更新鏈接。

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

    關(guān)注

    10

    文章

    1598

    瀏覽量

    147331
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1002

    瀏覽量

    81054
  • STM8S
    +關(guān)注

    關(guān)注

    16

    文章

    149

    瀏覽量

    31271
收藏 人收藏

    評論

    相關(guān)推薦

    EEPROMFlash存儲器的區(qū)別

    編程只讀存儲器)和Flash存儲器是兩種常見的非易失性存儲器,它們具有各自的特點(diǎn)和應(yīng)用場景。本文將深入分析和比較EEPROMFlash存儲器的原理、結(jié)構(gòu)、性能以及應(yīng)用,以期為讀者提
    的頭像 發(fā)表于 05-23 16:35 ?3572次閱讀

    STM8S003F3P6操作EEPROM會影響FLASH嗎?

    各位前輩好,想請教一下,STM8S003F3P6操作EEPROM會影響FLASH嗎(具體的讀寫程序已經(jīng)寫完,只是擔(dān)心會影響FLASH,因?yàn)?b class='flag-5'>FLASH
    發(fā)表于 05-21 06:36

    STM8s 003 EEPROM斷電后不保存,eeprom數(shù)據(jù)被清零的原因?

    STM8s003EEPROM 斷電后不保存怎么回事,eeprom數(shù)據(jù)被清零 void EEPROM(void) { p = (unsigned char *)0x4000; //指針p指向芯片
    發(fā)表于 05-13 06:01

    STM8S903K3定義@eeprom不能編譯通過的原因?

    STM8S903K3定義了@eeprom unsigned char memorySecurity[] = { 0b00000111, 0xff, 0xff, 0xff }; 然后編譯通不過
    發(fā)表于 05-07 06:30

    通用bootloader選“支持spi flash”,無論設(shè)定download為內(nèi)還是flash啟動都找不到at45db161,為什么?

    通用bootloader不選“支持spi flash”,download放于內(nèi)flash,正常啟動,ota正常,app驅(qū)動at45db161讀寫正常。通用bootloader選“支持
    發(fā)表于 03-22 07:45

    FLASH、EEPROM的區(qū)別和擴(kuò)展【硬件干貨】

    EEPROMFLASH總體差異 ????部分MCU內(nèi)不帶程序存儲器ROM,可執(zhí)行代碼只能放在外面的EEPROM、
    的頭像 發(fā)表于 02-27 08:37 ?1404次閱讀
    <b class='flag-5'>FLASH</b>、<b class='flag-5'>EEPROM</b>的區(qū)別和擴(kuò)展【硬件干貨】

    stm32f103 flash模擬eeprom

    ,STM32F103的Flash存儲器可以模擬EEPROM的功能,在本文中我們將詳細(xì)介紹如何使用STM32F103的Flash存儲器來實(shí)現(xiàn)EEPROM。 概述
    的頭像 發(fā)表于 01-09 11:21 ?1626次閱讀

    eepromflash的區(qū)別的作用

    等方面。在本文中,我們將詳細(xì)探討EEPROMFlash Memory的作用和區(qū)別。 EEPROM是一種可編程讀寫存儲器。它使用一種特殊的電子器件來存儲和擦除信
    的頭像 發(fā)表于 12-07 16:10 ?1626次閱讀

    用STM32_FLASH模擬實(shí)現(xiàn)EEPROM功能

    在工業(yè)應(yīng)用中經(jīng)常使用EEPROM來存儲數(shù)據(jù),為降低成本、節(jié)省PCB空間,外部EEPROM可以用內(nèi)Flash加上特定的軟件算法代替。
    的頭像 發(fā)表于 10-23 17:40 ?2426次閱讀
    用STM32_<b class='flag-5'>FLASH</b>模擬實(shí)現(xiàn)<b class='flag-5'>EEPROM</b>功能

    FLASH模擬EEPROM入門指南

    FLASH模擬EEPROM入門指南使用AT32 的FLASH 模擬EEPROM 功能。
    發(fā)表于 10-19 06:10

    使用MCU Flash模擬EEPROM

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

    如何對STM8S和STM8A閃存程序存儲器和數(shù)據(jù)EEPROM進(jìn)行編程

    電子發(fā)燒友網(wǎng)站提供《如何對STM8S和STM8A閃存程序存儲器和數(shù)據(jù)EEPROM進(jìn)行編程.pdf》資料免費(fèi)下載
    發(fā)表于 10-07 16:05 ?1次下載
    如何對STM<b class='flag-5'>8S</b>和STM<b class='flag-5'>8</b>A閃存程序存儲器和數(shù)據(jù)<b class='flag-5'>EEPROM</b>進(jìn)行<b class='flag-5'>編程</b>

    如何使用Flash模擬EEPROM存儲參數(shù)

    概述在MCU的使用中,經(jīng)常遇到需要存儲參數(shù)或掉電保持?jǐn)?shù)據(jù)等功能。其中,FlashEEPROM是常見的非易失性存儲器,都可以做到設(shè)備掉電重啟后,數(shù)據(jù)還會保留。但二者有明顯的區(qū)別:EEPROM可以被
    的頭像 發(fā)表于 09-22 08:19 ?1410次閱讀
    如何使用<b class='flag-5'>Flash</b>模擬<b class='flag-5'>EEPROM</b>存儲參數(shù)

    基于HPM6000系列芯片如何使用Flash模擬EEPROM存儲參數(shù)

    概 述 在MCU的使用中,經(jīng)常遇到需要存儲參數(shù)或掉電保持?jǐn)?shù)據(jù)等功能。其中,FlashEEPROM是常見的非易失性存儲器,都可以做到設(shè)備掉電重啟后,數(shù)據(jù)還會保留。但二者有明顯的區(qū)別:EEPROM可以
    的頭像 發(fā)表于 09-21 09:15 ?1351次閱讀

    如何使用Flash模擬EEPROM存儲參數(shù)?

    在MCU的使用中,經(jīng)常遇到需要存儲參數(shù)或掉電保持?jǐn)?shù)據(jù)等功能。其中,FlashEEPROM是常見的非易失性存儲器
    的頭像 發(fā)表于 09-21 09:14 ?1240次閱讀