在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

如何讓內部FLASH“支持”字節操作

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2022-02-10 11:09 ? 次閱讀

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

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

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

下面介紹一種方法讓內部FLASH“支持”字節操作,且同一頁的其他數據不受影響。

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

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

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

3.將要寫入的數據按位置更新到BUF中;

4.擦除該頁;

5.寫入整個BUF。

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

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

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

下面給出測試代碼:

#include

#include

#include //C語言標準庫

#include “flash.h”

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

u32tou8 u32data;//定義一個聯合體

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

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

// 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:讀取地址

// 返回: 讀到的字數據

//備注: 地址為4字節對齊

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

unsigned int FLSAH_ReadWord(unsigned int addr)

{

return (*(unsigned int *)addr);

}

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

//從FLASH指定地址 讀取數據

//備注: 讀取數據類型為32位 讀取地址為4字節對齊

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

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

{

unsigned int i;

u32tobyte cache;

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

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

// 判斷寫入地址是否非法 起始地址或者結束地址不在FALSH范圍內則退出

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

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

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

{

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

{

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

}

NumToWrite-=remain;//需要寫入的數據長度-本次已經寫入的數據長度

startaddr+=remain;//地址向后偏移本次寫入的字節數

}

else

{

for(i=index;i

其中還有個聯合體的定義:typedef union

{

unsigned int data;

unsigned char buf[4];

}

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

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

100059523-115019-1.jpg

100059523-115020-2.jpg

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

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

100059523-115021-3.jpg

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

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

100059523-115022-4.jpg

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

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

    關注

    6043

    文章

    44623

    瀏覽量

    638702
  • FlaSh
    +關注

    關注

    10

    文章

    1644

    瀏覽量

    148708
收藏 人收藏

    評論

    相關推薦

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

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

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

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

    DVEVM上的Compact Flash(CF)支持

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

    怎么設置固件燒錄在內部FLASH和外部FLASH?

    分區表指定燒錄FLASH偏移地址和大小,但是沒有找到怎么指定燒錄在外部FLASH還是內部FLASH。有哪個文檔會介紹這個
    發表于 06-21 08:11

    基于FPGA的SPI Flash控制器的設計方案

    器件,然后輸入8位操作指令字節,串行數據在片選信號CS#拉低后的個時鐘的上升沿被采樣,SPI Flash啟動內部控制邏輯,自動完成相應操作
    發表于 06-03 10:13

    【GD32F303紅楓派開發板使用手冊】第五講 FMC-片內Flash擦寫讀實驗

    MC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字節空間內,?CPU
    的頭像 發表于 06-02 10:05 ?879次閱讀
    【GD32F303紅楓派開發板使用手冊】第五講 FMC-片內<b class='flag-5'>Flash</b>擦寫讀實驗

    Ti60F100 內外flash操作方案

    有客戶認為Ti60F100內部flash容量比較小,只有16Mb,需要外掛flash.這里我們提供了內部flash和外部
    的頭像 發表于 05-20 16:42 ?1758次閱讀
    Ti60F100 內外<b class='flag-5'>flash</b><b class='flag-5'>操作</b>方案

    STM8L的EERPOM是使用內部FLASH嗎?用那個庫文件能操作讀寫?

    STM8L的EERPOM 是使用內部FLASH嗎?用那個庫文件能操作讀寫?
    發表于 05-15 07:12

    stm32f469讀取內部FLASH程序就會死掉的原因?

    如題,我將數據寫入指定的內部FLASH的某個地址然后進行讀取,但是一讀整個程序就死了。我開始以為是我進行寫操作不當造成的,后來我測試不擦除內部FLA
    發表于 04-26 07:51

    STM32L475VE內部Flash編程出現ECCD錯誤的原因?

    使用的芯片型號 STM32L475VE,使用 HAL 庫 `HAL_FLASH_Program` API 對 內部 Flash 進行編程,出現 ECCD 錯誤。 返回錯誤的代碼摘要如下:(在
    發表于 04-26 07:21

    【GD32H757Z海棠派開發板使用手冊】第四講 FMC-片內Flash擦寫讀實驗

    編程操作Flash讀取可以支持64字節雙字、32位整字、16位半字或字節操作;
    的頭像 發表于 04-19 10:09 ?1409次閱讀
    【GD32H757Z海棠派開發板使用手冊】第四講 FMC-片內<b class='flag-5'>Flash</b>擦寫讀實驗

    易靈思FPGA flash操作原理

    易靈思FPGA flash操作原理分享
    的頭像 發表于 04-09 15:03 ?1078次閱讀

    STM32H7 FMC操作SDRAM讀比寫慢很多是為什么?

    0xC1FFFFFF遍歷寫入并讀出,通過TIM2計時,以字節寫入時,寫時間0.16秒,讀時間0.73秒,以半字節操作時,寫時間0.09秒,讀時間0.71秒。請問為什么讀比寫要慢得多? 下面是寫入和讀出代碼,系統主頻550M,邏輯操作
    發表于 03-11 06:40

    CW32L052 FLASH存儲器

    CW32L052內部集成了64KB嵌入式FLASH供用戶使用,可用來存儲應用程序和用戶數據。芯片支持FLASH 存儲器的讀、擦除和寫操作
    的頭像 發表于 02-28 17:43 ?785次閱讀
    CW32L052 <b class='flag-5'>FLASH</b>存儲器

    GD32的FLASH讀、擦除、寫操作

    一,GD32的flash特征1、在flash的前256K字節空間內,CPU執行指令零等待;在此范圍外,CPU讀取指令存在較長延時;2、對于flash大于512KB(不包括等于512KB
    的頭像 發表于 02-19 12:46 ?4666次閱讀
    GD32的<b class='flag-5'>FLASH</b>讀、擦除、寫<b class='flag-5'>操作</b>
    主站蜘蛛池模板: 黄色免费网站在线播放 | 免费观看欧美一级高清 | 亚洲最色网站 | 亚洲无卡 | 业余性自由色xxxx视频 | 欧美国产精品主播一区 | 久久国内精品视频 | 免费无遮挡很爽很污很黄 | 久久精品人| 成人黄色免费看 | 色爽爽爽爽爽爽爽爽 | 久久综合九色综合网站 | 亚洲最大成人在线 | 毛片综合| 国产黄大片在线观看 | 无限国产资源 | 天天摸天天碰成人免费视频 | 色婷婷激婷婷深爱五月小说 | 欧美黑粗| 亚洲国产欧美日韩一区二区三区 | 无遮挡很爽很污很黄很色的网站 | 色涩网站在线观看 | 天天摸夜夜摸爽爽狠狠婷婷97 | 国产成人高清一区二区私人 | 又长又大又粗又硬3p免费视频 | 特级做a爰片毛片免费看一区 | 天天干天天爱天天射 | 中文字幕亚洲一区二区va在线 | 成人午夜小视频手机在线看 | 精品国产麻豆免费人成网站 | 五月天丁香激情 | 人人做人人澡人人人爽 | 色视频在线观看完整免费版 | 色视频免费在线观看 | 四虎成人免费网站在线 | 在线播放91灌醉迷j高跟美女 | 91极品女神私人尤物在线播放 | 黄色的视频免费看 | 最新色视频 | 三级毛片免费观看 | 天天做夜夜做久久做狠狠 |