一般32位單片機(jī)的內(nèi)部FALSH是不支持字節(jié)操作的,有的可以按字節(jié)讀取,但是不能按字節(jié)寫入。
而且,一般單片機(jī)內(nèi)部FALSH擦除的最小單位都是頁(yè),如果向某頁(yè)中的某個(gè)位置寫入數(shù)據(jù),恰好這個(gè)位置的前面存了其他數(shù)據(jù),那么就必須把這頁(yè)擦除,存的其他數(shù)據(jù)也會(huì)丟失。
實(shí)際上就是說內(nèi)部的FALSH不好做改寫的操作,如果有很多數(shù)據(jù)需要存放,最好是分頁(yè)存儲(chǔ)。這也是FALSH與E2PROM最大的區(qū)別,后者支持按字節(jié)操作且無需擦除,即使某一個(gè)地址寫壞了,也不影響其他地址。
下面介紹一種方法讓內(nèi)部FLASH“支持”字節(jié)操作,且同一頁(yè)的其他數(shù)據(jù)不受影響。
方法原理很簡(jiǎn)單,下面簡(jiǎn)單介紹下原理:
1.根據(jù)要寫入地址,計(jì)算出該地址位于哪一頁(yè);
2.讀出整個(gè)頁(yè),存入緩存BUF;
3.將要寫入的數(shù)據(jù)按位置更新到BUF中;
4.擦除該頁(yè);
5.寫入整個(gè)BUF。
可以看出這種方法弊端很明顯:
1.耗時(shí)長(zhǎng) 每次寫都要讀整個(gè)BUF,然后還要先把數(shù)據(jù)存到BUF里,然后再寫入整個(gè)BUF;
2.FALSH擦寫次數(shù)增加,降低使用壽命;
下面給出測(cè)試代碼:
#include
#include
#include //C語言標(biāo)準(zhǔn)庫(kù)
#include “flash.h”
#define USER_FLASH_START_ADDR 0x01070000 //FLASH最后兩個(gè)扇區(qū) 供用戶使用
u32tou8 u32data;//定義一個(gè)聯(lián)合體
//==================================================================================
// 獲取某個(gè)地址所在的頁(yè)首地址
// addr:FLASH地址
// 返回:該地址所在的頁(yè) 共128頁(yè)(0~127)
//==================================================================================
unsigned int FLASH_GetFlashPage(unsigned int addr)
{
if (IS_FLASH_ADDRESS(addr))
{
return (addr&(~0xFFF));//清0低12位就是該頁(yè)的起始地址
}
}
//==================================================================================
// 從FLASH中讀取 一個(gè)字(32位)
// addr:讀取地址
// 返回: 讀到的字?jǐn)?shù)據(jù)
//備注: 地址為4字節(jié)對(duì)齊
//==================================================================================
unsigned int FLSAH_ReadWord(unsigned int addr)
{
return (*(unsigned int *)addr);
}
//==================================================================================
//從FLASH指定地址 讀取數(shù)據(jù)
//備注: 讀取數(shù)據(jù)類型為32位 讀取地址為4字節(jié)對(duì)齊
//==================================================================================
void FLASH_Read(unsigned int ReadAddr,unsigned char *pBuffer,unsigned int NumToRead)
{
unsigned int i;
u32tobyte cache;
for(i=0; iRO = 0;//去掉所有扇區(qū)寫保護(hù)
//==================================================================================
// 判斷寫入地址是否非法 起始地址或者結(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ù)長(zhǎng)度-本次已經(jīng)寫入的數(shù)據(jù)長(zhǎng)度
startaddr+=remain;//地址向后偏移本次寫入的字節(jié)數(shù)
}
else
{
for(i=index;i
其中還有個(gè)聯(lián)合體的定義:typedef union
{
unsigned int data;
unsigned char buf[4];
}
u32tou8;FLASH_ErasePage、FLASH_ProgramWord、IS_FLASH_ADDRESS 這三個(gè)都是單片機(jī)FLASH的庫(kù)函數(shù)各家單片機(jī)不同,但功能基本相同,這里不再提供源碼。最后提供以下兩個(gè)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é)果,測(cè)試從0x1070FFC的位置開始寫入數(shù)據(jù),F(xiàn)LASH地址分布如下圖所示:這里展示了FLASH連續(xù)兩頁(yè)的地址,首先將這兩頁(yè)全部擦除。


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

注意:最后的00是因?yàn)樽址慕Y(jié)尾字符是“/0”3.緊接著,在0x1070FFE位置寫入新的字符串,也要保證寫入長(zhǎng)度跨越1頁(yè)。unsigned char write2[]={“23456789”};
FLASH_Write(0x01070FFE,write2,sizeof(write2));

可以看出,0x1070FFE~0x1071006的位置被寫入了新的字節(jié),但這兩頁(yè)的其他位置數(shù)據(jù)保持不變??偨Y(jié):1、實(shí)際使用時(shí),如果不是受限于成本或者FLASH大小,不建議這樣讀寫內(nèi)部FLASH,以為stm32內(nèi)部FLASH也就10W次壽命,這樣頻繁擦寫會(huì)大大降低FLASH壽命。2、如果保存的數(shù)據(jù)不多,建議每個(gè)數(shù)據(jù)都單獨(dú)存1頁(yè),這樣不用考慮擦除時(shí)會(huì)把其他數(shù)據(jù)也一并擦除。版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。本文鏈接:https://blog.csdn.net/qq_24835087/article/details/103541322審核編輯:何安
-
單片機(jī)
+關(guān)注
關(guān)注
6077文章
45509瀏覽量
671323 -
FlaSh
+關(guān)注
關(guān)注
10文章
1750瀏覽量
155629
發(fā)布評(píng)論請(qǐng)先 登錄
NOR Flash和NAND flash有什么區(qū)別
CW32F030 FLASH 存儲(chǔ)器的注意事項(xiàng)
國(guó)產(chǎn)SPI NOR Flash接口閃存介紹
CW32F030 FLASH的頁(yè)擦除操作
【瑞薩RA6E2地奇星開發(fā)板試用】內(nèi)部Code flash和Data flash寫入數(shù)據(jù)并通過OLED顯示
【原創(chuàng)】【RA4M2-SENSOR開發(fā)板評(píng)測(cè)】內(nèi)部flash讀寫測(cè)試
CW32L052 FLASH存儲(chǔ)器介紹
單片機(jī)內(nèi)部FLASH字節(jié)操作
智能顯示模塊支持掉電保存數(shù)據(jù)嗎?智能模塊支持操作Flash嗎?
STM32C011開發(fā)(3)----Flash操作
請(qǐng)問STM32的內(nèi)部Flash操作是不是優(yōu)先級(jí)最高?
第二十九章 讀寫內(nèi)部FLASH
如何通過SFL為設(shè)備添加Flash編程支持
如何讓內(nèi)部FLASH“支持”字節(jié)操作
評(píng)論