日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年08月10日(星期日)

2019年08月10日 | 【STM32】STM32之flash

發(fā)布者:幸福之舞 來源: eefocus關(guān)鍵字:STM32  Flash 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

一、簡介


本文介紹STM32系列如何將flash的一部分當(dāng)做eeprom來存儲(chǔ)數(shù)據(jù)。


注:本驅(qū)動(dòng)特點(diǎn)是可自定義數(shù)據(jù)存儲(chǔ)空間、限制寫入地址避免誤寫至代碼段、支持跨頁讀寫、允許保存非半字倍數(shù)的字節(jié)。


二、實(shí)驗(yàn)平臺(tái)


庫版本:STM32F10x_StdPeriph_Lib_V3.5.0


編譯軟件:MDK4.53


硬件平臺(tái):STM32開發(fā)板(主芯片stm32f103c8t6


仿真器:JLINK


三、版權(quán)聲明


博主:甜甜的大香瓜


聲明:喝水不忘挖井人,轉(zhuǎn)載請(qǐng)注明出處。


原文地址:http://blog.csdn.NET/feilusia


聯(lián)系方式:897503845@qq.com


香瓜BLE之CC2541群:127442605


香瓜BLE之CC2640群:557278427


香瓜BLE之Android群:541462902


香瓜單片機(jī)之STM8/STM32群:164311667

甜甜的大香瓜的小店(淘寶店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i


四、實(shí)驗(yàn)前提

1、在進(jìn)行本文步驟前,請(qǐng)先閱讀以下博文:

1)《STM32F10xxx 閃存編程》(下載地址):http://blog.csdn.net/feilusia/article/details/49031709


2、在進(jìn)行本文步驟前,請(qǐng)先實(shí)現(xiàn)以下博文:

暫無


五、基礎(chǔ)知識(shí)


1、flash的介紹

答:

香瓜使用的stm32f103c8t6的flash為64K,詳情如下圖:

1)主存儲(chǔ)器(BOOT1=x、BOOT0=0)

①地址:從0x08000000開始。

②頁大?。盒?、中容量的flash為1K每頁,大容量的flash為2K每頁。

2)信息塊

①系統(tǒng)存儲(chǔ)器(BOOT1=0、BOOT0=1):存放ST自帶的啟動(dòng)代碼。

②選項(xiàng)字節(jié):一般用于配置寫保護(hù)、讀保護(hù)等功能。

3)閃存存儲(chǔ)器/接口寄存器

flash所用到的寄存器。


2、閃存等待時(shí)間是什么?

答:

由于flash的頻率最高位24MHz,所以當(dāng)STM32的頻率小于24MHz時(shí)不需要等待時(shí)間、大于24MHz時(shí)需要等待時(shí)間。

例如當(dāng)STM32的頻率為72MHz時(shí),需要在工程中設(shè)置等待時(shí)間:“FLASH_SetLatency(FLASH_Latency_2); ”


3、閃存的讀、寫、擦除是如何的?

答:

1)讀:可以讀有效地址內(nèi)的任意字節(jié)。

2)寫:需要先解閃存鎖,然后按半字(2個(gè)字節(jié))的倍數(shù)寫入。

3)擦除:需要先解閃存鎖,然后可以頁擦除、全片擦除。


4、如何解閃存鎖?

答:

1)首先要知道flash有三個(gè)鍵值:

①RDPRT鍵 = 0x000000A5

②KEY1 = 0x45670123

③KEY2 = 0xCDEF89AB

2)將KEY1與KEY2依次寫入到FLASH_KEYR寄存器即可實(shí)現(xiàn)解閃存鎖。


5、寫flash只能按半字的倍數(shù)來寫,但如果只有3個(gè)字節(jié)要保存,那該如何操作?

答:

香瓜的驅(qū)動(dòng)是把flash中的整頁數(shù)據(jù)讀出來,修改要寫的3個(gè)字節(jié),然后再按頁寫回去。

雖然此法浪費(fèi)了些寫多余字節(jié)的時(shí)間,但能只改動(dòng)flash中所需的3個(gè)字節(jié),而不是按半字的倍數(shù)(4個(gè))來寫。


6、如何避免寫到代碼段導(dǎo)致代碼運(yùn)行異常?

答:

以stm32f103c8t6為例,它的flash大小是64K,范圍是0x8000000~0x8010000。

假設(shè)通過MDK編譯后得知代碼段大小為31K(0x7C00),所以在32K(0x8007D00)之后的位置肯定都不是代碼段,都可用于自定義的數(shù)據(jù)存儲(chǔ)空間。

