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

【STM32】STM32之flash

發(fā)布者:幸福之舞最新更新時間:2019-08-10 來源: eefocus關鍵字:STM32  Flash 手機看文章 掃描二維碼
隨時隨地手機看文章

一、簡介


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


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


二、實驗平臺


庫版本:STM32F10x_StdPeriph_Lib_V3.5.0


編譯軟件:MDK4.53


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


仿真器:JLINK


三、版權聲明


博主:甜甜的大香瓜


聲明:喝水不忘挖井人,轉載請注明出處。


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


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


香瓜BLE之CC2541群:127442605


香瓜BLE之CC2640群:557278427


香瓜BLE之Android群:541462902


香瓜單片機之STM8/STM32群:164311667

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


四、實驗前提

1、在進行本文步驟前,請先閱讀以下博文:

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


2、在進行本文步驟前,請先實現(xiàn)以下博文:

暫無


五、基礎知識


1、flash的介紹

答:

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

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

①地址:從0x08000000開始。

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

2)信息塊

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

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

3)閃存存儲器/接口寄存器

flash所用到的寄存器。


2、閃存等待時間是什么?

答:

由于flash的頻率最高位24MHz,所以當STM32的頻率小于24MHz時不需要等待時間、大于24MHz時需要等待時間。

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


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

答:

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

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

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


4、如何解閃存鎖?

答:

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

①RDPRT鍵 = 0x000000A5

②KEY1 = 0x45670123

③KEY2 = 0xCDEF89AB

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


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

答:

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

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


6、如何避免寫到代碼段導致代碼運行異常?

答:

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

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

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


六、實驗步驟


1、編寫并添加驅動


1)編寫驅動GUA_Flash.c(存放在“……HARDWARE”)


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

//name:             GUA_Flash.c           

//introduce:        flash驅動    

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group:         香瓜單片機之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:         香瓜單片機之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:         香瓜單片機之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:         香瓜單片機之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:         香瓜單片機之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ù)個字節(jié))               

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

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

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group:         香瓜單片機之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; //算出是第幾個扇區(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]
關鍵字:STM32  Flash 引用地址:【STM32】STM32之flash

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

推薦閱讀最新更新時間:2025-08-02 19:41

