一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

如何讓內(nèi)部FLASH“支持”字節(jié)操作

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2022-02-10 11:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一般32位單片機的內(nèi)部FALSH是不支持字節(jié)操作的,有的可以按字節(jié)讀取,但是不能按字節(jié)寫入。

而且,一般單片機內(nèi)部FALSH擦除的最小單位都是頁,如果向某頁中的某個位置寫入數(shù)據(jù),恰好這個位置的前面存了其他數(shù)據(jù),那么就必須把這頁擦除,存的其他數(shù)據(jù)也會丟失。

實際上就是說內(nèi)部的FALSH不好做改寫的操作,如果有很多數(shù)據(jù)需要存放,最好是分頁存儲。這也是FALSH與E2PROM最大的區(qū)別,后者支持按字節(jié)操作且無需擦除,即使某一個地址寫壞了,也不影響其他地址。

下面介紹一種方法讓內(nèi)部FLASH“支持”字節(jié)操作,且同一頁的其他數(shù)據(jù)不受影響。

方法原理很簡單,下面簡單介紹下原理:

1.根據(jù)要寫入地址,計算出該地址位于哪一頁;

2.讀出整個頁,存入緩存BUF;

3.將要寫入的數(shù)據(jù)按位置更新到BUF中;

4.擦除該頁;

5.寫入整個BUF。

可以看出這種方法弊端很明顯:

1.耗時長 每次寫都要讀整個BUF,然后還要先把數(shù)據(jù)存到BUF里,然后再寫入整個BUF;

2.FALSH擦寫次數(shù)增加,降低使用壽命;

下面給出測試代碼:

#include

#include

#include //C語言標準庫

#include “flash.h”

#define USER_FLASH_START_ADDR 0x01070000 //FLASH最后兩個扇區(qū) 供用戶使用

u32tou8 u32data;//定義一個聯(lián)合體

//==================================================================================

// 獲取某個地址所在的頁首地址

// addr:FLASH地址

// 返回:該地址所在的頁 共128頁(0~127)

//==================================================================================

unsigned int FLASH_GetFlashPage(unsigned int addr)

{

if (IS_FLASH_ADDRESS(addr))

{

return (addr&(~0xFFF));//清0低12位就是該頁的起始地址

}

}

//==================================================================================

// 從FLASH中讀取 一個字(32位)

// addr:讀取地址

// 返回: 讀到的字數(shù)據(jù)

//備注: 地址為4字節(jié)對齊

//==================================================================================

unsigned int FLSAH_ReadWord(unsigned int addr)

{

return (*(unsigned int *)addr);

}

//==================================================================================

//從FLASH指定地址 讀取數(shù)據(jù)

//備注: 讀取數(shù)據(jù)類型為32位 讀取地址為4字節(jié)對齊

//==================================================================================

void FLASH_Read(unsigned int ReadAddr,unsigned char *pBuffer,unsigned int NumToRead)

