chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

聊聊MCU下載算法在Keil MDK里的那些事兒

Geehy極海半導(dǎo)體 ? 來(lái)源:21ic論壇極海半導(dǎo)體專(zhuān)區(qū) ? 2025-12-16 09:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

《APM32芯得》系列內(nèi)容為用戶(hù)使用APM32系列產(chǎn)品的經(jīng)驗(yàn)總結(jié),均轉(zhuǎn)載自21ic論壇極海半導(dǎo)體專(zhuān)區(qū),全文未作任何修改,未經(jīng)原文作者授權(quán)禁止轉(zhuǎn)載。

前言

嗨,嵌入式開(kāi)發(fā)的小伙伴們!用 Keil MDK(μVision)搭配 J-Link 或 DAPLink 調(diào)試器刷代碼到 MCU 的 Flash,是咱們?nèi)粘i_(kāi)發(fā)的老套路了。里面有個(gè)關(guān)鍵角色——Flash 編程算法(FLM 文件),就像個(gè)“幕后大佬”,幫調(diào)試器搞定 Flash 的擦除、編程和驗(yàn)證??刹簧偃耍ㄓ绕涫莿?cè)腴T(mén)的小白)對(duì) FLM 有點(diǎn)懵:這東西存哪兒?為啥非得加載到 SRAM?誰(shuí)來(lái)管加載和跳轉(zhuǎn)?今天咱們就來(lái)把 FLM 的前世今生扒個(gè)底朝天,聊清楚它的加載和運(yùn)行機(jī)制。

一、FLM 下載算法是個(gè)啥?

例如,F(xiàn)4的pack包中就包含了各種的flm文件。

9a7f0b14-d9a5-11f0-8c8f-92fbcf53809c.png

1.1 FLM 文件:刷 Flash 的“臨時(shí)工”

簡(jiǎn)單來(lái)說(shuō),F(xiàn)LM(Flash Loader Module)文件就是 Keil MDK 用來(lái)刷 MCU Flash 的“說(shuō)明書(shū)”。它告訴調(diào)試器(J-Link 或 DAPLink)咋擦除 Flash、咋寫(xiě)代碼、咋校驗(yàn)數(shù)據(jù)。FLM 文件一般由 MCU 廠(chǎng)商或者 Keil 提供,藏在 Keil 的 CMSIS - Pack 包里,或者裝在 Keil 的安裝目錄(比如C:Keil_v5ARMFlash)。

對(duì)小白來(lái)說(shuō),F(xiàn)LM 文件就像個(gè)“臨時(shí)工”:刷代碼時(shí)它上場(chǎng),干完活就撤,不占 MCU 的地兒。它跟你的用戶(hù)代碼沒(méi)啥關(guān)系,專(zhuān)門(mén)負(fù)責(zé)跟 Flash 硬件打交道。你在 Keil 點(diǎn)“Download”,F(xiàn)LM 就在后臺(tái)默默把代碼刷進(jìn) Flash,省心得很。

1.2 FLM 文件里裝了啥?

FLM 文件是個(gè)二進(jìn)制的“黑盒子”,里頭有幾塊關(guān)鍵內(nèi)容:

算法代碼:干活的核心邏輯,比如初始化 Flash 控制器、擦扇區(qū)、寫(xiě)數(shù)據(jù)、校驗(yàn)啥的。一般是用 C 或者匯編寫(xiě),針對(duì)某個(gè) MCU 的 Flash 硬件量身定做。

元數(shù)據(jù):相當(dāng)于“說(shuō)明書(shū)”,告訴你算法咋跑。比如:

oAlgoRamStart:算法代碼要加載到 SRAM 的哪個(gè)地址(比如0x20000000)。

oAlgoRamSize:算法占多少 SRAM(比如 4KB)。

oEntryPoint:代碼從哪兒開(kāi)始跑(比如0x20000004)。

oDevInfo:Flash 的“戶(hù)口本”,比如基地址0x08000000、頁(yè)面大小 2KB、扇區(qū)大小 16KB。

函數(shù)表:一堆標(biāo)準(zhǔn)化的“接口”,比如Init(初始化)、EraseSector(擦扇區(qū))、ProgramPage(寫(xiě)頁(yè)面),調(diào)試器靠這些接口調(diào)用算法。

對(duì)新手來(lái)說(shuō),F(xiàn)LM 就像個(gè)“神秘盒子”,你看不到代碼細(xì)節(jié),但 Keil 和調(diào)試器能讀懂它,靠它把代碼刷進(jìn) Flash。

9ad7682c-d9a5-11f0-8c8f-92fbcf53809c.png

圖片 1:FLM 文件的“黑盒”結(jié)構(gòu)

1.3 FLM 文件打哪兒來(lái)?