保險(xiǎn)起見可參考香瓜下文使用的方式,使用flash的末尾4K。


六、實(shí)驗(yàn)步驟


1、編寫并添加驅(qū)動(dòng)


1)編寫驅(qū)動(dòng)GUA_Flash.c(存放在“……HARDWARE”)


//******************************************************************************         

//name:             GUA_Flash.c           

//introduce:        flash驅(qū)動(dòng)    

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group:         香瓜單片機(jī)之STM8/STM32(164311667)                  

//changetime:       2017.03.18  

//******************************************************************************  

#include "stm32f10x.h"

#include "GUA_Flash.h"

#include

 

/********************內(nèi)部變量************************/ 

static GUA_U8 sbGUA_Flash_Data[GUA_FLASH_SECTOR_SIZE] = {0};

 

/*********************內(nèi)部函數(shù)聲明************************/

static GUA_U16 GUA_Flash_ReadHalfWord(GUA_U32 nGUA_Flash_CustomOffsetAddr);

static GUA_U8 GUA_Flash_ReadByte(GUA_U32 nGUA_Flash_CustomOffsetAddr);

static GUA_U32 GUA_Flash_ReadWord(GUA_U32 nGUA_Flash_CustomOffsetAddr);

 

//******************************************************************************            

//name:             GUA_Flash_ReadHalfWord           

//introduce:        讀取指定地址的字       

//parameter:        nGUA_Flash_CustomOffsetAddr:偏移地址 

//return:           該地址的字         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group:         香瓜單片機(jī)之STM8/STM32(164311667)                  

//changetime:       2017.03.18                     

//******************************************************************************

static GUA_U32 GUA_Flash_ReadWord(GUA_U32 nGUA_Flash_CustomOffsetAddr)

{

GUA_U32 nGUA_Flash_Addr = GUA_FLASH_CUSTOM_ADDR_START + nGUA_Flash_CustomOffsetAddr;

return *(GUA_U32*)nGUA_Flash_Addr;

}

 

//******************************************************************************            

//name:             GUA_Flash_ReadHalfWord           

//introduce:        讀取指定地址的半字       

//parameter:        nGUA_Flash_CustomOffsetAddr:偏移地址 

//return:           該地址的半字         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group:         香瓜單片機(jī)之STM8/STM32(164311667)                  

//changetime:       2017.03.18                     

//******************************************************************************

static GUA_U16 GUA_Flash_ReadHalfWord(GUA_U32 nGUA_Flash_CustomOffsetAddr)

{

GUA_U32 nGUA_Flash_Addr = GUA_FLASH_CUSTOM_ADDR_START + nGUA_Flash_CustomOffsetAddr;

return *(GUA_U16*)nGUA_Flash_Addr;

}

 

//******************************************************************************            

//name:             GUA_Flash_ReadHalfWord           

//introduce:        讀取指定地址的字節(jié)    

//parameter:        nGUA_Flash_CustomOffsetAddr:偏移地址 

//return:           該地址的字節(jié)         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group:         香瓜單片機(jī)之STM8/STM32(164311667)                  

//changetime:       2017.03.18                     

//******************************************************************************

static GUA_U8 GUA_Flash_ReadByte(GUA_U32 nGUA_Flash_CustomOffsetAddr)

{

GUA_U32 nGUA_Flash_Addr = GUA_FLASH_CUSTOM_ADDR_START + nGUA_Flash_CustomOffsetAddr;

return *(GUA_U8*)nGUA_Flash_Addr;

}

 

//******************************************************************************            

//name:             GUA_Flash_Read           

//introduce:        讀取指定地址、指定數(shù)據(jù)長度的數(shù)據(jù)     

//parameter:        nGUA_Flash_CustomOffsetAddr:偏移地址 

//                  pGUA_Data:數(shù)據(jù)緩存區(qū)               

//                  nGUA_Data_Num:讀取的字節(jié)數(shù)

//return:           none         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group:         香瓜單片機(jī)之STM8/STM32(164311667)                  

//changetime:       2017.03.18                     

//******************************************************************************

void GUA_Flash_Read(GUA_U32 nGUA_Flash_CustomOffsetAddr, GUA_U8 *pGUA_Data, GUA_U32 nGUA_Data_Num)

{

while(nGUA_Data_Num--)

{

*pGUA_Data++ = GUA_Flash_ReadByte(nGUA_Flash_CustomOffsetAddr++);

}

}

 

//******************************************************************************            

//name:             GUA_Flash_Write           

//introduce:        寫入指定地址、指定數(shù)據(jù)長度的數(shù)據(jù)        

