欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

電子發(fā)燒友App

硬聲App

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

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

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>嵌入式開發(fā)>博客分享:單片機內(nèi)部FLASH的字節(jié)操作

博客分享:單片機內(nèi)部FLASH的字節(jié)操作

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

資料介紹

一般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(!(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



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

評論

查看更多

下載排行

本周

  1. 1IP6823 支持 qi 認證的無線充電發(fā)射控制 SOC
  2. 1.01 MB  |  1次下載  |  免費
  3. 2IP6824? 全集成QI?無線充電發(fā)射控制SOC
  4. 1.22 MB  |  1次下載  |  免費
  5. 3GD32G5x3 FFT模塊用戶指南
  6. 920.15KB   |  次下載  |  免費
  7. 4GD32H73x/H75x的器件限制
  8. 774.05KB   |  次下載  |  免費
  9. 5PDTA115EU配備PNP電阻的晶體管規(guī)格書
  10. 189.74KB   |  次下載  |  免費
  11. 6帶注入電流控制的1.8V通用SP8T-Z和2個SP4T-Z模擬開關(guān)
  12. 847.62KB   |  次下載  |  免費
  13. 7PESD18VY1BBIF保護二極管規(guī)格書
  14. 4.56MB   |  次下載  |  免費
  15. 8視頻處理器晶振應(yīng)用方案
  16. 515.02 KB  |  次下載  |  免費

本月

  1. 1A7159和A7139射頻芯片的資料免費下載
  2. 0.20 MB   |  55次下載  |  5 積分
  3. 2零死角玩轉(zhuǎn)STM32F103—指南者
  4. 26.78 MB   |  41次下載  |  1 積分
  5. 3PIC12F629/675 數(shù)據(jù)手冊免費下載
  6. 2.38 MB   |  36次下載  |  5 積分
  7. 4PIC16F716 數(shù)據(jù)手冊免費下載
  8. 2.35 MB   |  18次下載  |  5 積分
  9. 5dsPIC33EDV64MC205電機控制開發(fā)板用戶指南
  10. 5.78MB   |  8次下載  |  免費
  11. 6STC15系列常用寄存器匯總免費下載
  12. 1.60 MB   |  7次下載  |  5 積分
  13. 7AN-1267: 使用ADSP-CM408F ADC控制器的電機控制反饋采樣時序
  14. 1.41MB   |  5次下載  |  免費
  15. 8LP9962集成 PFC 和 和的 高壓半橋驅(qū)動的 LLC 諧振
  16. 3.30 MB  |  4次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935124次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420063次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233088次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191367次下載  |  10 積分
  9. 5十天學會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183335次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73813次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65988次下載  |  10 積分