91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Flash編程的基礎(chǔ)梳理

Geehy極海半導(dǎo)體 ? 來源:Geehy極海半導(dǎo)體 ? 作者:Geehy極海半導(dǎo)體 ? 2022-11-01 09:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

最近拿到了一塊APM32F103VC的MINI開發(fā)板,在學(xué)習(xí)了一段時間后發(fā)現(xiàn)其有非常豐富的外設(shè)資源,主頻能達(dá)到96Mhz。最近在項目中使用到了IAP(In Application Programming)功能,特來評估一下APM32F103的IAP實現(xiàn)方式。

在應(yīng)用編程IAP(In-Application Programming)是應(yīng)用在Flash程序存儲器的一種編程模式。它可以在應(yīng)用程序正常運行的情況下,通過調(diào)用特定的IAP程序?qū)α硗庖欢纬绦騀lash空間進(jìn)行讀/寫操作,甚至可以控制對某段、某頁甚至某個字節(jié)的讀/寫操作,這為數(shù)據(jù)存儲和固件的現(xiàn)場升級帶來了更大的靈活性。

話接上回,我們提及到了 程序跳轉(zhuǎn)運行就是修改PC指針至我們的APP程序,然后修改我們的中斷向量寄存器以使得我們的APP程序能夠正確相應(yīng)中斷。

那我們本章節(jié)就在IAP實現(xiàn)的第三部分內(nèi)容,F(xiàn)lash編程的基礎(chǔ)進(jìn)行梳理。

1 為什么要編程Flash?

眾所周知,MCU的Flash保存著我們的程序,一般情況下我們在生產(chǎn)或者調(diào)試的時候是通過我們的燒錄器或者仿真器對MCU的Flash進(jìn)行編程。在這個過程中我們無需關(guān)系Flash的編程流程,僅需要通過工具即可完成對Flash的編程操作。

d288777c-5986-11ed-a3b6-dac502259ad0.jpg

那為什么做IAP需要關(guān)心Flash編程呢?因為IAP的一個關(guān)鍵因素就能夠通過BootLoader去編程我們的APP區(qū)域的內(nèi)容。

d291ace8-5986-11ed-a3b6-dac502259ad0.jpg

即我們需要實現(xiàn)對MCU的Flash編程操作。

2 Flash的編程流程

在APM32F103的手冊,我們可以看到Flash編程一共分為解鎖,擦除,編程,上鎖的四個步驟。下面我們一步步看一下我們需要完成哪些操作。

d29bf66c-5986-11ed-a3b6-dac502259ad0.jpg

2.1 Flash解鎖與上鎖

Flash是我們程序保存的地方,需要編程FLash必須是“確定的”,而不是我們“一時興起”。所以涉及較為繁瑣的“解鎖”步驟,以防我們重要的程序內(nèi)容被改動。

d2ae47b8-5986-11ed-a3b6-dac502259ad0.jpg

APM32F1的標(biāo)準(zhǔn)庫函數(shù)如下所示:

/*!

* [url=home.php?mod=space&uid=247401]@brief[/url] Unlocks the FMC Program Erase Controller

*

* @param None

*

* @retval None

*/

void FMC_Unlock(void)

{

FMC->KEY = 0x45670123;

FMC->KEY = 0xCDEF89AB;

}

/*!

* [url=home.php?mod=space&uid=247401]@brief[/url] Locks the FMC Program Erase Controller.

*

* @param None

*

* @retval None

*/

void FMC_Lock(void)

{

FMC->CTRL2_B.LOCK = BIT_SET;

}

2.2 Flash的擦除

由于APM32F1 的Flash的特性,對Flash寫入數(shù)據(jù)的地址內(nèi)容必須是0xFFFF,打個比方來說,我們要在一張紙上畫一幅精彩的畫作,那我們的紙張必須要是空白的,這樣子才能不受紙張上的污漬影響我們。

那對于APM32F1的Flash來說,0xFFFF是“空白”狀態(tài),這個狀態(tài)下我們才能盡情的“書寫”內(nèi)容。

那Flash的擦除操作,便是把Flash變回“空白”的操作。

擦除有分“全擦除”和“頁擦除”,由于我們的BootLoader也是存儲于Flash中的,我們?nèi)羰鞘褂谩叭脸辈僮魑覀兊腂ootLoader程序也會被擦除掉,使得MCU處于“空片”狀態(tài)。所以我們會使用“頁擦除”完成對APP存儲的區(qū)域進(jìn)行擦除操作。

