娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年12月17日(星期二)

正在發生

2018年12月17日 | 利用STM32的FLASH模擬 EEPROM(F103)系列

發布者:快樂家庭 來源: eefocus關鍵字:STM32  FLASH  模擬  EEPROM 手機看文章 掃描二維碼
隨時隨地手機看文章

       STM32的FLASH是用來存儲主程序的,ST公司為了節約成本,沒有加入 EEPROM,但是許多場合下我們需要用EEPROM;不過FLASH的容量還是可觀的,我們可以利用FLASH模擬EEPROM。


       根據《STM32F10X閃存編程》中的介紹,FLASH除了保存用戶代碼的部分,其余部分我們是可以利用其作為數據存儲使用的。stm32的FLASH分為主存儲塊和信息塊。主存儲塊用于保存具體的程序代碼和用戶數據,信息塊用于負責由stm32出廠是放置2KB的啟動程序(Bootloader)并鎖死,用戶無法更改。選項字節存儲芯片的配置信息及對主存儲塊的保護信息。STM32的FLASH主存儲塊按頁組織,有的產品每頁1KB,有的產品每頁2KB。頁面典型的用途就是用于按頁擦除FLASH。從這點來看,頁面有點像通用FLASH的扇區


      通常情況下程序也不會把FLASH寫滿;在沒滿的時候我們可以把最后一或兩頁用來模擬EEPROM;這樣我們就可以不用在外部另外來加EEPROM了。下面是STM32F103中文手冊關于FLASH的截圖;由于我用的是STM32C8T6做的實驗;手冊中沒有給STM32C8T6的FLASH的地址信息,容量是64K,可以算出第63頁地址是0X800FC00-0X800FFFF。


               



                          

                        


由于太晚了直接上代碼:


頭文件:


#ifndef  __ST_FLASH_H

#define  __ST_FLASH_H

/**@file StFlash.h

  *@brief stm32 flash的讀寫操作

  *    使用:

  *        * 此文件主要是針對STM32F103系列的芯片,注意不同容量大小的芯片的地址范圍不一樣

  *        * 使用Read和Write函數進行讀寫,具體參數和返回值見函數說明  

  *        * 可以利用flash模擬EEPROM使用

  * 

  *@author  DHS(746769845@qq.com)

  *

  */

 

 

#include "stm32f10x.h"

#include "stm32f10x_flash.h"

//////////////////////////////////////////////////////////////////////////////////////////////////////

//用戶根據自己的需要設置

#define STM32_FLASH_SIZE  64 //所選STM32的FLASH容量大小(單位為K)

#define STM32_FLASH_WREN 1              //使能FLASH寫入(0,不是能;1,使能)

//////////////////////////////////////////////////////////////////////////////////////////////////////

#if STM32_FLASH_SIZE<256

#define STM_SECTOR_SIZE 1024 //字節

#else 

#define STM_SECTOR_SIZE 2048

#endif  

//FLASH起始地址

#define STM32_FLASH_BASE 0x08000000 //STM32 FLASH的起始地址

//FLASH解鎖鍵值

 

class STFLASH

{

private:

bool mUseHalfWord;//

uint32_t mStartAddress;//

public:

STFLASH(uint32_t startAddress=(0x08000000+1000),bool useHalfWord=true);

//讀取指定地址的半字(16位數據)

//faddr:讀地址(此地址必須為2的倍數!!)

//返回值:對應數據.

u16 ReadHalfWord(u32 faddr);

//WriteAddr:起始地址

//pBuffer:數據指針

//NumToWrite:半字(16位)數   

void Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite) ;

//從指定地址開始寫入指定長度的數據

//WriteAddr:起始地址(此地址必須為2的倍數!!)

//pBuffer:數據指針

//NumToWrite:半字(16位)數(就是要寫入的16位數據的個數.)

void Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite);

 

 

//從指定地址開始讀出指定長度的數據

//ReadAddr:起始地址

//pBuffer:數據指針

//NumToWrite:半字(16位)數

void Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead) ;

 

 

};

 

 

#endif


程序文件:


#include "StFlash.h"

/**@file StFlash.h

  *@brief stm32 flash的讀寫操作

  *    使用:

  *        * 此文件主要是針對STM32F103系列的芯片,注意不同容量大小的芯片的地址范圍不一樣

  *        * 使用Read和Write函數進行讀寫,具體參數和返回值見函數說明  

  *        * 可以利用flash模擬EEPROM使用

  * 

  *@author  DHS(746769845@qq.com)

  *

  */

 

 

u16 STMFLASH_BUF[STM_SECTOR_SIZE/2];//最多是2K字節

STFLASH::STFLASH(uint32_t startAddress,bool useHalfWord)

{

if(startAddress%STM_SECTOR_SIZE!=0)//不是頁的開始,將開始處設置為下一個頁開始的地方

startAddress+=(STM_SECTOR_SIZE-(startAddress%STM_SECTOR_SIZE));

mStartAddress=startAddress;

mUseHalfWord=useHalfWord;

}

 

//讀取指定地址的半字(16位數據)

