一、簡介
本文介紹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;
上一篇:STM32 USB HID設(shè)置(STM32CubeMX)
下一篇:【STM32】STM32之LED
推薦閱讀
史海拾趣
為了提高產(chǎn)品質(zhì)量和客戶滿意度,晨翔電子高度重視質(zhì)量管理體系建設(shè)。公司先后通過了ISO9001質(zhì)量管理體系認(rèn)證、ISO14001環(huán)境體系認(rèn)證、OHSAS18001職業(yè)健康安全體系認(rèn)證及TS16949汽車質(zhì)量體系認(rèn)證。這些認(rèn)證不僅證明了公司在質(zhì)量管理方面的實(shí)力,也為公司贏得了更多客戶的信任和支持。
作為一家有社會(huì)責(zé)任感的企業(yè),晨翔電子始終關(guān)注環(huán)保問題。公司在生產(chǎn)過程中積極采用環(huán)保材料和工藝,減少對(duì)環(huán)境的影響。同時(shí),公司還積極參與社會(huì)公益活動(dòng),回饋社會(huì)。這些舉措不僅體現(xiàn)了公司的環(huán)保意識(shí)和社會(huì)責(zé)任感,也為公司贏得了更多客戶和社會(huì)的認(rèn)可和支持。
在市場競爭日益激烈的環(huán)境下,晨翔電子始終堅(jiān)持產(chǎn)品創(chuàng)新,不斷推出具有市場競爭力的新產(chǎn)品。同時(shí),公司還注重品牌建設(shè),通過提升產(chǎn)品質(zhì)量、優(yōu)化服務(wù)流程、加強(qiáng)市場營銷等方式,不斷提高品牌知名度和美譽(yù)度。這一時(shí)期的努力,使得晨翔電子在電子連接器行業(yè)樹立了良好的品牌形象。
隨著電子行業(yè)的快速發(fā)展,BOPLA意識(shí)到傳統(tǒng)的電子元件已經(jīng)無法滿足市場的需求。于是,公司投入大量資源進(jìn)行技術(shù)研發(fā),成功推出了一系列具有創(chuàng)新性的電子元件產(chǎn)品。這些產(chǎn)品不僅性能優(yōu)異,而且具有更高的可靠性和穩(wěn)定性,贏得了市場的廣泛好評(píng)。
近年來,隨著環(huán)保意識(shí)的提高和政府對(duì)塑料污染治理的關(guān)注,BOPLA積極響應(yīng)國家號(hào)召,開始研發(fā)和推廣生物基可降解材料。經(jīng)過多年的努力,公司成功推出了BOPLA生物基膜材,實(shí)現(xiàn)了產(chǎn)品的綠色轉(zhuǎn)型。這一創(chuàng)新不僅有助于減少塑料污染,還為公司贏得了更多的環(huán)保意識(shí)和綠色消費(fèi)市場的青睞。
為了進(jìn)一步擴(kuò)大市場份額,義隆電子積極實(shí)施國際化戰(zhàn)略。公司在臺(tái)灣新竹科學(xué)園區(qū)設(shè)立了全球營運(yùn)總部,并在亞、美等二大洲建立了密集的行銷暨技術(shù)中心。通過不斷拓展國際市場,義隆電子的產(chǎn)品已經(jīng)銷售到全球各地,贏得了廣泛的客戶認(rèn)可和信賴。同時(shí),公司還積極尋求與國際知名企業(yè)的合作機(jī)會(huì),共同推動(dòng)行業(yè)技術(shù)的發(fā)展和創(chuàng)新。
誰知道哪里有賣這樣的計(jì)時(shí)器的,就是來一個(gè)信號(hào)開始計(jì)時(shí),再來一個(gè)信號(hào)停止計(jì)時(shí),若沒有這樣的計(jì)時(shí)器,有誰能幫我做一個(gè)這樣的電路,謝謝!… 查看全部問答∨ |
|
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) { ...… 查看全部問答∨ |
|
jtag口的問題,不小心把jtag口的pc0上的上拉電阻連接到pc3上面了,會(huì)不會(huì)造成芯片死鎖,或者損壞,這個(gè)問題怎么解決啊,現(xiàn)在把這兩個(gè)口都接上上拉電阻都不行了?!? 查看全部問答∨ |
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ì)于 ...… 查看全部問答∨ |
|
大家好,我現(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ā)板 精華推薦
- 電動(dòng)車電池成本降一半,續(xù)航卻減一半?寧德時(shí)代新電池能突圍嗎?
- 從“不可修”到可拆可換:CTP電池的售后怎么辦?
- 區(qū)域控制器ZCU國產(chǎn)化:從物料齊全到系統(tǒng)話語權(quán)
- 總額超260億-盤點(diǎn)全球移動(dòng)機(jī)器人領(lǐng)域融資TOP10企業(yè)
- 安森美CEO談?wù)撾妱?dòng)汽車與AI服務(wù)器前景
- LILYGO T-LoRa Pager:復(fù)古造型與前沿技術(shù)結(jié)合的物聯(lián)網(wǎng)手持設(shè)備
- VS Code+PlatformIO搭建ESP32 Arduino開發(fā)環(huán)境
- Esp32環(huán)境離線搭建參考
- ESP32使用舵機(jī)庫時(shí)的錯(cuò)誤
- ESP32 S3接ST7789屏幕線序
- 逛工業(yè)自動(dòng)化展TE Connectivity網(wǎng)上展廳,答題贏好禮!
- 1月22日下午14:00Mouser攜手Maxim邀您觀看有獎(jiǎng)直播:深入淺出可穿戴健康監(jiān)測
- 在線直播 意法半導(dǎo)體工業(yè)峰會(huì)2022
- 合泰ESK32-360 開發(fā)板“拍了拍”你,免費(fèi)測評(píng)在等你
- 點(diǎn)評(píng)《與Atmel SAM D21/R21的相遇、相識(shí)、相知(上)》,贏溫暖新春禮
- 51奇趣DIY(LC測試儀已完成)
- TI 嵌入式處理主題直播月|報(bào)名觀看直播贏好禮【低功耗WiFi MCU、Sitara AM57X平臺(tái)、機(jī)器學(xué)習(xí)】
- 來聊聊你與MP3的情緣吧!——MP3播放板等你拿
- 博通107億現(xiàn)金收購賽門鐵克企業(yè)業(yè)務(wù)
- 蘋果Siri泄露隱私?公司遭遇集體訴訟
- 中國家電“龍頭老大”海爾,應(yīng)當(dāng)如何度過艱難的2019年?
- 中國能建承建的浙江省首座儲(chǔ)能站并網(wǎng)
- 三星刪除嘲笑蘋果取消耳機(jī)孔的視頻,怕自己打自己臉?
- 廣東2018年將新增應(yīng)用機(jī)器人約2萬臺(tái)
- 機(jī)器人索菲亞談信任:少拍機(jī)器與人類為敵的電影
- 普華永道2017年風(fēng)投報(bào)告:資金紛紛涌入AI領(lǐng)域 引發(fā)“非理性繁榮”
- 停取車不需你操心 機(jī)器人3分鐘搞定
- 能源互聯(lián)網(wǎng)市場規(guī)模或達(dá)5萬億 將顛覆能源行業(yè)?