FLM 文件的來(lái)路有這幾種:

Keil 官方的 Pack 包:Keil 給主流 MCU(比如 APM32F4、APM32F1、STM32F4)準(zhǔn)備了一堆 FLM 文件,裝完 Keil 就能在ARMFlash目錄找到。

MCU 廠(chǎng)商:像 ST、Geehy 這些廠(chǎng)商會(huì)為自家的 MCU 定制 FLM 文件,確保跟硬件完美匹配。

自己動(dòng)手:硬核玩家可以用 Keil 的 Flash Algorithm Development Kit 自己寫(xiě) FLM 文件,適合搞非標(biāo) Flash 或者特殊場(chǎng)景(比如外接 SPI Flash)。

寫(xiě) FLM 文件得對(duì) MCU 硬件了如指掌,比如 Flash 控制器的寄存器咋用、時(shí)序咋控制。論壇上有大佬分享過(guò),我就不闡述怎么做了。

二、為啥 FLM 算法非得加載到 SRAM?

2.1 Flash 的“怪脾氣”

Flash 是 MCU 里存代碼的“倉(cāng)庫(kù)”,掉電也不丟數(shù)據(jù),可它有幾個(gè)“怪脾氣”,讓 FLM 算法沒(méi)法在 Flash 里跑:

擦除時(shí)不可用:Flash 要寫(xiě)新數(shù)據(jù),得先擦掉老數(shù)據(jù)(通常按 4KB 或 8KB 的扇區(qū)擦)。擦除期間,F(xiàn)lash 忙得不可開(kāi)交,壓根兒沒(méi)法跑代碼。比如,擦一個(gè)扇區(qū)可能要 50 毫秒,F(xiàn)lash 這時(shí)候就是個(gè)“啞巴”。

寄存器操作:Flash 編程得通過(guò) Flash 控制器搞一堆寄存器(比如控制寄存器 CR、狀態(tài)寄存器 SR)。這些操作要快、要靈活,F(xiàn)lash 自個(gè)兒的讀寫(xiě)速度太慢,干不了這活。

慢得要命:Flash 的寫(xiě)操作慢得像烏龜,可能得 100 微秒才能寫(xiě)一次數(shù)據(jù),讀也比 SRAM 慢多了(SRAM 是納秒級(jí),F(xiàn)lash 是微秒級(jí))。跑復(fù)雜算法(比如循環(huán)寫(xiě)數(shù)據(jù)、查錯(cuò))在 Flash 里簡(jiǎn)直是災(zāi)難。

占地方:FLM 算法只是下載時(shí)用用,長(zhǎng)期擱在 Flash 里純屬浪費(fèi)空間。比如 APM32F4 的 Flash 就 512KB,存?zhèn)€ 4KB 的 FLM,擠占用戶(hù)代碼的地兒,太不劃算。

所以,F(xiàn)lash 只能當(dāng)“倉(cāng)庫(kù)”,沒(méi)法當(dāng) FLM 算法的“工作臺(tái)”。

2.2 SRAM:靈活又高效的“工作臺(tái)”

SRAM(Static Random Access Memory)是 MCU 里的易失性存儲(chǔ)器,干 FLM 算法的活簡(jiǎn)直完美:

快如閃電:SRAM 讀寫(xiě)速度超快,訪(fǎng)問(wèn)延遲就幾個(gè)時(shí)鐘周期(比如 APM32F4 的 SRAM 訪(fǎng)問(wèn)只要 1 - 2 個(gè)周期,納秒級(jí))。跑寄存器操作、循環(huán)邏輯啥的,效率杠杠的。

隨時(shí)上場(chǎng):SRAM 能直接加載代碼,CPU 一聲令下就能跑,不像 Flash 還得先擦后寫(xiě)。

地址清楚:MCU 的 SRAM 地址范圍都寫(xiě)在數(shù)據(jù)手冊(cè)里,比如 APM32F4 的 SRAM 從0x20000000開(kāi)始,NXP LPC 系列可能是0x10000000。FLM 算法可以放心加載到 SRAM 的“安全地帶”。

用完就丟:SRAM 是易失性的,F(xiàn)LM 算法干完活就清空,不占資源,MCU 照常跑用戶(hù)代碼。

9b330fce-d9a5-11f0-8c8f-92fbcf53809c.png

圖片 2:Flash vs. SRAM 的“性格”對(duì)比

2.3 調(diào)試器(J-Link/DAPLink)為啥不存 FLM?

有些小伙伴想:能不能把 FLM 算法塞到 J-Link 或 DAPLink 里?答案是:想得美!原因有幾大塊:

