資料介紹
一般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; i RO = 0;//去掉所有扇區(qū)寫保護 //================================================================================== // 判斷寫入地址是否非法 起始地址或者結(jié)束地址不在FALSH范圍內(nèi)則退出 //================================================================================== if(!(IS_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ù)兩頁的地址,首先將這兩頁全部擦除。
2.接著從1070FFC的位置開始寫入56個1,這樣就保證了數(shù)據(jù)跨越了1頁。
unsigned char write[]= {"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111"}; FLASH_Write(0x01070FFC,write,sizeof(write));
注意:最后的00是因為字符串的結(jié)尾字符是“/0”
3.緊接著,在0x1070FFE位置寫入新的字符串,也要保證寫入長度跨越1頁。
unsigned char write2[]={"23456789"}; FLASH_Write(0x01070FFE,write2,sizeof(write2));
可以看出,0x1070FFE~0x1071006的位置被寫入了新的字節(jié),但這兩頁的其他位置數(shù)據(jù)保持不變。
總結(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
- STM32單片機內(nèi)部FLASH使用注意事項
- STM32開發(fā)筆記38: 單片機內(nèi)部Flash的讀寫
- 單片機內(nèi)部是什么類型的Flash?
- 單片機內(nèi)部結(jié)構(gòu)分析
- 單片機內(nèi)部FLASH的字節(jié)操作
- MSP430單片機F54系列的單片機內(nèi)部的ADC轉(zhuǎn)換實例
- C8051F35X單片機內(nèi)部Flash存儲器的擦寫方法總結(jié)
- C8051F35X單片機內(nèi)部Flash存儲器的擦寫方法詳細說明 14次下載
- 51單片機內(nèi)部EEPROM應(yīng)用的詳細資料和實例說明
- 使用51單片機內(nèi)核的匯編操作符筆記
- 單片機教程之如何進行單片機內(nèi)部資源的C51編程 21次下載
- MCS51單片機內(nèi)部并行口及應(yīng)用 0次下載
- 宏晶單片機內(nèi)部EEPROM測試程序 23次下載
- C8051F35X單片機內(nèi)部Flash存儲器的擦寫方法
- 利用視頻來演示AVR單片機內(nèi)部結(jié)構(gòu)
- LittleFS是否可以應(yīng)用于SD卡中呢? 4865次閱讀
- Data flash在CS+的應(yīng)用 1938次閱讀
- 什么是51單片機最小系統(tǒng) 2802次閱讀
- STC89C52單片機內(nèi)部結(jié)構(gòu)及基本特性 1.6w次閱讀
- 單片機解密到底是什么 2369次閱讀
- 如何破解單片機的解密芯片 2426次閱讀
- 80C51單片機內(nèi)部定時器和計數(shù)器的結(jié)構(gòu)及原理解析 1.5w次閱讀
- STC系列單片機內(nèi)部AD的應(yīng)用資料和程序及typedef與define的區(qū)別說明 4918次閱讀
- 如何防止單片機被惡意攻擊技術(shù)破解 2331次閱讀
- 8051單片機int字節(jié)的實現(xiàn) 3589次閱讀
- 如何利用51單片機內(nèi)部定時器實現(xiàn)對時間的操作 3.7w次閱讀
- Msp430單片機內(nèi)部Flash存儲器的特點及功能解析 3905次閱讀
- 為什么單片機有了Flash還有EEPROM 4913次閱讀
- 單片機內(nèi)部密碼破解的常用方法解析 5980次閱讀
- PIC單片機學習筆記 2784次閱讀
下載排行
本周
- 1IP6823 支持 qi 認證的無線充電發(fā)射控制 SOC
- 1.01 MB | 1次下載 | 免費
- 2IP6824? 全集成QI?無線充電發(fā)射控制SOC
- 1.22 MB | 1次下載 | 免費
- 3GD32G5x3 FFT模塊用戶指南
- 920.15KB | 次下載 | 免費
- 4GD32H73x/H75x的器件限制
- 774.05KB | 次下載 | 免費
- 5PDTA115EU配備PNP電阻的晶體管規(guī)格書
- 189.74KB | 次下載 | 免費
- 6帶注入電流控制的1.8V通用SP8T-Z和2個SP4T-Z模擬開關(guān)
- 847.62KB | 次下載 | 免費
- 7PESD18VY1BBIF保護二極管規(guī)格書
- 4.56MB | 次下載 | 免費
- 8視頻處理器晶振應(yīng)用方案
- 515.02 KB | 次下載 | 免費
本月
- 1A7159和A7139射頻芯片的資料免費下載
- 0.20 MB | 55次下載 | 5 積分
- 2零死角玩轉(zhuǎn)STM32F103—指南者
- 26.78 MB | 41次下載 | 1 積分
- 3PIC12F629/675 數(shù)據(jù)手冊免費下載
- 2.38 MB | 36次下載 | 5 積分
- 4PIC16F716 數(shù)據(jù)手冊免費下載
- 2.35 MB | 18次下載 | 5 積分
- 5dsPIC33EDV64MC205電機控制開發(fā)板用戶指南
- 5.78MB | 8次下載 | 免費
- 6STC15系列常用寄存器匯總免費下載
- 1.60 MB | 7次下載 | 5 積分
- 7AN-1267: 使用ADSP-CM408F ADC控制器的電機控制反饋采樣時序
- 1.41MB | 5次下載 | 免費
- 8LP9962集成 PFC 和 和的 高壓半橋驅(qū)動的 LLC 諧振
- 3.30 MB | 4次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935124次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420063次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233088次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191367次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73813次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論