//faddr:讀地址(此地址必須為2的倍數!!)

//返回值:對應數據.

 

u16  STFLASH:: ReadHalfWord(u32 faddr)

{

return *(vu16*)faddr; 

}

//WriteAddr:起始地址

//pBuffer:數據指針

//NumToWrite:半字(16位)數   

void STFLASH::Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)

{


u16 i;

for(i=0;i

{

FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);

    WriteAddr+=2;//地址增加2.

}  

}

//從指定地址開始寫入指定長度的數據

//WriteAddr:起始地址(此地址必須為2的倍數!!)

//pBuffer:數據指針

//NumToWrite:半字(16位)數(就是要寫入的16位數據的個數.)

void STFLASH::Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)

{

u32 secpos;    //扇區地址

u16 secoff;    //扇區內偏移地址(16位字計算)

u16 secremain; //扇區內剩余地址(16位字計算)    

  u16 i;    

u32 offaddr;   //去掉0X08000000后的地址

if(WriteAddr

FLASH_Unlock(); //解鎖

offaddr=WriteAddr-STM32_FLASH_BASE; //實際偏移地址.

secpos=offaddr/STM_SECTOR_SIZE; //扇區地址  0~127 for STM32F103RBT6

secoff=(offaddr%STM_SECTOR_SIZE)/2; //在扇區內的偏移(2個字節為基本單位.)

secremain=STM_SECTOR_SIZE/2-secoff; //扇區剩余空間大小   

if(NumToWrite<=secremain)secremain=NumToWrite;//不大于該扇區范圍

while(1) 

{

Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//讀出整個扇區的內容

for(i=0;i

{

if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除    

}

if(i

{

FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除這個扇區

for(i=0;i

{

STMFLASH_BUF[i+secoff]=pBuffer[i];   

}

Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//寫入整個扇區  

}else Write_NoCheck(WriteAddr,pBuffer,secremain);//寫已經擦除了的,直接寫入扇區剩余區間.    

if(NumToWrite==secremain)break;//寫入結束了

else//寫入未結束

{

secpos++; //扇區地址增1

secoff=0; //偏移位置為0  

    pBuffer+=secremain;  //指針偏移

WriteAddr+=secremain; //寫地址偏移    

    NumToWrite-=secremain; //字節(16位)數遞減

if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一個扇區還是寫不完

else secremain=NumToWrite;//下一個扇區可以寫完了

}  

};

FLASH_Lock();//上鎖

}

 

//從指定地址開始讀出指定長度的數據

//ReadAddr:起始地址

//pBuffer:數據指針

//NumToWrite:半字(16位)數

void STFLASH::Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead) 

{

u16 i;

for(i=0;i

{

pBuffer[i]=ReadHalfWord(ReadAddr);//讀取2個字節.

ReadAddr+=2;//偏移2個字節.

}

}

main文件:


#include "stm32f10x.h"

#include "StFlash.h"/要寫入到STM32 FLASH的字符串數組

const u8 TEXT_Buffer[]={"Flash_test"};

#define SIZE sizeof(TEXT_Buffer) //數組長度

#define FLASH_SAVE_ADDR  0X0800FC00 //設置FLASH 保存地址(必須為偶數,且其值要大于本代碼所占用FLASH的大小+0X08000000)

u8 datatemp[SIZE];

 

 

STFLASH flash1;//

int main()

{

SysTick_Config(72000);                                                    

flash1.Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);//寫數據,第一次下載程序到32,第二次注釋掉此行,斷電重新編譯下載 //keil watch查看datatemp數組的數據正是之前寫進去的數據

flash1.Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);//讀數據


 while(1) {  

 

      }

}

關鍵字:STM32  FLASH  模擬  EEPROM 引用地址:利用STM32的FLASH模擬 EEPROM(F103)系列

上一篇:J-Link燒寫STM32失敗的問題
下一篇:使用IAR+Jlink開發STM32關于下載Flash的一點發現

推薦閱讀

簡而言之,人工智能機器人主要是指運用信息技術,使機器人具備人的智慧,讓機器人學會學習知識并掌握先進技術。近年來,隨著智能制造政策環境進一步優化,人工智能機器人發展駛入快車道。 具體來看,工業機器人、教育機器人、機器人、家用機器人等市場日逐繁榮。隨著消費者生活方式的改變以及智能化、自動化等技術的愈發成熟,機器人市場正遍地開花,發...
電動車續航本就是一個被人詬病的話題,冬天的到來則更加深這種顧慮,本就被打折的標稱續航里程再被削減不少;除此之外,快充、過充以及過于頻繁的充電對電動車的這顆「心臟」來說同樣是一種負擔,進一步加速電池老化,電動車的使用問題逐漸凸顯。如何提高電動車續航?如何延長電動車的使用壽命?如何減少續航焦慮?行業上下游企業都在想辦法去解決這個問題...
全球汽車電動化的趨勢不可阻擋,且發展方向已經清晰明朗。受此影響,上游材料業的競爭也風起云涌,近期包括洛陽鉬業、贛鋒鋰業、格林美,以及特斯拉都大手筆在全球“掃貨”。12月13日,洛陽鉬業發布公告稱,公司與自由港公司(FCX)達成股份購買協議,以5.5億美元(約合人民幣36億元)總價收購后者在剛果民主共和國[下稱“剛果(金)”]的Kisanfu銅鈷礦...
意法半導體氮化鎵功率半導體PowerGaN系列首發,讓電源能效更高、體積更纖薄基于氮化鎵 (GaN) 的產品可以取得更高的能效,幫助工程師設計出更緊湊的電源,適合各種消費、工業和汽車應用意法半導體 PowerGaN系列第一款產品現已投產;很快還將推出其他的不同封裝和規格的產品2021年12月17日,中國 —— 服務多重電子應用領域的全球半導體領導者意法半導...

史海拾趣

問答坊 | AI 解惑

ADSL寬帶接入技術在韓國通信的應用1

一、概況 韓國通信開展ADSL業務的主要原因是由于激烈的市場競爭。由于電信業務完全放開,除韓國通信之外,還有不少寬帶業務提供商也在提供電信業務。當韓國通信還在推廣ISDN業務時,一些CATV公司已利用CableModem占去了不少寬帶Internet接入市場。 ...…

查看全部問答∨

MFC requires WINVER to be #defined to 0x0400 or greater

項目建立的時候是wm5.0,后來選擇別的模擬器,編譯的時候出現“MFC requires WINVER to be #defined to 0x0400 or greater”,應該如何解決?…

查看全部問答∨

獵頭職位——條碼手持終端開發工程師

條碼手持終端開發工程師 1.        2名,大專以上學歷; 2.        了解制造業物流業務和條碼/RFID技術,有倉庫和生產線條碼/RFID手持終端開發經驗。 3.        熟悉C#語言編程 ...…

查看全部問答∨

led冷光源與熱光源的區別

熱光源:利用熱能激發的光源,如白熾燈在3,000-4,000K溫度時熱輻射發光。白熾燈有80-90%的能量轉換能熱能,10%左右的能量轉換為光能。因此發光效率較低。我們不是根據燈具外殼的溫度來定義為冷光源,還是熱光源。燈具週邊的溫度高低,只能評判 ...…

查看全部問答∨

高精度數控恒流源

各位大俠,目前手頭有個設計任務,征集個方案主要情況是這個樣子:板卡由BGA核心板(現有模塊)+DA模擬輸出部分+恒流源運放電路+AD采集模塊幾部分主要技術難點就在于高精度正負恒流源的設計和實現,技術要求如下: 1提供八路獨立正負恒流源恒流源量 ...…

查看全部問答∨

linux中inittab文件詳解

轉貼自:http://www.2cto.com/os/201108/98426.html   init的進程號是1(ps -aux | less),從這一點就能看出,init進程是系統所有進程的起點,Linux在完成核內引導以后,就開始運行init程序。 init程序需要讀取配置文件/etc/ini ...…

查看全部問答∨

PXI7854機箱怎么進windows?

急求:PXI7854機箱怎么進windows,或者說開機的時候按哪個鍵可以進BIOS更改設置。 謝謝~~ 謝謝…

查看全部問答∨

LaunchPad不能用

有一塊別人用過的LaunchPad,第一次插上電腦,就LED0閃了一下,然后就滅了,其他LED都沒亮,不知怎么回事。電腦也一點反應都沒有。     用自己新的LaunchPad,第一次插上就很正常,LED0亮,LED1和LED2交替閃爍。     想求助 ...…

查看全部問答∨

一款帶隔離的ADC ---AD7401

《ADI有獎下載 —  太陽能光伏發電解決方案》中的文章,提到幾款ADI很有特色的電路: AD7401 AD7401A是一款二階Σ-Δ調制器,片上的數字隔離采用ADI公司的iCoupler®技術,能將模擬輸入信號轉換為高速1bit數據流。AD7401A采用5V電 ...…

查看全部問答∨

【TI首屆低功耗設計大賽】sacq的金剛狼(2):重裝IAR

(1)IDE真的要升嗎 打開金剛狼開發板的盒子,首先看到的是黃色項目的標簽——提醒更新到最新版的IDE 開發環境IDE用什么呢,CCS 還是IAR? 個人選擇了已經是稍微熟悉點的IAR。 以前玩過430G2,裝過IAR5.4。 這次到手的金剛狼是430FR5969, ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 乐业县| 泾川县| 铁力市| 弥勒县| 舞钢市| 甘孜| 仁布县| 东方市| 托里县| 衢州市| 遵义县| 巨鹿县| 广昌县| 四川省| 海原县| 交城县| 盐津县| 兴山县| 舟山市| 永寿县| 湟源县| 双桥区| 澄江县| 马边| 宝鸡市| 乌兰县| 鄂伦春自治旗| 康保县| 黔东| 余庆县| 遂平县| 乡宁县| 乌拉特前旗| 彰化市| 文化| 工布江达县| 迭部县| 万州区| 太仓市| 连山| 天等县|