d2c24876-5986-11ed-a3b6-dac502259ad0.jpg

APM32F1的標(biāo)準(zhǔn)庫函數(shù)如下所示:

/*!

* @brief Erases a specified FMC page.

*

* @param pageAddr: The page address to be erased.

*

* @retval Returns the flash state.It can be one of value:

* [url=home.php?mod=space&uid=2817080]@ARG[/url] FMC_STATUS_BUSY

* [url=home.php?mod=space&uid=2817080]@ARG[/url] FMC_STATUS_ERROR_PG

* @arg FMC_STATUS_ERROR_WRP

* @arg FMC_STATUS_COMPLETE

* @arg FMC_STATUS_TIMEOUT

*/

FMC_STATUS_T FMC_ErasePage(uint32_t pageAddr)

{

FMC_STATUS_T status = FMC_STATUS_COMPLETE;

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

FMC->CTRL2_B.PAGEERA = BIT_SET;

FMC->ADDR = pageAddr;

FMC->CTRL2_B.STA = BIT_SET;

status = FMC_WaitForLastOperation(0x000B0000);

FMC->CTRL2_B.PAGEERA = BIT_RESET;

}

return status;

}

/*!

* @brief Erases all FMC pages.

*

* @param None

*

* @retval Returns the flash state.It can be one of value:

* @arg FMC_STATUS_ERROR_PG

* @arg FMC_STATUS_ERROR_WRP

* @arg FMC_STATUS_COMPLETE

* @arg FMC_STATUS_TIMEOUT

*/

FMC_STATUS_T FMC_EraseAllPage(void)

{

FMC_STATUS_T status = FMC_STATUS_COMPLETE;

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

FMC->CTRL2_B.MASSERA = BIT_SET;

FMC->CTRL2_B.STA = BIT_SET;

status = FMC_WaitForLastOperation(0x000B0000);

FMC->CTRL2_B.MASSERA = BIT_RESET;

}

return status;

}

2.3 Flash的編程

在上面我們完成對目標(biāo)區(qū)域的擦除操作后,便可以對Flash進(jìn)行編程操作了。

d2d289c0-5986-11ed-a3b6-dac502259ad0.jpg

在APM32F1的標(biāo)準(zhǔn)庫函數(shù)中給我們提供了字編程與半字編程操作。

/*!

* @brief Programs a word at a specified address.

*

* @param address:the address to be programmed.

*

* @param data: the data to be programmed.

*

* @retval Returns the flash state.It can be one of value:

* @arg FMC_STATUS_ERROR_PG

* @arg FMC_STATUS_ERROR_WRP

* @arg FMC_STATUS_COMPLETE

* @arg FMC_STATUS_TIMEOUT

*/

FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data)

{

FMC_STATUS_T status = FMC_STATUS_COMPLETE;

__IOM uint32_t temp = 0;

#ifdef APM32F10X_HD

__set_PRIMASK(1);

#endif

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

FMC->CTRL2_B.PG = BIT_SET;

*(__IOM uint16_t *)address = data;

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

temp = address + 2;

*(__IOM uint16_t*) temp = data >> 16;

status = FMC_WaitForLastOperation(0x000B0000);

FMC->CTRL2_B.PG = BIT_RESET;

}

else

{

FMC->CTRL2_B.PG = BIT_RESET;

}

}

#ifdef APM32F10X_HD

__set_PRIMASK(0);

#endif

return status;

}

/*!

* @brief Programs a half word at a specified address.

*

* @param address:the address to be programmed.

*

* @param data: the data to be programmed.

*

* @retval Returns the flash state.It can be one of value:

* @arg FMC_STATUS_ERROR_PG

* @arg FMC_STATUS_ERROR_WRP

* @arg FMC_STATUS_COMPLETE

* @arg FMC_STATUS_TIMEOUT

*/

FMC_STATUS_T FMC_ProgramHalfWord(uint32_t address, uint16_t data)

{

FMC_STATUS_T status = FMC_STATUS_COMPLETE;

#ifdef APM32F10X_HD

__set_PRIMASK(1);

#endif

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

FMC->CTRL2_B.PG = BIT_SET;

*(__IOM uint16_t *)address = data;

status = FMC_WaitForLastOperation(0x000B0000);

FMC->CTRL2_B.PG = BIT_RESET;

}

#ifdef APM32F10X_HD

__set_PRIMASK(0);

#endif

return status;

}

