色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發燒友App

硬聲App

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

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

3天內不再提示
電子發燒友網>電子資料下載>嵌入式開發>博客分享:單片機內部FLASH的字節操作

博客分享:單片機內部FLASH的字節操作

2021-01-29 | pdf | 327.5KB | 次下載 | 3積分

資料介紹

一般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(!(IS_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連續兩頁的地址,首先將這兩頁全部擦除。


2.接著從1070FFC的位置開始寫入56個1,這樣就保證了數據跨越了1頁。

unsigned char write[]= {"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111"};
FLASH_Write(0x01070FFC,write,sizeof(write));

注意:最后的00是因為字符串的結尾字符是“/0”

3.緊接著,在0x1070FFE位置寫入新的字符串,也要保證寫入長度跨越1頁。

unsigned char write2[]={"23456789"};
FLASH_Write(0x01070FFE,write2,sizeof(write2));

可以看出,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



下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1TC358743XBG評估板參考手冊
  2. 1.36 MB  |  330次下載  |  免費
  3. 2開關電源基礎知識
  4. 5.73 MB  |  6次下載  |  免費
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設計
  8. 0.60 MB  |  3次下載  |  免費
  9. 5基于FPGA的光纖通信系統的設計與實現
  10. 0.61 MB  |  2次下載  |  免費
  11. 6基于FPGA的C8051F單片機開發板設計
  12. 0.70 MB  |  2次下載  |  免費
  13. 751單片機窗簾控制器仿真程序
  14. 1.93 MB  |  2次下載  |  免費
  15. 8基于51單片機的RGB調色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21548次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537796次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191185次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183278次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 亚洲欧美一区二区三区导航| 真人美女精美小穴| 国产三级电影网| 亚洲精品无码一区二区三区四虎| 国语精彩对白2021| 99福利在线观看| 日韩中文字幕欧美在线视频| 国产精品久久久久久熟妇吹潮软件 | 俄罗斯aaaaa一级毛片| 午夜国产理论| 啦啦啦 中文 中国 免费 高清在线| 久久这里只有是精品23| 超碰视频在线| 真实伦 乱| 小黄文纯肉短篇| 欧美日韩一级黄色片| 好看AV中文字幕在线观看| 99在线精品国自产拍不卡| 亚洲国产精品无码中文字幕| 暖暖视频免费高清在线观看 视频 暖暖视频大全免费观看 | 果冻传媒 在线播放观看| avtt天堂网2014| 亚洲AV综合色一区二区三区 | 麻婆豆腐传媒视频免费| 影音先锋xfplay影院av| 亚洲AV精品一区二区三区不卡 | 涩涩视频www在线观看入口| 色淫阁色九九| 亚洲精品m在线观看| 野花日本高清在线观看免费吗| 在线国产视频观看| mxgs-877痉挛媚药按摩| 国产精品久久久久久熟妇吹潮软件| 国产网站免费观看| 萝莉御姐被吸奶| 欧美成人一区二免费视频| 青娱乐视觉盛宴国产视频| 肉动漫无码无删减在线观看 | 高中生高潮抽搐喷出白浆视频| hdxxxx58丝袜连裤袜| 成人国产一区|