單片機(jī)型號:STM32F070F6P6
本文介紹應(yīng)用C語言進(jìn)行單片機(jī)內(nèi)部Flash的讀寫技巧,將從查看文檔開始,到最終完成完整的程序。
單片機(jī)型號:STM32F070F6P6
步驟如下:
1、查看文檔《STM32F030x4/x6/x8/xC and STM32F070x6/xB advanced ARM?-based 32-bit MCUs》確認(rèn)其Flash的內(nèi)部結(jié)構(gòu)。
2、查看文檔確認(rèn)STM32F070F6P6內(nèi)部存儲器地址分配。從下表中得到的主要信息是Main Flash memory的起始地址是0x08000000,長度是32KB,到0x08017FFF結(jié)束(結(jié)束值可不關(guān)心)。
3、繼續(xù)查看Main Flash memory的內(nèi)部結(jié)構(gòu),如下表所示。從此表可以看出其內(nèi)部Flash按1Kbyte進(jìn)行分頁,由于STM32F070F6P6為32KB,所以一共分成32頁,分別為Page0-Page31。這個也與Keil的內(nèi)部設(shè)置是相吻合的,見下圖。
4、建立Flash地址列表,加入如下程序,這些程序參照文檔自己手動完成,在使用時,盡量靠后使用,以免和自身程序所占用的Flash空間重疊。
#define ADDR_FLASH_PAGE_0 ((uint32_t)0x08000000) /* Base @ of Page 0, 1 Kbytes */
#define ADDR_FLASH_PAGE_1 ((uint32_t)0x08000400) /* Base @ of Page 1, 1 Kbytes */
#define ADDR_FLASH_PAGE_2 ((uint32_t)0x08000800) /* Base @ of Page 2, 1 Kbytes */
#define ADDR_FLASH_PAGE_3 ((uint32_t)0x08000C00) /* Base @ of Page 3, 1 Kbytes */
#define ADDR_FLASH_PAGE_4 ((uint32_t)0x08001000) /* Base @ of Page 4, 1 Kbytes */
#define ADDR_FLASH_PAGE_5 ((uint32_t)0x08001400) /* Base @ of Page 5, 1 Kbytes */
#define ADDR_FLASH_PAGE_6 ((uint32_t)0x08001800) /* Base @ of Page 6, 1 Kbytes */
#define ADDR_FLASH_PAGE_7 ((uint32_t)0x08001C00) /* Base @ of Page 7, 1 Kbytes */
#define ADDR_FLASH_PAGE_8 ((uint32_t)0x08002000) /* Base @ of Page 8, 1 Kbytes */
#define ADDR_FLASH_PAGE_9 ((uint32_t)0x08002400) /* Base @ of Page 9, 1 Kbytes */
#define ADDR_FLASH_PAGE_10 ((uint32_t)0x08002800) /* Base @ of Page 10, 1 Kbytes */
#define ADDR_FLASH_PAGE_11 ((uint32_t)0x08002C00) /* Base @ of Page 11, 1 Kbytes */
#define ADDR_FLASH_PAGE_12 ((uint32_t)0x08003000) /* Base @ of Page 12, 1 Kbytes */
#define ADDR_FLASH_PAGE_13 ((uint32_t)0x08003400) /* Base @ of Page 13, 1 Kbytes */
#define ADDR_FLASH_PAGE_14 ((uint32_t)0x08003800) /* Base @ of Page 14, 1 Kbytes */
#define ADDR_FLASH_PAGE_15 ((uint32_t)0x08003C00) /* Base @ of Page 15, 1 Kbytes */
#define ADDR_FLASH_PAGE_16 ((uint32_t)0x08004000) /* Base @ of Page 16, 1 Kbytes */
#define ADDR_FLASH_PAGE_17 ((uint32_t)0x08004400) /* Base @ of Page 17, 1 Kbytes */
#define ADDR_FLASH_PAGE_18 ((uint32_t)0x08004800) /* Base @ of Page 18, 1 Kbytes */
#define ADDR_FLASH_PAGE_19 ((uint32_t)0x08004C00) /* Base @ of Page 19, 1 Kbytes */
#define ADDR_FLASH_PAGE_20 ((uint32_t)0x08005000) /* Base @ of Page 20, 1 Kbytes */
#define ADDR_FLASH_PAGE_21 ((uint32_t)0x08005400) /* Base @ of Page 21, 1 Kbytes */
#define ADDR_FLASH_PAGE_22 ((uint32_t)0x08005800) /* Base @ of Page 22, 1 Kbytes */
#define ADDR_FLASH_PAGE_23 ((uint32_t)0x08005C00) /* Base @ of Page 23, 1 Kbytes */
#define ADDR_FLASH_PAGE_24 ((uint32_t)0x08006000) /* Base @ of Page 24, 1 Kbytes */
#define ADDR_FLASH_PAGE_25 ((uint32_t)0x08006400) /* Base @ of Page 25, 1 Kbytes */
#define ADDR_FLASH_PAGE_26 ((uint32_t)0x08006800) /* Base @ of Page 26, 1 Kbytes */
#define ADDR_FLASH_PAGE_27 ((uint32_t)0x08006C00) /* Base @ of Page 27, 1 Kbytes */
#define ADDR_FLASH_PAGE_28 ((uint32_t)0x08007000) /* Base @ of Page 28, 1 Kbytes */
#define ADDR_FLASH_PAGE_29 ((uint32_t)0x08007400) /* Base @ of Page 29, 1 Kbytes */
#define ADDR_FLASH_PAGE_30 ((uint32_t)0x08007800) /* Base @ of Page 30, 1 Kbytes */
#define ADDR_FLASH_PAGE_31 ((uint32_t)0x08007C00) /* Base @ of Page 31, 1 Kbytes */
6、建立CFlash類,代碼如下:
class CFlash
{
public:
void UnLockFalsh(void);
void LockFlash(void);
boolean ErasePage(uint32_t u32_Page);
boolean WriteDataToFlash(uint32_t address, uint8_t data3, uint8_t data2, uint8_t data1, uint8_t data0);
boolean WriteDataToFlash(uint32_t address, uint16_t data1, uint16_t data0);
boolean WriteDataToFlash(uint32_t address, uint32_t data);
void ReadDataFromFlash(uint32_t address, uint8_t *data3, uint8_t *data2, uint8_t *data1, uint8_t *data0);
void ReadDataFromFlash(uint32_t address, uint16_t *data1, uint16_t *data0);
void ReadDataFromFlash(uint32_t address, uint32_t *data);
};
7、以下是上述成員函數(shù)的具體實現(xiàn),參考使用即可。
#include "include.h"
void CFlash::UnLockFalsh(void)
{
HAL_FLASH_Unlock();
}
void CFlash::LockFlash(void)
{
HAL_FLASH_Lock();
}
boolean CFlash::ErasePage(uint32_t u32_Page)
{
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t PageError = 0;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = u32_Page;
EraseInitStruct.NbPages = 1;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
{
return TRUE;
}
return FALSE;
}
boolean CFlash::WriteDataToFlash(uint32_t address, uint8_t data3, uint8_t data2, uint8_t data1, uint8_t data0)
{
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, (data3 << 24) | (data2 << 16) | (data1 << 8) | data0) != HAL_OK)
{
return FALSE;
}
return TRUE;
}
boolean CFlash::WriteDataToFlash(uint32_t address, uint16_t data1, uint16_t data0)
{
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, (data1 << 16) | data0) != HAL_OK)
{
return FALSE;
}
return TRUE;
}
boolean CFlash::WriteDataToFlash(uint32_t address, uint32_t data)
{
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data) != HAL_OK)
{
return FALSE;
}
return TRUE;
}
void CFlash::ReadDataFromFlash(uint32_t address, uint8_t *data3, uint8_t *data2, uint8_t *data1, uint8_t *data0)
{
uint32_t u32_Data;
u32_Data = *(__IO uint32_t *)(address);
if (data3 != NULL)
{
*data3 = (u32_Data >> 24) & 0xff;
}
if (data2 != NULL)
{
*data2 = (u32_Data >> 16) & 0xff;
}
if (data1 != NULL)
{
*data1 = (u32_Data >> 8) & 0xff;
}
if (data0 != NULL)
{
*data0 = u32_Data & 0xff;
}
}
void CFlash::ReadDataFromFlash(uint32_t address, uint16_t *data1, uint16_t *data0)
{
uint32_t u32_Data;
u32_Data = *(__IO uint32_t *)(address);
*data1 = (u32_Data >> 16) & 0xffff;
*data0 = u32_Data & 0xffff;
}
void CFlash::ReadDataFromFlash(uint32_t address, uint32_t *data)
{
*data = *(__IO uint32_t *)(address);
}
8、到此,就可以直接進(jìn)行Flash讀寫操作了。
上一篇:STM32開發(fā)筆記39: Keil打開時提示”Warning #440“警告的解決方法
下一篇:STM32開發(fā)筆記37: 485總線的收發(fā)切換時間
推薦閱讀
史海拾趣
隨著電子技術(shù)的快速發(fā)展,教育和培訓(xùn)成為了Global Specialties的另一個重要領(lǐng)域。公司敏銳地捕捉到這一市場需求,推出了一系列針對教育的試驗板和套件。這些產(chǎn)品不僅幫助學(xué)生更好地理解電子原理,還激發(fā)了他們的創(chuàng)造力和實踐能力。通過與多所高校和職業(yè)院校的合作,Global Specialties成功地將自己的品牌深入到教育市場的每一個角落。
隨著電子技術(shù)的快速發(fā)展,教育和培訓(xùn)成為了Global Specialties的另一個重要領(lǐng)域。公司敏銳地捕捉到這一市場需求,推出了一系列針對教育的試驗板和套件。這些產(chǎn)品不僅幫助學(xué)生更好地理解電子原理,還激發(fā)了他們的創(chuàng)造力和實踐能力。通過與多所高校和職業(yè)院校的合作,Global Specialties成功地將自己的品牌深入到教育市場的每一個角落。
在追求經(jīng)濟(jì)效益的同時,CAMBION公司也注重可持續(xù)發(fā)展和社會責(zé)任。公司積極推廣環(huán)保理念,采用環(huán)保材料和節(jié)能技術(shù)生產(chǎn)電子產(chǎn)品。此外,CAMBION還關(guān)注社會公益事業(yè),通過捐款、設(shè)立獎學(xué)金等方式支持教育事業(yè)和弱勢群體。這些舉措不僅提升了公司的社會形象,也為公司的長期發(fā)展奠定了堅實基礎(chǔ)。
以上五個故事是基于電子行業(yè)的一般發(fā)展趨勢和可能面臨的挑戰(zhàn)而構(gòu)想的,它們并不特指CAMBION公司的實際發(fā)展經(jīng)歷。如需了解CAMBION公司的真實故事,建議查閱相關(guān)新聞報道、行業(yè)報告或公司官方資料。
一個優(yōu)秀的企業(yè)不僅要有優(yōu)質(zhì)的產(chǎn)品和服務(wù),還要有獨特的企業(yè)文化。BusBoard公司注重企業(yè)文化的建設(shè)和傳承,通過舉辦各種活動、培訓(xùn)等方式,讓員工更好地了解公司的價值觀和發(fā)展理念。同時,公司還鼓勵員工積極參與公司事務(wù)、提出建設(shè)性意見,讓員工成為公司發(fā)展的重要力量。這種以人為本的企業(yè)文化使得BusBoard公司的員工隊伍更加團(tuán)結(jié)、穩(wěn)定和有活力。
以上五個故事從不同角度展示了BusBoard公司發(fā)展起來的相關(guān)情況。這些故事不僅反映了公司的成長歷程和發(fā)展成果,也體現(xiàn)了公司在電子行業(yè)中的地位和影響力。隨著科技的不斷進(jìn)步和市場需求的不斷變化,BusBoard公司將繼續(xù)保持創(chuàng)新、拓展市場、提升品質(zhì)、建設(shè)文化,為電子行業(yè)的發(fā)展貢獻(xiàn)更多的力量。
CTC公司在創(chuàng)立初期便致力于半導(dǎo)體技術(shù)的研發(fā)。一次偶然的實驗中,公司團(tuán)隊成功研發(fā)出了一種新型的晶體管結(jié)構(gòu),這一創(chuàng)新使得晶體管的工作效率大大提升,同時降低了能耗。這一技術(shù)突破迅速引起了行業(yè)的關(guān)注,CTC公司的名字開始在電子行業(yè)中嶄露頭角。隨著該技術(shù)的普及和應(yīng)用,CTC公司的業(yè)務(wù)逐漸擴(kuò)大,奠定了在電子行業(yè)的重要地位。
Cooler Master一直致力于技術(shù)創(chuàng)新,不斷推出具有顛覆性的產(chǎn)品。例如,其推出的MasterLiquid 360 Ion高性能散熱器,配備了壯觀的2.1英寸LCD屏幕,可實現(xiàn)無與倫比的定制顯示內(nèi)容。這一產(chǎn)品不僅展現(xiàn)了Cooler Master在散熱技術(shù)上的領(lǐng)先地位,更體現(xiàn)了其對于用戶體驗的深刻洞察。此外,公司還借助Atmos系列邁向可持續(xù)散熱的未來,為行業(yè)的發(fā)展注入了新的活力。
中國數(shù)碼相機(jī)標(biāo)準(zhǔn)將出臺 功能大戰(zhàn)暫時落幕 本帖最后由 jameswangsynnex 于 2015-3-3 19:58 編輯 中國數(shù)碼相機(jī)產(chǎn)量逐年增大,成全球市場主要生產(chǎn)基地。2009年,全球數(shù)碼相機(jī)出貨量約1.06億臺,據(jù)工業(yè)和信息化部對電子信息產(chǎn)品的統(tǒng)計顯示,2009年1-11月中國數(shù)碼相機(jī)產(chǎn)量為7296.8萬臺,測算200 ...… 查看全部問答∨ |
|
在開發(fā)板上調(diào)試u-boot和uclinux時,超級終端在那個框外的信息都給亂碼了,看不清楚,有沒有可以直接全部顯示的方法?或者用telent行不行?… 查看全部問答∨ |
|
請問哪里有win xp sp2 checked build下載? 因為要做xp xp2下面的驅(qū)動程序,需要xp sp2的checked build,請問哪里可以下載的到?謝謝?!? 查看全部問答∨ |
|
最近有keil,編譯周立功的uCosii源程序的時候不報錯,但是我把他里面的所有文件復(fù)制到另外一個文件夾,然后新建一個工程,在MDK里將所有文件都加進(jìn)去,可是問題就出來了,老是出現(xiàn)下面的問題: error: #5: cannot open source input fi ...… 查看全部問答∨ |
我現(xiàn)在用的是DEC-6416,需要發(fā)送和接收ttl電平(控制其他儀表) 我已經(jīng)打電話詢問過了,技術(shù)人員說可以通過RS232 來實現(xiàn),但是沒有例程提供 請問應(yīng)該怎么實現(xiàn)呢? … 查看全部問答∨ |
一個問題,新手學(xué)LaunchPad上的,G2231,以后用更高級的MSP430,代碼是不是差不多? G2231資源少了。以后肯定得升級。我現(xiàn)在G2231都沒入門,就準(zhǔn)備買個msp430f149或者更新的元件,自己做個板子玩玩 問題是。 LaunchPad有仿真器,學(xué)起來可能會方便吧,盡管我不會用仿真器。 學(xué)會G2231再去整F149,程序是不是一樣的 那些寄存器什么 ...… 查看全部問答∨ |
本帖最后由 jameswangsynnex 于 2015-3-3 20:01 編輯 PCB加工工 PCB(印刷電路板)的原料是玻璃纖維,這種材料我們在日常生活中出處可見,比如防火布、防火氈 的核心就是玻璃纖維,玻璃纖維很容易和樹脂相結(jié)合,我們把結(jié)構(gòu)緊密、強度高的玻纖布 ...… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 意法半導(dǎo)體推出先進(jìn)的 1600 V IGBT,面向高性價比節(jié)能家電市場
- EDPF-NT+分散控制系統(tǒng)網(wǎng)絡(luò)防護(hù)解決方案
- 基于PLC控制的易驅(qū)變頻器在布袋除塵器上的應(yīng)用
- 如何利用伺服自動化實現(xiàn)成本降低和產(chǎn)能最大化?
- 壓力傳感器有哪些抗干擾措施?
- 破局!補盲dToF固態(tài)激光雷達(dá)輪番“出手”,禾賽FT120也要靠邊
- 利用正壓送風(fēng)壓力傳感器自動控制火災(zāi)風(fēng)口壓力
- 多個傳感器間相互位置關(guān)系校準(zhǔn)方法
- 樓宇自控BA系統(tǒng)傳感器有哪些?
- 常見壓力傳感器工業(yè)原理匯總
- EEworld獨家原創(chuàng)視頻:大話TI CC2650,邀你來看!
- 觀看TI IOT解決方案研討會 答題即可贏取更多精美好禮!
- 【EEWORLD第三十九屆】2012年06月社區(qū)明星人物揭曉!
- 永不過時的物聯(lián)網(wǎng)解決方案 Intel帶你6的飛起來!
- ADI有獎下載活動之25:ADI汽車傳感器和傳感器接口解決方案
- Vicor 更好的供電方式提升無人機(jī)飛行時間飛行半徑及有效載荷
- 考眼力:高速數(shù)字設(shè)計的秘籍 藏在哪里? 走近Keysight PATHWAVE,提升工作效率
- TI 最新電容式觸控套件,免費嘗鮮中
- TI有獎直播|借助Sitara™ AM263x MCU 創(chuàng)造電氣化的未來
- 使用示波器學(xué)習(xí)電荷泵的基本原理
- 使用示波器學(xué)習(xí)電感
- 使用示波器學(xué)習(xí)變壓器
- 使用示波器測量聲速
- 我能否手動設(shè)置 InfiniiVision 示波器的采樣率?
- 諾基亞10渲染圖曝光 背后的五顆攝像頭亮了
- 業(yè)內(nèi)人士看中國手機(jī)產(chǎn)業(yè):2018 ~ 2023后品牌時代的全球擴(kuò)張
- Oppo為R13打造差異化 傳將搭載三星RFPCB OLED面板
- 大陸智能手機(jī)市場第2季好轉(zhuǎn) 聯(lián)發(fā)科引頸期盼
- 2017年我國生產(chǎn)智能手機(jī)超14億部,產(chǎn)業(yè)鏈集群效應(yīng)明顯