STM32 對內(nèi)部FLASH讀寫接口函數(shù)
簡介:因為要用內(nèi)部FLASH代替外部EEPROM,把參數(shù)放在STM32的0x08000000+320K處,其中20K是bootloader,300K是應用程序。 原理:先要把整頁FLASH的內(nèi)容搬到RAM中,然后在RAM中改動,然后擦除整頁FLASH,再把改動后的內(nèi)容寫入原Flash頁。下面程序調(diào)試通過。 /******************************************************************************* * Function Name : I2C_EE_BufferRead * Description : Reads a block of data from th
[單片機]
STM32自帶的SPI實現(xiàn)對外部FLASH(W25Q128)的讀寫
實驗功能:通過KEY1按鍵來控制W25Q128的寫入,通過另外一個按鍵KEY0來控制W25Q128的讀取。 硬件電路: 軟件配置: //以下是SPI模塊的初始化代碼,配置成主機模式 //SPI口初始化 //這里針是對SPI1的初始化 void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA時鐘 RCC_APB2PeriphClockCmd(RCC_
[單片機]
提高MSP430G系列單片機的Flash擦寫壽命方法
簡介:本文從軟件方面,以及安全性方面探討了使用MSP430G 系列單片機在使用Flash 模擬EEPROM方面的應用,提供了兩種不同的方式供選擇。兩種方式都可以大幅度提高模擬EEPROM 的編寫、擦除壽命,并且滿足高可靠性的應用設計,用戶可以結合具體的應用進行選擇。 在嵌入式設計中,許多應用設計都需要使用EEPROM 存儲非易失性數(shù)據(jù),由于成本原因,某些單片機在芯片內(nèi)部并沒有集成EEPROM。MSP430G 系列處理器是TI 推出的低成本16 位處理器,在MSP430G 系列單片機中并不具備EEPROM。為了存儲非易失性數(shù)據(jù),MSP430G 系列處理器在芯片內(nèi)部劃分出了256 字節(jié)的Flash 空間作為信息Flash,可用于存
[單片機]
提高MSP430G系列單片機的<font color='red'>Flash</font>擦寫壽命方法
Cortex-M單片機下載數(shù)據(jù)到外部flash
主機環(huán)境:Windows 10 64bit 開發(fā)環(huán)境:MDK 5.23 目標板:LPC54114 之前在NXP社區(qū)得到一塊LPC54114的板卡,是由萬利制作的,LPC54114是一款雙核MCU,包含了一顆M4主核和一顆M0+從核,利用該板卡學習了一下雙核MCU的開發(fā)流程,板卡中提供了一顆W25P80FLASH,之前擁有的板卡都沒有掛外部FLASH,剛好之前利用LPC54608學習TouchGFX時可以把圖片資源下載到外部FLASH中,因此借此機會來學習一下如何把數(shù)據(jù)下載到外部FLASH。 平時燒錄代碼我們都是燒錄到MCU內(nèi)部的FLASH中,如下圖: 可以看到下載的時片上256KB的FLASH,該算法文件是由DFP包提供的,具
[單片機]
Cypress發(fā)通知、Micron漲價,NOR Flash今年看漲60%
據(jù)海外媒體報道,蘋果iPhone 8將導入NOR Flash,已讓NOR芯片缺貨更為嚴重。 內(nèi)存業(yè)界透露,今年NOR芯片供給缺口將擴大至20%,主要供應商Cypress也正式發(fā)出漲價通知,業(yè)界估計今年漲幅可能擴大至逾60%。 內(nèi)存渠道商透露,去年下半年以來,市場焦點一直以DRAM和NAND Flash缺貨為重心,兩大主流存儲器也從去年下半年迄今,價格上漲近六成。 但今年在iPhone 8將跟進三星導入AMOLED面板,華為、OPPO及VIVO等大陸品牌手機也將跟進,加上車用及物聯(lián)網(wǎng)也都大舉導入NOR芯片,讓NOR缺貨也浮出臺面,且如滾雪球般擴大。 Witsview分析,NOR Flash應用在AMOLED面板上的功能,
[焦點新聞]
ARM與Flash ROM
以ARM為核心的嵌入式設備,是一種以計算機為核心的產(chǎn)品,必須要有存儲軟件的存儲器。單片機中軟件存儲在單片機芯片內(nèi)的ROM存儲器中,單片機的ROM容量很小,一般都小于1MBytes,所以ROM集成在芯片內(nèi)。PC機要求的ROM比較大,主板上啟動計算機用的BIOS存儲在主板上一片1MBytes左右的Flash ROM中,操作系統(tǒng)和應用程序存儲在硬盤中。ARM產(chǎn)品因為體積的緣故,通常都不用硬盤,但軟件的體積一般都在幾MBytes以上,通常在芯片外擴展聯(lián)接容量較大的Flash ROM存儲軟件。 Flash ROM分為兩種:NOR Flash ROM 和 NAND Flash ROM。NOR Flash ROM 用法類似于SDRAM 內(nèi)存,有地
[單片機]
HOLTEK新推出HT66F0172、HT66F0174 Enhanced A/D Flash MCU系列
Holtek新推出Enhanced A/D Flash Type MCU系列,此系列有兩顆MCU分別為HT66F0172及HT66F0174,符合工業(yè)上-40℃ ~ 85℃工作溫度與高抗噪聲之性能要求,并具有2Kx16 Flash程序內(nèi)存,SRAM為128 Bytes、I/O 18個。 此系列產(chǎn)品內(nèi)建Holtek新設計的Timer Module,有Capture、Compare、Timer/Event、Single Pulse Output、PWM等5種模式,并內(nèi)建12-bit快速ADC,可廣泛的應用于各式有溫控或電壓訊號量測需求的家電,如溫控電熱水瓶、紅酒柜、消毒柜、電烤箱、冷暖空調(diào)控制器等。 HT66F0172的Osc
[單片機]
基于Flash存儲器的嵌入式文件系統(tǒng)設計
引????言 Flash 存儲器( Flash Memory) 是一種高可靠性、高密度的固態(tài)存儲器件。其存儲方式是完全非易失性的,掉電后可以保存數(shù)據(jù);可以在線寫入,并可按頁連續(xù)字節(jié)寫入,存取速度快,所以嵌入式系統(tǒng)通常使用Flash 存儲器作為存儲設備。 但Flash存儲器也存在著兩個主要缺陷:一是在重寫之前必須進行擦除,因為Flash 存儲器劃分成很多擦除塊(SectorOErase) ,對任何一位數(shù)據(jù)進行修改必須先擦除整個塊(Sector) ;二是擦除塊的擦除次數(shù)有限,當一個塊提前達到擦除次數(shù)上限時, 將導致整個Flash 存儲器無法使用。 所以,目前PC 機上很多成熟的基于磁盤的文件系統(tǒng)在Flash 存儲器上使用都存在著不足。
[嵌入式]
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章
隨便看看

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

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