3 Flash的讀取

完成對目標(biāo)區(qū)域的Flash的編程后,我們一般情況下都需要進(jìn)行校驗,校驗我們寫入到Flash的實際內(nèi)容與我們的期望內(nèi)容是否一致。

我們可以使用直接讀取比較,或者CRC校驗的方式進(jìn)行校驗。校驗的方法多種多樣,但是都離不開Flash的讀取。APM32F1的Flash讀取較為簡單,可以直接使用地址指針直接讀取相應(yīng)地址的內(nèi)容。

data = *(__IOM uint16_t *)address;

data = *(__IOM uint32_t *)address;

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7654

    瀏覽量

    167784
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95385
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5725

    瀏覽量

    105571

原文標(biāo)題:APM32芯得 EP.13 | APM32F103_IAP的簡單實現(xiàn)_flash編程基礎(chǔ)

文章出處:【微信號:geehysemi,微信公眾號:Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    FLASH燒寫/編程白皮書

    白皮書:如何燒寫Flash——不同場景不同需求下的選擇認(rèn)識Flash?NAND vs. NOR如何燒寫/編程不同方案比較
    發(fā)表于 07-28 16:05 ?0次下載

    AS32X601芯片Flash擦寫調(diào)試技術(shù)解析

    本文聚焦于 國科安芯推出的AS32X601 芯片的 Flash 擦寫調(diào)試工作,深入剖析其片內(nèi) Flash 存儲器架構(gòu),詳述 Flash 控制器功能與運作機(jī)制。通過對 Flash 指令集
    的頭像 發(fā)表于 07-22 13:47 ?157次閱讀
    AS32X601芯片<b class='flag-5'>Flash</b>擦寫調(diào)試技術(shù)解析

    FLASH的工作原理與應(yīng)用

    14FLASHFLASH的工作原理與應(yīng)用OWEIS1什么是FLASH?Flash閃存是一種非易失性半導(dǎo)體存儲器,它結(jié)合了ROM(只讀存儲器)和RAM(隨機(jī)訪問存儲器)的優(yōu)點,具有電子可擦除和可編程
    的頭像 發(fā)表于 05-27 13:10 ?654次閱讀
    <b class='flag-5'>FLASH</b>的工作原理與應(yīng)用

    如何通過SFL為設(shè)備添加Flash編程支持

    SEGGER Flash Loader(SFL)是J-Link設(shè)備支持套件(DSK)的一部分,通過SFL,用戶可以為自己的新設(shè)備添加Flash編程支持。
    的頭像 發(fā)表于 05-19 16:35 ?639次閱讀
    如何通過SFL為設(shè)備添加<b class='flag-5'>Flash</b><b class='flag-5'>編程</b>支持

    MCU片上Flash

    ? ? MCU片上Flash是微控制器內(nèi)部集成的非易失性存儲器,主要用于存儲程序代碼、常量數(shù)據(jù)及系統(tǒng)配置信息。其核心特性與功能如下: 一、定義與類型? 片上Flash采用浮柵晶體管技術(shù),具備斷電數(shù)據(jù)
    的頭像 發(fā)表于 05-06 14:26 ?420次閱讀

    基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制FLASH外設(shè)

    1、實驗簡介本實驗將演示如何在小凌派-RK2206開發(fā)板上使用IOT庫的FLASH接口,進(jìn)行FLASH編程開發(fā)。例程將創(chuàng)建一個任務(wù),實現(xiàn)FLASH讀寫操作。例程源代碼:https
    的頭像 發(fā)表于 04-22 14:49 ?393次閱讀
    基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制<b class='flag-5'>FLASH</b>外設(shè)

    PSoC6怎么設(shè)置Flash讀保護(hù),防止用編程器讀出?

    PSoC6 怎么設(shè)置Flash讀保護(hù),防止用編程器讀出
    發(fā)表于 04-21 06:15

    存儲技術(shù)探秘 NAND Flash vs NOR Flash:藏在芯片里的&quot;門道之爭&quot;

    門電路玄機(jī) NOR Flash:Intel 1988 年革命性突破,終結(jié) EPROM/EEPROM 壟斷時代 NAND Flash:東芝 1989 年發(fā)布,開創(chuàng) "低成本比特" 存儲新紀(jì)元 共性特征
    的頭像 發(fā)表于 03-18 12:06 ?591次閱讀

    DLP3432適配的外掛Flash芯片的固件如何燒錄呢?

    你好,新制作的DLP3432 PCB板子,它適配的外掛Flash芯片的固件如何燒錄呢?官網(wǎng)給出的固件是.img 文件,而一般的Flash 編程器只支持 hex或者bin文件的燒錄,請問你們有支持
    發(fā)表于 02-18 08:19

    AN-881: 通過LIN—協(xié)議4進(jìn)行Flash/EE存儲器編程

    電子發(fā)燒友網(wǎng)站提供《AN-881: 通過LIN—協(xié)議4進(jìn)行Flash/EE存儲器編程.pdf》資料免費下載
    發(fā)表于 01-14 16:12 ?0次下載
    AN-881: 通過LIN—協(xié)議4進(jìn)行<b class='flag-5'>Flash</b>/EE存儲器<b class='flag-5'>編程</b>

    EE-231:帶SHARC處理器的SPI Flash在線編程

    電子發(fā)燒友網(wǎng)站提供《EE-231:帶SHARC處理器的SPI Flash在線編程.pdf》資料免費下載
    發(fā)表于 01-06 15:31 ?0次下載
    EE-231:帶SHARC處理器的SPI <b class='flag-5'>Flash</b>在線<b class='flag-5'>編程</b>

    使用SIGMA STUDIO PLUS對連接在ADAU1452 SPI上的FLASH進(jìn)行編程時,程序并不能成功的寫入flash怎么解決?

    我嘗使用SIGMA STUDIO PLUS 對連接在ADAU1452 SPI上的FLASH進(jìn)行編程時,發(fā)現(xiàn)程序并不能成功的寫入flash, 使用的FLASH芯片時M25P80,配置如下
    發(fā)表于 12-19 07:26

    Flash語音芯片相比OTP語音芯片的優(yōu)勢

    ?。No.1可重復(fù)擦寫Flash語音芯片的最大特點是支持多次編程和擦除,這意味著用戶可以根據(jù)需要隨時更新語音內(nèi)容,實現(xiàn)定制化和靈活的語音交互。相比之下,OTP語音芯
    的頭像 發(fā)表于 12-16 16:02 ?674次閱讀
    <b class='flag-5'>Flash</b>語音芯片相比OTP語音芯片的優(yōu)勢

    Flash語音芯片相比OTP語音芯片的優(yōu)勢

    ?。 1?.可重復(fù)擦寫?:Flash語音芯片的最大特點是支持多次編程和擦除,這意味著用戶可以根據(jù)需要隨時更新語音內(nèi)容,實現(xiàn)定制化和靈活的語音交互。相比之下,OTP語音芯片只能編程一次,無法更改存儲的音頻數(shù)據(jù),靈活性較差?。 ?2
    的頭像 發(fā)表于 12-16 15:44 ?552次閱讀

    使用SD Flash為TMS320C28x器件編程外部非易失性存儲器

    電子發(fā)燒友網(wǎng)站提供《使用SD Flash為TMS320C28x器件編程外部非易失性存儲器.pdf》資料免費下載
    發(fā)表于 10-15 11:48 ?0次下載
    使用SD <b class='flag-5'>Flash</b>為TMS320C28x器件<b class='flag-5'>編程</b>外部非易失性存儲器
    主站蜘蛛池模板: 无限国产资源 | 日本黄黄 | 久久综合免费 | 插菊综合网 | 国产一级在线观看www色 | 国产 麻豆 欧美亚洲综合久久 | 日韩一区二区三区在线 | 99久久精品国产自免费 | 操人网站| 久久999 | 国语对白一区二区三区 | 久久本道综合色狠狠五月 | 亚洲视频一区二区 | 午夜三级成人三级 | 曰本黄色一级 | 国产特级 | 一区二区视频在线 | videosxxoo18在线| 国产精品视频一区二区三区 | 四虎亚洲精品 | 在线电影亚洲 | 丁香花在线视频观看免费 | 另类激情亚洲 | 日本欧洲亚洲一区在线观看 | 日本免费人成黄页网观看视频 | 国产成人mv 在线播放 | 巨尻在线观看 | 久久福利精品 | 色99在线| 狼色在线视频 | 黄色视屏在线免费观看 | 国产二三区 | 午夜小网站 | 亚洲一级视频在线观看 | 中国一级特黄真人毛片 | 成人亚洲欧美在线电影www色 | 高清一区二区在线观看 | 亚洲成人网页 | 韩国在线免费视频 | 你懂的网址免费国产 | 亚洲天天|