{

unsigned int i;

u32tobyte cache;

for(i=0; iRO = 0;//去掉所有扇區(qū)寫保護

//==================================================================================

// 判斷寫入地址是否非法 起始地址或者結(jié)束地址不在FALSH范圍內(nèi)則退出

//==================================================================================

if(?。↖S_FLASH_ADDRESS(startaddr)&& IS_FLASH_ADDRESS(endaddr))) return FLASH_ERROR_PG;

while(startaddr remain)//需要寫入的數(shù)據(jù)量大于緩沖buf剩余字節(jié)數(shù)

{

for(i=index;i《4096;i++)//將需要寫入FALSH的數(shù)據(jù)寫入緩沖buff

{

buffer[i]=*(pBuffer++);

}

NumToWrite-=remain;//需要寫入的數(shù)據(jù)長度-本次已經(jīng)寫入的數(shù)據(jù)長度

startaddr+=remain;//地址向后偏移本次寫入的字節(jié)數(shù)

}

else

{

for(i=index;i

其中還有個聯(lián)合體的定義:typedef union

{

unsigned int data;

unsigned char buf[4];

}

u32tou8;FLASH_ErasePage、FLASH_ProgramWord、IS_FLASH_ADDRESS 這三個都是單片機FLASH的庫函數(shù)各家單片機不同,但功能基本相同,這里不再提供源碼。最后提供以下兩個FLASH接口即可:FLASH_Write(unsigned int WriteAddr,unsigned char *pBuffer,unsigned int NumToWrite);

FLASH_Read(unsigned int ReadAddr,unsigned char *pBuffer,unsigned int NumToRead)演示:1.為方便查看結(jié)果,測試從0x1070FFC的位置開始寫入數(shù)據(jù),F(xiàn)LASH地址分布如下圖所示:這里展示了FLASH連續(xù)兩頁的地址,首先將這兩頁全部擦除。

100059523-115019-1.jpg

100059523-115020-2.jpg

2.接著從1070FFC的位置開始寫入56個1,這樣就保證了數(shù)據(jù)跨越了1頁。unsigned char write[]= {“1111111111111111111111111111111111111111111111111111111111111111111111111111111111111”};

FLASH_Write(0x01070FFC,write,sizeof(write));

100059523-115021-3.jpg

注意:最后的00是因為字符串的結(jié)尾字符是“/0”3.緊接著,在0x1070FFE位置寫入新的字符串,也要保證寫入長度跨越1頁。unsigned char write2[]={“23456789”};

FLASH_Write(0x01070FFE,write2,sizeof(write2));

100059523-115022-4.jpg

可以看出,0x1070FFE~0x1071006的位置被寫入了新的字節(jié),但這兩頁的其他位置數(shù)據(jù)保持不變??偨Y(jié):1、實際使用時,如果不是受限于成本或者FLASH大小,不建議這樣讀寫內(nèi)部FLASH,以為stm32內(nèi)部FLASH也就10W次壽命,這樣頻繁擦寫會大大降低FLASH壽命。2、如果保存的數(shù)據(jù)不多,建議每個數(shù)據(jù)都單獨存1頁,這樣不用考慮擦除時會把其他數(shù)據(jù)也一并擦除。版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。本文鏈接:https://blog.csdn.net/qq_24835087/article/details/103541322審核編輯:何安

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

    關(guān)注

    6067

    文章

    44997

    瀏覽量

    650727
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1679

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    FLASH模擬EEPROM

    于使用 I2C 或者 SPI 通訊的 EEPROM 元件; ― 抗干擾能力強:由于 FLASH 在單片機內(nèi)部,不會存在通訊總線被外部干擾的問題; ― 容量可調(diào):可根據(jù)實際使用,靈活調(diào)整存儲空間大小。 2
    發(fā)表于 07-16 15:13

    hpm6364內(nèi)部flash使用時的openocd配置問題.

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

    第二十九章 讀寫內(nèi)部FLASH

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

    如何通過SFL為設(shè)備添加Flash編程支持

    SEGGER Flash Loader(SFL)是J-Link設(shè)備支持套件(DSK)的一部分,通過SFL,用戶可以為自己的新設(shè)備添加Flash編程支持
    的頭像 發(fā)表于 05-19 16:35 ?574次閱讀
    如何通過SFL為設(shè)備添加<b class='flag-5'>Flash</b>編程<b class='flag-5'>支持</b>

    MCU片上Flash

    保留能力,支持多次擦寫操作,是MCU程序存儲的核心介質(zhì)。 主要類型? NOR Flash?:支持隨機訪問,可直接運行代碼,適用于實時性要求高的場景。 NAND
    的頭像 發(fā)表于 05-06 14:26 ?359次閱讀

    調(diào)試時Memory窗口中Flash內(nèi)容不更新的原因和解決辦法

    調(diào)試時在代碼中對Flash進行寫操作時(比如Bootloader對Code Flash進行升級操作,Application對Data Flash
    的頭像 發(fā)表于 04-01 09:18 ?515次閱讀
    調(diào)試時Memory窗口中<b class='flag-5'>Flash</b>內(nèi)容不更新的原因和解決辦法

    存儲技術(shù)探秘 NAND Flash vs NOR Flash:藏在芯片里的&quot;門道之爭&quot;

    非易失存儲:斷電后數(shù)據(jù)不丟失 可重復編程:支持擦寫操作(需先擦除后寫入) 二進制操作:擦除后全為 1,寫操作將 1 變?yōu)?0 核心差異 一、物理結(jié)構(gòu)對比 NOR 特性 獨立存儲單元并
    的頭像 發(fā)表于 03-18 12:06 ?540次閱讀

    cubeide的代碼怎么編譯到內(nèi)部+外部FLASH里面去?

    我有一個項目,準備使用GUI和AI,準備使用STM32U5,但是編譯出來的代碼很多,STM32U5的內(nèi)部FLASH不夠用,準備使用OSPI擴展外部FLASH。但是遇到一個問題,我不知道怎么將編譯
    發(fā)表于 03-07 07:48

    DLPDLCR4710EVM-G2是否可以在flash內(nèi)部存儲中設(shè)置投射的彩色圖像?

    剛剛開始使用DLPDLCR4710EVM-G2,目前是用HDMI顯示PC的屏幕的方式。 但是有什么辦法設(shè)置flash內(nèi)部存儲中的彩色圖像,光機自己運行投射相應光場? 謝謝
    發(fā)表于 02-20 07:40

    工業(yè)智能網(wǎng)關(guān)查詢flash操作步驟

    、斷點續(xù)傳、功能看護等本地化功能提供可靠幫助,以便后續(xù)的分析和處理。 比如,在實時應用中,有一顆物料異常的報文數(shù)據(jù)被誤發(fā)出去,從而導致硬件看門狗不生效,可以通過查看是否為FLASH出現(xiàn)問題進行診斷,以下為操作步驟: 1、瀏覽器輸
    的頭像 發(fā)表于 01-02 17:33 ?479次閱讀
    工業(yè)智能網(wǎng)關(guān)查詢<b class='flag-5'>flash</b>的<b class='flag-5'>操作</b>步驟

    不進入halt狀態(tài)可以操作mcu的flash

    嘗試擦除操作 先執(zhí)行halt操作再嘗試擦除操作 在很多MCU中,操作Flash(例如擦除、寫入或修改
    發(fā)表于 12-05 09:17

    字節(jié)起訴前實習生篡改代碼案獲受理

    造謠。這種否認和報警的行為,字節(jié)跳動方面認為田某某完全沒有意識到自己的錯誤,且已嚴重觸犯公司的安全紅線。 作為一家注重信息安全和員工行為的科技公司,字節(jié)跳動對任何可能危害公司內(nèi)部安全
    的頭像 發(fā)表于 11-29 13:48 ?544次閱讀

    tpl0102讀寫正常但是阻值沒變化是哪里的問題?

    向TPL0102 寫入與讀出都是正常; 但是實際阻值沒有變化; 寫入過程: 單字節(jié)操作 :ACR寄存器寫:0x40 (0xc0 也測試了) 連續(xù)寫:WRA,WRB;(0x00,0xff 分別寫入
    發(fā)表于 11-29 08:05

    探索字節(jié)隊列的魔法:多類型支持、函數(shù)重載與線程安全

    探索字節(jié)隊列的魔法:多類型支持、函數(shù)重載與線程安全代碼難度指數(shù):文章學習重點:參數(shù)宏的使用技巧一、引言在嵌入式系統(tǒng)和實時應用中,數(shù)據(jù)的傳輸和處理是至關(guān)重要的。字節(jié)隊列(ByteQueue)是一種重要
    的頭像 發(fā)表于 11-15 01:08 ?1246次閱讀
    探索<b class='flag-5'>字節(jié)</b>隊列的魔法:多類型<b class='flag-5'>支持</b>、函數(shù)重載與線程安全

    DVEVM上的Compact Flash(CF)支持

    電子發(fā)燒友網(wǎng)站提供《DVEVM上的Compact Flash(CF)支持.pdf》資料免費下載
    發(fā)表于 10-15 10:07 ?0次下載
    DVEVM上的Compact <b class='flag-5'>Flash</b>(CF)<b class='flag-5'>支持</b>