地方太小:J-Link 和 DAPLink 的固件存儲(chǔ)就幾百 KB(比如 J-Link 的 Flash 才 256KB-1MB)。FLM 文件少則幾 KB,多則幾十 KB,調(diào)試器得支持上百種 MCU,每個(gè) MCU 可能要個(gè) FLM 文件,哪兒裝得下?

得靈活點(diǎn):J-Link 和 DAPLink 是“萬(wàn)金油”調(diào)試器,啥 MCU 都能用。把 FLM 硬塞進(jìn)去,遇到新 MCU 或者自定義 FLM 就抓瞎了,升級(jí)固件也麻煩。

傳數(shù)據(jù)麻煩:就算 FLM 存在調(diào)試器里,每次還得通過(guò) SWD/JTAG 傳到 SRAM,速度慢不說(shuō),還增加通信開(kāi)銷(xiāo)。還不如讓主機(jī)(PC)存 FLM,調(diào)試器只管傳數(shù)據(jù),省事兒又高效。

固件得簡(jiǎn)單:調(diào)試器的固件就干點(diǎn) SWD/JTAG 的活,塞太多功能(比如管 FLM 文件)會(huì)讓固件復(fù)雜得像個(gè)“胖子”,維護(hù)起來(lái)頭大。

9b8bfd46-d9a5-11f0-8c8f-92fbcf53809c.png

圖片 3:調(diào)試器存儲(chǔ) FLM 的“不可能任務(wù)”

2.4 為啥不擱 Flash 里?

把 FLM 算法塞到 Flash 里也不靠譜:

擦了就沒(méi)了:Flash 編程得先擦扇區(qū),F(xiàn)LM 算法要是住在 Flash 里,擦除的時(shí)候自個(gè)兒就沒(méi)了,咋跑?

浪費(fèi)空間:FLM 就下載時(shí)用一次,長(zhǎng)期占著 Flash 的地兒,擠占用戶(hù)代碼的空間。

慢得要命:Flash 的讀寫(xiě)速度慢(寫(xiě)一次得 100 微秒),跑 FLM 算法效率低得可憐,SRAM 的納秒級(jí)速度完勝。

2.5 咋挑 SRAM 地址?

FLM 算法加載到 SRAM 的地址(比如`0x20000000`)不是隨便挑的,有講究:

MCU 內(nèi)存地圖:每個(gè) MCU 的 SRAM 地址范圍都寫(xiě)在數(shù)據(jù)手冊(cè)里。比如 APM32F4 的 SRAM 從`0x20000000`開(kāi)始,NXP LPC1768 是`0x10000000`。

安全第一:FLM 算法選 SRAM 的低地址(比如`0x20000000`),避開(kāi)用戶(hù)代碼的堆棧、變量啥的。用戶(hù)代碼一般用高地址(比如`0x20010000`),大家井水不犯河水。

廠(chǎng)商定好了:MCU 廠(chǎng)商做 FLM 文件時(shí),參考 SRAM 大小和硬件特性,挑個(gè)安全地址。比如 APM32F4 的 SRAM 有 192KB,F(xiàn)LM 算法占 4KB 綽綽有余,選低地址穩(wěn)妥。

三、FLM 算法咋加載到 SRAM 又咋跑起來(lái)的?

3.1 整個(gè)流程:誰(shuí)干啥?

FLM 算法從 PC 加載到 MCU 的 SRAM,再到跑起來(lái),是個(gè)團(tuán)隊(duì)作戰(zhàn)的過(guò)程,Keil MDK、調(diào)試器(J-Link 或 DAPLink)、目標(biāo) MCU 各干各的活。咱們一步步拆開(kāi)看:

3.1.1 Keil MDK:大腦指揮中心

Keil MDK 是你開(kāi)發(fā)時(shí)的“總指揮”,負(fù)責(zé)讀懂 FLM 文件、發(fā)號(hào)施令:

讀 FLM 文件:Keil 打開(kāi) FLM 文件(比如`APM32F4xx_512.FLM`),從里頭掏出關(guān)鍵信息:

oSRAM 起始地址(`AlgoRamStart`,比如`0x20000000`):算法代碼放哪兒。

o算法大?。╜AlgoRamSize`,比如 4KB):得占多少地兒。

o入口地址(`EntryPoint`,比如`0x20000004`):代碼從哪兒開(kāi)始跑。

oFlash 參數(shù)(`DevInfo`):Flash 的地址、大小啥的,比如基地址`0x08000000`、頁(yè)面 2KB。

發(fā)指令:Keil 把 FLM 的代碼和地址信息打包,通過(guò)調(diào)試器協(xié)議(J-Link 協(xié)議或 CMSIS-DAP 協(xié)議)甩給調(diào)試器,說(shuō):“兄弟,把這算法塞到 SRAM 里去!”

管全局:Keil 還得管整個(gè)下載流程:先加載 FLM 算法,再調(diào)用算法的函數(shù)(比如擦扇區(qū)、寫(xiě)數(shù)據(jù)),最后把用戶(hù)代碼刷進(jìn) Flash。

Keil 就像個(gè)“導(dǎo)演”,不親自干活,但得把任務(wù)分配好。

3.1.2 調(diào)試器:勤勞的搬運(yùn)工

調(diào)試器(J-Link 或 DAPLink)是干活的“搬運(yùn)工”,負(fù)責(zé)把 FLM 算法塞進(jìn) SRAM,還要讓它跑起來(lái):

J-Link:

o軟件端:J-Link 軟件(J-Link DLL)接到 Keil 的指令,拿著 FLM 算法的代碼和 SRAM 地址(比如`0x20000000`)。

o硬件端:J-Link 的固件通過(guò) SWD/JTAG 接口,直接把算法代碼寫(xiě)到 MCU 的 SRAM 里。SWD 就用兩條線(xiàn)(SWDIO 和 SWCLK),效率高得很。

o啟動(dòng):寫(xiě)完后,J-Link 再把 MCU 的程序計(jì)數(shù)器(PC)設(shè)到入口地址(比如`0x20000004`),通過(guò)調(diào)試寄存器(DHCSR)讓 CPU 跑起來(lái)。

o優(yōu)點(diǎn):J-Link 速度快(SWD 可達(dá) 50MHz),跟 Keil 配合得像老搭檔,日志也詳細(xì)(J-Link Commander 能告訴你每一步干了啥)。

DAPLink:

o軟件端:DAPLink 靠主機(jī)端的工具(比如 pyOCD 或 Keil 的 CMSIS-DAP 驅(qū)動(dòng))來(lái)解析 FLM 文件,生成指令。

o硬件端:DAPLink 的固件(跑在開(kāi)發(fā)板的次級(jí) MCU 上,比如 Cortex-M0)通過(guò) CMSIS-DAP 協(xié)議,把 FLM 算法寫(xiě)到 SRAM。

o啟動(dòng):跟 J-Link 一樣,DAPLink 設(shè)好 PC(比如`0x20000004`),讓 CPU 跑起來(lái)。

o特點(diǎn):DAPLink 速度慢點(diǎn)(SWD 一般 1-10MHz),但便宜,適合 DIY 小伙伴。

3.1.3 目標(biāo) MCU:干活的主角

MCU 是 FLM 算法的“舞臺(tái)”:

SRAM 存貨:MCU 的 SRAM 接到調(diào)試器送來(lái)的 FLM 算法代碼,存在指定地址(比如`0x20000000`)。SRAM 快,寫(xiě)個(gè) 4KB 的算法分分鐘搞定。

跑代碼:調(diào)試器把 PC 設(shè)好(比如`0x20000004`),CPU 從暫停(halt)狀態(tài)切到運(yùn)行(run)狀態(tài),從 SRAM 里取指令,開(kāi)始干活。

刷 Flash:FLM 算法跑起來(lái)后,直接搞 Flash 控制器的寄存器,擦扇區(qū)、寫(xiě)數(shù)據(jù)、校驗(yàn)啥的,忙得不亦樂(lè)乎。

9be40202-d9a5-11f0-8c8f-92fbcf53809c.png

圖片 4:FLM 算法加載流程

3.2 為啥代碼里找不到 SRAM 地址?

好多小伙伴翻 FLM 工程的 C 代碼,愣是找不到0x20000000這樣的地址,為啥?答案藏在這些地方:

鏈接腳本:FLM 工程里有個(gè)鏈接腳本(Keil 用`.sct`,GNU 用`.ld`),指定了算法代碼的“住址”。比如:

- 代碼加載到 SRAM 的`0x20000000`,占 4KB。

- 入口地址是`0x20000004`(ARM Cortex-M 的 Thumb 指令得用奇數(shù)地址)。

FLM 元數(shù)據(jù):編譯好的 FLM 文件里,元數(shù)據(jù)明確說(shuō)了:

-`AlgoRamStart`:SRAM 起始地址(比如`0x20000000`)。

-`AlgoRamSize`:占多大地方(比如`0x1000`,也就是 4KB)。

-`EntryPoint`:從哪兒開(kāi)始跑(比如`0x20000004`)。

廠(chǎng)商的安排:MCU 廠(chǎng)商做 FLM 文件時(shí),參考數(shù)據(jù)手冊(cè)的內(nèi)存地圖,挑個(gè)安全的 SRAM 地址。

編譯過(guò)程:Keil 的編譯器和鏈接器把 C 代碼和鏈接腳本“捏”成 FLM 文件,地址信息直接嵌到元數(shù)據(jù)里。你看 C 代碼沒(méi)地址,是因?yàn)檫@活兒都讓鏈接腳本干了。

9c40a214-d9a5-11f0-8c8f-92fbcf53809c.png

圖片 5:SRAM 地址的“安全地帶”

3.3 入口地址和跳轉(zhuǎn)咋搞?

FLM 文件不光說(shuō)了 SRAM 地址,還指定了入口地址(`EntryPoint`,比如`0x20000004`),這是代碼跑起來(lái)的“起跑線(xiàn)”。跳轉(zhuǎn)過(guò)程是這樣的:

- 設(shè) PC:調(diào)試器通過(guò) SWD/JTAG 搞 MCU 的調(diào)試端口(Debug Port, DP),把 PC 寄存器設(shè)到入口地址(比如`0x20000004`)。這得用 DCRSR 寄存器來(lái)寫(xiě)。

- 配寄存器:調(diào)試器可能還得設(shè)下堆棧指針(SP,比如`0x20001000`)和其他寄存器(R0-R3),讓算法跑得順順當(dāng)當(dāng)。

- 跑起來(lái):調(diào)試器通過(guò) DHCSR 寄存器把 MCU 從“暫停”切到“跑”,CPU 就從 SRAM 里取指令,開(kāi)始執(zhí)行 FLM 算法。

- 干活:FLM 算法跑起來(lái)后,調(diào)試器通過(guò)函數(shù)表調(diào)用它的接口(比如擦扇區(qū)的`EraseSector`、寫(xiě)數(shù)據(jù)的`ProgramPage`),把用戶(hù)代碼刷進(jìn) Flash。

四、深挖 FLM 算法的底層原理:硬核來(lái)了!

好了,前面聊了 FLM 是啥、為啥用 SRAM、咋加載和跑起來(lái),現(xiàn)在咱們來(lái)點(diǎn)硬核的,深入扒一扒 FLM 算法的底層機(jī)制,從編譯生成到寄存器操作,再到性能優(yōu)化。

4.1 FLM 文件咋生成的?

FLM 文件不是憑空冒出來(lái)的,它得經(jīng)過(guò)編譯和打包,過(guò)程有點(diǎn)復(fù)雜:

寫(xiě)代碼:FLM 工程的源代碼(一般是 C 或匯編)是核心,負(fù)責(zé)實(shí)現(xiàn) Flash 編程的邏輯。比如:

- 解鎖 Flash:往 KEYR 寄存器寫(xiě)特定值(比如 APM32F4 要寫(xiě)`0x45670123`和`0xCDEF89AB`)。

- 擦扇區(qū):設(shè) CR 寄存器的 ERASE 位,指定扇區(qū)地址。

- 寫(xiě)數(shù)據(jù):循環(huán)把數(shù)據(jù)寫(xiě)到 Flash 的頁(yè)面,每次寫(xiě)完查 SR 寄存器的狀態(tài)。

- 這些代碼得對(duì) MCU 的 Flash 控制器了如指掌,比如寄存器地址、時(shí)序要求。

鏈接腳本:FLM 工程有個(gè)鏈接腳本(Keil 用`.sct`,GNU 用`.ld`),定好代碼的“住址”。比如:

- 算法代碼放 SRAM 的`0x20000000`,占 4KB。

- 入口地址設(shè)為`0x20000004`(Thumb 指令要求奇數(shù)地址)。

- 鏈接腳本還得保證代碼對(duì)齊,避開(kāi) SRAM 的“雷區(qū)”(比如用戶(hù)代碼的地兒)。

編譯打包:Keil 的編譯器(比如 ARMCC 或 ARMClang)把 C/匯編代碼編譯成二進(jìn)制,鏈接器按腳本生成 FLM 文件,順手把 SRAM 地址、入口地址、Flash 參數(shù)塞進(jìn)元數(shù)據(jù)。

元數(shù)據(jù)結(jié)構(gòu):FLM 文件的頭部是個(gè)結(jié)構(gòu)化數(shù)據(jù)塊,包含:

- `AlgoRamStart`:SRAM 起始地址(比如`0x20000000`)。

- `AlgoRamSize`:占多大空間(比如`0x1000`)。

- `EntryPoint`:入口地址(比如`0x20000004`)。

- `DevInfo`:Flash 參數(shù),比如基地址`0x08000000`、頁(yè)面大小 2KB。

- 這些元數(shù)據(jù)是 Keil 和調(diào)試器的“導(dǎo)航圖”,告訴它們算法咋加載、咋跑。

再提一下哈,為啥源代碼里看不到 SRAM 地址?因?yàn)榈刂肥擎溄幽_本和元數(shù)據(jù)的事兒,C 代碼只管邏輯,地址全靠編譯器和鏈接器搞定。

4.2 SWD/JTAG 接口:調(diào)試器的“魔法通道”

J-Link 和 DAPLink 靠 SWD(Serial Wire Debug)或 JTAG 接口跟 MCU 聊天,加載 FLM 算法全靠這倆通道:

內(nèi)存寫(xiě)入:調(diào)試器通過(guò) SWD/JTAG 訪(fǎng)問(wèn) MCU 的內(nèi)存接口(通常是 AHB 或 APB 總線(xiàn)),把 FLM 算法寫(xiě)到 SRAM(比如`0x20000000`)。

- SWD 用兩條線(xiàn)(SWDIO 和 SWCLK),簡(jiǎn)單高效,速度可達(dá) 50MHz(J-Link)。

- JTAG 用四條線(xiàn)(TCK、TMS、TDI、TDO),老派但可靠,適合復(fù)雜場(chǎng)景。

寄存器操作:調(diào)試器通過(guò)調(diào)試端口(Debug Port, DP)和訪(fǎng)問(wèn)端口(Access Port, AP)搞寄存器:

- 設(shè) PC:用 DCRSR 寄存器把 PC 寫(xiě)成入口地址(比如`0x20000004`)。

- 設(shè) SP:堆棧指針(SP)可能設(shè)到 SRAM 的高地址(比如`0x20001000`),保證算法跑得穩(wěn)。

- 控制 CPU:用 DHCSR 寄存器把 CPU 從 halt 切到 run,啟動(dòng)算法。

調(diào)試模式:MCU 在調(diào)試模式下暫停(halt),調(diào)試器可以隨便折騰內(nèi)存和寄存器,干完活再讓 CPU 跑起來(lái)。SWD/JTAG 是調(diào)試器的“魔法通道”,讓 FLM 算法從 PC 到 SRAM,再到跑起來(lái),全程無(wú)縫銜接。

9c993dac-d9a5-11f0-8c8f-92fbcf53809c.png

圖片 6:SWD/JTAG 的“魔法通道”

4.3 FLM 算法的“內(nèi)功心法”

FLM 算法跑起來(lái)后,直接跟 Flash 控制器的寄存器“過(guò)招”,干這些活:

初始化(Init):

- 解鎖 Flash:比如 APM32F4 要往 KEYR 寄存器寫(xiě)`0x45670123`和`0xCDEF89AB`,解開(kāi) Flash 的“鎖”。

- 設(shè)參數(shù):調(diào) Flash 控制器的時(shí)鐘(FLASH_ACR 寄存器)、電壓、模式,保證后續(xù)操作不出岔子。

擦扇區(qū)(EraseSector):

- 往 CR 寄存器寫(xiě) ERASE 命令,指定扇區(qū)地址(比如`0x08004000`)。

- 盯著 SR 寄存器的 BSY 位,等擦除完成(可能要 50ms)。

- 檢查錯(cuò)誤:比如看 WRPERR(寫(xiě)保護(hù)錯(cuò)誤)或 PGERR(編程錯(cuò)誤)位。

寫(xiě)數(shù)據(jù)(ProgramPage):

- 把用戶(hù)代碼按頁(yè)面(比如 2KB)寫(xiě)進(jìn) Flash,每次寫(xiě)完查 SR 寄存器的 EOP(操作結(jié)束)位。

- 循環(huán)寫(xiě):一般是 32 位或 64 位對(duì)齊寫(xiě),效率高點(diǎn)。

校驗(yàn)(Verify):

- 讀 Flash 的數(shù)據(jù),跟原數(shù)據(jù)比對(duì),確認(rèn)沒(méi)寫(xiě)錯(cuò)。

- 可能用 CRC 或校驗(yàn)和,確保數(shù)據(jù)靠譜。

錯(cuò)誤處理:FLM 算法得有點(diǎn)“智商”,比如檢測(cè) Flash 控制器的錯(cuò)誤標(biāo)志(PGERR、WRPERR),返回給調(diào)試器,報(bào)個(gè)錯(cuò)。這些操作全靠 FLM 算法直接戳 Flash 控制器的寄存器,效率高、針對(duì)性強(qiáng)。

9cf3dadc-d9a5-11f0-8c8f-92fbcf53809c.png

圖片 7:FLM 算法的“內(nèi)功心法”

4.4 SRAM 地址沖突:隱藏的“雷區(qū)”

FLM 算法用 SRAM 地址得小心,別跟用戶(hù)代碼“搶地盤(pán)”:

用戶(hù)代碼的地兒:用戶(hù)程序可能在 SRAM 里放堆棧、全局變量、緩沖區(qū)。比如 APM32F4 的用戶(hù)代碼常從`0x20010000`開(kāi)始用。

中斷向量表:Cortex-M 核的中斷向量表可能也在 SRAM(比如`0x20000000`),F(xiàn)LM 得避開(kāi)。

廠(chǎng)商的招:FLM 算法選 SRAM 低地址(比如`0x20000000`),用戶(hù)代碼用高地址,分開(kāi)走,互不干擾。

風(fēng)險(xiǎn):要是地址重了,可能數(shù)據(jù)被覆蓋,程序崩了。比如 FLM 算法占了`0x20000000-0x20001000`,用戶(hù)代碼也用這塊,堆棧就廢了。

解法:開(kāi)發(fā)自定義 FLM 時(shí),查數(shù)據(jù)手冊(cè)的內(nèi)存地圖,挑安全地址。廠(chǎng)商的 FLM 一般都考慮好了這點(diǎn)。

9d5069c8-d9a5-11f0-8c8f-92fbcf53809c.png

圖片 8:地址沖突的“雷區(qū)”示意圖

4.5 性能優(yōu)化:讓刷代碼更快點(diǎn)

FLM 算法的效率直接影響刷代碼的速度,幾個(gè)關(guān)鍵點(diǎn):

SRAM 快:SRAM 訪(fǎng)問(wèn)只要 1-2 個(gè)時(shí)鐘周期,跑算法效率高。

調(diào)試器速度:J-Link 的 SWD 最高 50MHz,DAPLink 才 1-10MHz,J-Link 刷得更快。

算法優(yōu)化:

- 批量寫(xiě):一次寫(xiě) 2KB 頁(yè)面,比多次寫(xiě) 256 字節(jié)塊省時(shí)間。

- 少輪詢(xún):優(yōu)化 FLM 算法,減少查 SR 寄存器 BSY 位的次數(shù)。

- 用緩存:有些 MCU 的 Flash 控制器支持緩存(比如 APM32F4 的 FLASH_ACR),F(xiàn)LM 算法能用上,寫(xiě)得更快。

MCU 硬件:Flash 控制器的性能(比如 APM32F4 擦扇區(qū)要 50ms)是瓶頸,F(xiàn)LM 得調(diào)好參數(shù)(比如 FLASH_ACR 的時(shí)鐘設(shè)置)。

9da76534-d9a5-11f0-8c8f-92fbcf53809c.png

圖片 9:性能優(yōu)化的“加速器”

五、總結(jié):FLM 算法的“前世今生”

FLM 下載算法是 Keil MDK 刷代碼的“幕后大佬”,從存儲(chǔ)到運(yùn)行,全程靠團(tuán)隊(duì)配合:

是啥:FLM 文件是個(gè)二進(jìn)制“黑盒”,裝著 Flash 編程的算法代碼和元數(shù)據(jù),告訴調(diào)試器咋刷 Flash。

為啥用 SRAM:Flash 擦除時(shí)不能跑代碼,速度還慢;調(diào)試器存不下 FLM;SRAM 快、靈活、用完就丟,完美!

咋干的:Keil 讀 FLM 文件,調(diào)試器(J-Link 或 DAPLink)把算法塞到 SRAM,設(shè)好 PC 讓它跑,搞定 Flash 擦寫(xiě)。

硬核咋來(lái):FLM 從源代碼到二進(jìn)制,靠鏈接腳本和元數(shù)據(jù)定地址;SWD/JTAG 負(fù)責(zé)內(nèi)存和寄存器操作;算法直接戳 Flash 控制器,效率拉滿(mǎn)。

9e0074ee-d9a5-11f0-8c8f-92fbcf53809c.png

圖片 10:整體流程的“大合照”

這篇從 FLM 是啥開(kāi)始,講到為啥選 SRAM,再到咋加載、咋跑,最后深挖編譯、寄存器、性能優(yōu)化的硬核細(xì)節(jié),層層遞進(jìn)。希望大家看完后,對(duì) FLM 算法不再懵逼,刷代碼更有底氣!有啥具體問(wèn)題,歡迎留言與交流!

注:文章作者在原帖中提供了代碼文件,有需要請(qǐng)至原文21ic論壇

原文地址:https://bbs.21ic.com/icview-3477484-1-1.html

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

    關(guān)注

    147

    文章

    18925

    瀏覽量

    398207
  • 嵌入式
    +關(guān)注

    關(guān)注

    5198

    文章

    20449

    瀏覽量

    334071
  • keil
    +關(guān)注

    關(guān)注

    69

    文章

    1230

    瀏覽量

    172643

原文標(biāo)題:APM32芯得 EP.68 | 聊聊MCU下載算法(FLM)在Keil MDK里的那些事兒:從入門(mén)到硬核

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Keil MDK工具下i.MXRT的串行NOR Flash下載算法設(shè)計(jì)

    IDE集成開(kāi)發(fā)環(huán)境和ARM Compiler5。Software Packs則可以不更換MDK Core的情況下,單獨(dú)管理(下載、更新、移除)設(shè)備支持包和中間件更新包。
    的頭像 發(fā)表于 11-16 16:21 ?5320次閱讀

    Keil工具MDK-Arm免費(fèi)下載

    Keil工具MDK-Arm免費(fèi)下載
    發(fā)表于 09-01 18:42 ?7.4w次下載

    Arm Keil MDK教程下載

    Arm Keil MDK教程下載
    發(fā)表于 06-14 07:21 ?370次下載

    keil MDK微控制器開(kāi)發(fā)套件下載

    keil MDK微控制器開(kāi)發(fā)套件下載
    發(fā)表于 06-14 07:22 ?203次下載

    KEIL MDK-Arm免費(fèi)下載

    KEIL MDK-Arm免費(fèi)下載
    發(fā)表于 09-17 15:29 ?446次下載

    keil MDK-ARM下載入口

    keil MDK-ARM下載入口
    發(fā)表于 11-20 17:41 ?23次下載

    KeilMDK-ARM)介紹、 下載、安裝與注冊(cè)

    KeilMDK-ARM)介紹、下載、安裝與注冊(cè)
    的頭像 發(fā)表于 03-24 10:29 ?1.8w次閱讀
    <b class='flag-5'>Keil</b>(<b class='flag-5'>MDK</b>-ARM)介紹、 <b class='flag-5'>下載</b>、安裝與注冊(cè)

    Keil MDK下的串行Flash下載算法設(shè)計(jì)

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是Keil MDK工具下i.MXRT的串行NOR Flash下載算法設(shè)計(jì)。
    的頭像 發(fā)表于 10-23 14:30 ?3758次閱讀
    <b class='flag-5'>Keil</b> <b class='flag-5'>MDK</b>下的串行Flash<b class='flag-5'>下載</b><b class='flag-5'>算法</b>設(shè)計(jì)

    淺析Keil MDK下串行Flash的下載算法設(shè)計(jì)

    今天給大家介紹的是 Keil MDK 工具下 i.MXRT 的串行 NOR Flash 下載算法設(shè)計(jì)。 i.MXRT 硬件
    的頭像 發(fā)表于 12-23 13:15 ?2226次閱讀

    Keil MDK下的NOR Flash下載算法

    Keil μVision可以說(shuō)是MCU開(kāi)發(fā)者最熟悉的IDE了,大部分人剛開(kāi)始入行嵌入式學(xué)MCS-51系列單片機(jī)應(yīng)該都是用得Keil C51環(huán)境(Keil μVision2),早期的
    的頭像 發(fā)表于 11-01 11:18 ?7715次閱讀

    Keil MDK和IAR EARM的發(fā)展歷程及歷史版本下載

    Keil 和 IAR算是一代經(jīng)典的IDE工具,之所以這么多人使用,除了工具比較好之外,他們的發(fā)展歷史比較長(zhǎng)也是一個(gè)原因。 下面來(lái)描述一下Keil MDK 和 IAR EARM發(fā)展歷程及歷史版本
    的頭像 發(fā)表于 12-31 10:01 ?6438次閱讀

    國(guó)民技術(shù)(Nation)MCU開(kāi)發(fā)(一)Keil MDK搭建

    國(guó)民技術(shù)(Nation)MCU開(kāi)發(fā)(一)Keil MDK搭建
    發(fā)表于 11-25 19:21 ?84次下載
    國(guó)民技術(shù)(Nation)<b class='flag-5'>MCU</b>開(kāi)發(fā)(一)<b class='flag-5'>Keil</b> <b class='flag-5'>MDK</b>搭建

    Keil C51和Keil MDK下載

    Keil C51和Keil MDK下載
    發(fā)表于 12-03 20:21 ?109次下載
    <b class='flag-5'>Keil</b> C51和<b class='flag-5'>Keil</b> <b class='flag-5'>MDK</b><b class='flag-5'>下載</b>

    MOS管的那些事兒.課件下載

    MOS管的那些事兒.課件下載
    發(fā)表于 12-06 15:14 ?0次下載

    聊聊Netty那些事兒之從內(nèi)核角度看IO模型

    從今天開(kāi)始我們來(lái)聊聊Netty的那些事兒,我們都知道Netty是一個(gè)高性能異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)框架。
    的頭像 發(fā)表于 05-23 10:27 ?2158次閱讀
    <b class='flag-5'>聊聊</b>Netty<b class='flag-5'>那些</b><b class='flag-5'>事兒</b>之從內(nèi)核角度看IO模型