//parameter:        nGUA_Flash_Addr:讀地址 

//                  pGUA_Data:數(shù)據(jù)緩存區(qū)(必須偶數(shù)個(gè)字節(jié))               

//                  nGUA_Data_Num:數(shù)據(jù)長度(必須偶數(shù)個(gè)字節(jié))

//return:           執(zhí)行情況,詳情見eGUA_FLASH_STATUS         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group:         香瓜單片機(jī)之STM8/STM32(164311667)                  

//changetime:       2017.03.18                     

//******************************************************************************

eGUA_FLASH_STATUS GUA_Flash_Write(GUA_U32 nGUA_Flash_CustomOffsetAddr, GUA_U8 *pGUA_Data, GUA_U32 nGUA_Data_Num)

{

GUA_U32 nGUA_Flash_Addr = GUA_FLASH_CUSTOM_ADDR_START + nGUA_Flash_CustomOffsetAddr; //要寫入的地址

eGUA_FLASH_STATUS eGUA_Flash_Status = GUA_FLASH_STATUS_OK; //flash操作情況

GUA_U16 i;

GUA_U32 nGUA_Flash_SectorPos = (nGUA_Flash_Addr - GUA_FLASH_ADDR_START)/GUA_FLASH_SECTOR_SIZE; //算出是第幾個(gè)扇區(qū)(從0開始)

GUA_U16 nGUA_Flash_SectorAddr_Offset = (nGUA_Flash_Addr - GUA_FLASH_ADDR_START)%GUA_FLASH_SECTOR_SIZE; //扇區(qū)內(nèi)偏移地址

GUA_U16 nGUA_Flash_SectorAddr_Remain = GUA_FLASH_SECTOR_SIZE - nGUA_Flash_SectorAddr_Offset; //扇區(qū)內(nèi)剩余字節(jié)

GUA_U16 nGUA_HalfWord = 0;

GUA_U16 nGUA_HalfWord_Num;

FLASH_Status eGUA_Flash_Lib_Status = FLASH_COMPLETE; 

[1] [2]
關(guān)鍵字:STM32  Flash 引用地址:【STM32】STM32之flash

上一篇:STM32 USB HID設(shè)置(STM32CubeMX)
下一篇:【STM32】STM32之LED

推薦閱讀

? ??Apple Watch 上的 S 系列處理器相信大家都已經(jīng)不陌生了,隨著 Apple Watch 的逐代更新,S 系列處理器也從當(dāng)年的 S1 升級(jí)到了如今的 S3。不過要說在智能穿戴硬件方面發(fā)展的廠商,其實(shí)并不止蘋果一家。就在距離蘋果總部 19 公里外的高通,除了生產(chǎn)智能手機(jī)和筆記本電腦用的處理器以外,同時(shí)在智能穿戴設(shè)備方面也有所涉足。今年 6 月...
作為自動(dòng)駕駛初創(chuàng)公司,從2017成立到現(xiàn)在,Aurora的倔強(qiáng)與野心,引來行業(yè)內(nèi)外側(cè)目,這到底是一家什么樣的公司?“夢之隊(duì)”中的三位大咖如何帶領(lǐng)Aurora快速脫穎而出?在自動(dòng)駕駛激烈的戰(zhàn)局中,Aurora要如何與自動(dòng)駕駛巨頭們一決勝負(fù)?Aurora的倔強(qiáng)自動(dòng)駕駛領(lǐng)域正在經(jīng)歷一場沒有硝煙的戰(zhàn)爭。目前,福特、優(yōu)步、谷歌母公司Alphabet都在競相實(shí)現(xiàn)自動(dòng)駕駛商業(yè)化...
VIAVI Solutions公司近日宣布推出適用于PCI Express? 5.0的Xgig 5P8分析儀平臺(tái)。PCI Express? 5.0是最新的串行計(jì)算機(jī)擴(kuò)展總線標(biāo)準(zhǔn),廣為業(yè)界采用,Xgig 5P8分析儀平臺(tái)可助力設(shè)備制造商確保性能達(dá)到這一標(biāo)準(zhǔn)。 PCIe 5.0標(biāo)準(zhǔn)使PCIe鏈路上的數(shù)據(jù)容量翻倍,可達(dá)到每單向通道每秒32千兆比特,或在公共16通道雙向插槽接口上達(dá)到每秒高于1TB。速度的提...
中國古書《書·大禹謨》中便有“德惟善政,政在養(yǎng)民”的說法,以善政推動(dòng)更高效、透明、專業(yè)的城市治理,是政府作為城市管理的主導(dǎo)力量,一直以來的追求。 時(shí)代大勢,浩浩湯湯。這兩年來,智慧城市建設(shè)如火如荼地開展,每年投入到數(shù)字政務(wù)的資源迅速增加。AI、云計(jì)算、IoT、區(qū)塊鏈等新技術(shù),成為政企機(jī)構(gòu)“善于治”和“以善治”的新工具。而能否接住這份“...

史海拾趣

問答坊 | AI 解惑

計(jì)時(shí)器電路

     誰知道哪里有賣這樣的計(jì)時(shí)器的,就是來一個(gè)信號(hào)開始計(jì)時(shí),再來一個(gè)信號(hào)停止計(jì)時(shí),若沒有這樣的計(jì)時(shí)器,有誰能幫我做一個(gè)這樣的電路,謝謝!…

查看全部問答∨

eboot以太網(wǎng)初始化

報(bào) :ESIA NUMBER ERR 是什么問題…

查看全部問答∨

DMO使用問題

在windows ce6.0的環(huán)境下使用一個(gè)第三方的DMO中有下列疑惑(該dmo是一個(gè)dll文件在windows目錄下): 1. 打開注冊(cè)表找到了HKEY_CLASSES_ROOT\\CLSID\\下對(duì)應(yīng)的該dmo的信息,這個(gè)注冊(cè)項(xiàng)是否代表該dmo被使用了,還是只是注冊(cè)沒有被使用? 2. 我已經(jīng) ...…

查看全部問答∨

STM32F103ADC+DMA和UART2中斷沖突問題求助

程序中使用了TIM2,UART1,UART2和ADC+DMA1中斷,不加上UART2時(shí)都正常,加上UART2中斷后,運(yùn)行幾分鐘后ADC+DMA1的中斷就不能進(jìn)去了,更改了幾種中斷優(yōu)先級(jí)方式后都沒有解決。請(qǐng)大家看看是什么原因? void NVIC_Configuration(void) {   ...…

查看全部問答∨

lm3s101 jtag鎖住啦,求助啊

jtag口的問題,不小心把jtag口的pc0上的上拉電阻連接到pc3上面了,會(huì)不會(huì)造成芯片死鎖,或者損壞,這個(gè)問題怎么解決啊,現(xiàn)在把這兩個(gè)口都接上上拉電阻都不行了?!?

查看全部問答∨

ubuntu10.4 源更新

Ubuntu10.04更新源 Linux UbuntuFreeBSDCentOSSecurityDebian 1.sudo gedit /etc/apt/sources.list 編輯你的源列表,將原來的內(nèi)容全部刪除,添加下面列表中最適合你的源(注意不要全部添加),選擇一個(gè)最合適你的即可,復(fù)制到你的列表中, ...…

查看全部問答∨

【TI建議】關(guān)于本版的建設(shè),個(gè)人一點(diǎn)小意見。。。

1.希望論壇能夠開發(fā)一個(gè)完整的系統(tǒng)套件。      前一段時(shí)間論壇里面推廣了很多TI的開發(fā)板,比如8962和811,還有MSP430的團(tuán)購。這些活動(dòng)讓大家都學(xué)會(huì)了使用TI的MCU.但是論壇中的討論好像僅限于對(duì)MCU實(shí)現(xiàn)某一功能的探討。對(duì)于 ...…

查看全部問答∨

9b96版本問題?

請(qǐng)問一下9b96中的C1和C3版本有什么區(qū)別?芯片上的IQC80C3XD $A-14P038H是什么意思?…

查看全部問答∨

濾波電容

我的電源輸入是4節(jié)干電池共6v,給ams1117-3.3穩(wěn)壓到3.3v,以前是穩(wěn)壓器輸入端輸出端都接的濾波電容,現(xiàn)在想減少原件去掉輸入端的濾波電容可以嗎?因?yàn)槲蚁氲母呻姵禺吘菇涣鞒煞钟邢薜亩椅冶WC輸出ok就行了,去掉合理嗎。謝謝大家…

查看全部問答∨

關(guān)于高頻三極管的問題

大家好,我現(xiàn)在用一個(gè)高頻三極管當(dāng)作二極管用,對(duì)一個(gè)信號(hào)限幅,如圖3所示,輸入信號(hào)如圖2所示,輸出信號(hào)如圖1所示。 一直不明白,為什么輸出之后的信號(hào)相對(duì)輸入信號(hào)來說,脈寬變寬了那么多?我的輸入信號(hào)是10ns的一個(gè)脈寬,輸出的信號(hào)確是一個(gè)20n ...…

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved