在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32的IAP方案實現設計

痞子衡嵌入式 ? 來源:果果小師弟 ? 2023-06-05 14:23 ? 次閱讀

一、什么是IAP,為什么要IAP

IAP即為In Application Programming(在應用中編程),一般情況下,以STM32F10x系列芯片為主控制器的設備在出廠時就已經使用J-Link仿真器將應用代碼燒錄了,如果在設備使用過程中需要進行應用代碼的更換、升級等操作的話,則可能需要將設備返回原廠并拆解出來再使用J-Link重新燒錄代碼,這就增加了很多不必要的麻煩。站在用戶的角度來說,就是能讓用戶自己來更換設備里邊的代碼程序而廠家這邊只需要提供給用戶一個代碼文件即可。

而IAP卻能很好的解決掉這個難題,一片STM32芯片的Code(代碼)區內一般只有一個用戶程序。而IAP方案則是將代碼區劃分為兩部分,兩部分區域各存放一個程序,一個叫bootloader(引導加載程序),另一個較user application(用戶應用程序)。bootloader在出廠時就固定下來了,在需要變更user application時只需要通過觸發bootloader對userapplication的擦除和重新寫入即可完成用戶應用的更換。如圖所示

2f350acc-0359-11ee-90ce-dac502259ad0.png

在程序執行初始進入bootloader,在bootloader里面檢測條件是否被觸發(可通過按鍵是否被按下、串口是否接收到特定的數據、U盤是否插入等等),如果有則進行對user application進行擦除和重新寫入操作,如果沒有則直接跳轉到user application執行應用;如果有則進行擦除用戶代碼并重新寫入新的用戶代碼。

二、STM32F103ZET6硬件條件

STM32F103ZET6的啟動方式有三種:內置FLASH啟動、內置SRAM啟動、系統存儲器ROM啟動,通過BOOT0和BOOT1引腳的設置可以選擇從哪中方式啟動,這里選擇內置的FLASH啟動。其FLASH的地址為0x08000000—0x0807 FFFF,共512KB,這些都能從芯片數據手冊中直接得到。而這里首要的一個問題是中斷的問題。

正常情況下發生中斷的過程為:發生中斷(中斷請求)到中斷向量表查找中斷函數入口地址跳轉到中斷函數執行中斷函數中斷返回。也就是說在STM32的內置的Flash中有一個中斷向量表來存放各個中斷服務函數的入口地址,內置Flash的分配情況大致如下圖。

2f561e92-0359-11ee-90ce-dac502259ad0.png

在只有一個程序的情況下,程序執行的走向應該如圖所示。

2f6c17d8-0359-11ee-90ce-dac502259ad0.png

STM32F10x有一個中斷向量表,這個中斷向量表存放在代碼開始部分的后4個字節處(即0x0800 0004),代碼開始的4個字節存放的是堆棧棧頂的地址,當發生中斷后程序通過查找該表得到相應的中斷服務程序入口地址,然后再跳到相應的中斷服務程序中執行。上電后從0x08000004處取出復位中斷向量的地址,然后跳轉到復位中斷程序的入口(標號①所示),執行結束后跳轉到main函數中(標號②所示)。

在執行main函數的過程中發生中斷,則STM32強制將PC指針指回中斷向量表處(標號③所示),從中斷向量表中找到相應的中斷函數入口地址,跳轉到相應的中斷服務函數(標號④所示),執行完中斷函數后再返回到main函數中來(標號⑤所示)。

若在STM32F103x中使用IAP方案,則內置的Flash分配情況大致如下圖

2f90259c-0359-11ee-90ce-dac502259ad0.png

在內置的Flash里面添加一個BootLoader程序,BootLoader程序和user application各有一個中斷向量表,假設BootLoader程序占用的空間為N+M字節,則程序的走向應該如下圖所示。

2fa21400-0359-11ee-90ce-dac502259ad0.png

上電初始程序依然從0x08000004處取出復位中斷向量地址,執行復位中斷函數后跳轉到IAP的main(標號①所示),在IAP的main函數執行完成后強制跳轉到0x08000004+N+M處(標號②所示),最后跳轉到新的main函數中來(標號③所示),當發生中斷請求后,程序跳轉到新的中斷向量表中取出新的中斷函數入口地址,再跳轉到新的中斷服務函數中執行(標號④⑤所示),執行完中斷函數后再返回到main函數中來(標號⑥所示)。

對于步驟④⑤,網友認為是:“在main執行的過程中,如果CPU得到一個中斷請求,PC指針仍強制跳轉到地址0x08000004中斷向量表處,而不是新的中斷向量表,如圖標號④所示,程序再根據我們設置的中斷向量表偏移量,跳轉到對應中斷源新的中斷服務程序中,如圖標號⑤所示”。我對此的理解是:“當發生中斷后,程序從0x08000004(舊)處的中斷向量表中得到相應的中斷服務函數入口地址,繼而跳轉到相應的中斷服務程序”。但是舊的中斷向量列表里邊存放的是IAP程序中斷函數的入口地址,它是如何得到user程序中斷函數的入口地址呢?所以我覺得此種說法是錯誤的。“當發生中斷時PC指針強制會跳轉到0x08000004處”這種說法并沒有錯,只是忽略了后續的一些知識要點而導致這個說法出現矛盾。

對于步驟④⑤我認為的是,在main函數的執行過程中,如果CPU得到一個中斷請求,PC指針本來應該跳轉到0x08000004處的中斷向量表,由于我們設置了中斷向量表偏移量為N+M,因此PC指針被強制跳轉到0x08000004+N+M處的中斷向量表中得到相應的中斷函數地址(待求證),再跳轉到相應新的中斷服務函數,執行結束后返回到main函數中來。

三、實現過程

STM32F103ZET6的Flash地址為0x08000000—0x0807 FFFF共512KB,把這512KB的空間分為兩塊,第一塊大小為32KB存放BootLoader程序,剩余的空間存放用戶程序(根據實際情況分配這兩塊空間的大小,BootLoader程序占用的空間越小越好,則BootLoader地址為0x08000000—0x08007fff,用戶程序地址為0x08008000—0x0807ffff。BootLoader流程圖大致應該如下:

1、初始化時鐘

2、初始化中斷向量表地址

3、初始化按鍵(使用按鍵觸發方式,上電時如果按鍵被按下則進行用戶程序更新操作)

4、初始化串口

5、檢測按鍵是否被按下,是則執行步驟6,否則執行步驟10

6、擦除用戶程序(擦除0x08008000—0x0807ffff地址空間Flash)

7、從串口讀取新的用戶代碼數據,把代碼寫入用戶程序空間

8、檢測串口數據接收完畢?是則執行步驟9,否則跳回步驟7

9、用戶程序更新完畢,等待重新上電或硬件復位

10、跳轉到用戶程序(強制將PC指針跳轉到0x08008000+4處)

到這里首先要解決的問題就有:

1、如何進行對STM32的Flash進行擦除和寫入操作

2、中斷向量表偏移如何設置

3、如何改變代碼存放的地址空間(因為BootLoader要存放在0x08000000處,用戶程序要存放在0x08008000處,而默認的代碼存放的地址空間為0x08000000)

4、怎么進行PC指針的強制跳轉,跳轉時需要做些什么

5、串口接收的用戶代碼數據是什么樣的代碼數據,是一種什么樣的文件

問題的解決:

1、使用STM32的固件庫函數,只需調用幾個庫函數即可輕松解決,使用的固件庫為stm32f10x_flash.c文件,對Flash的操作過程簡要為:Flash解鎖Flash擦除Flash寫入Flash上鎖。

①解鎖:

FLASH_Unlock();//解鎖Flash
FLASH_SetLatency(FLASH_Latency_2);//因為系統時鐘為72M所以要設置兩個時鐘周期的延時

②擦除:

for(i=0;i<240;i++)
{
if(FLASH_ErasePage(FLASH_ADDR+i*2048)?!=?FLASH_COMPLETE)//一定要判斷是否擦除成功
return?ERROR;
}

說明:FLASH_ErasePage(uint32_t Page_Address)即為Flash擦除操作,按頁擦除,每頁2KB,Page_Address為頁的起始地址,如0x08000000是第一頁起始地址,0x08000800為第二頁起始地址,這里的操作擦除了0x08008000—0x0807ffff地址空間的Flash。

③寫入:

unsignedcharbuf[1024];//假設待寫入的代碼數據
unsignedshorttemp;//臨時數據
for(i=0;i<512;i++)
{
??temp?=?(buf[2*i+1]<<8)?|?buf[2*i];//2個字節整合為1個半字
??if(FLASH_ProgramHalfWord(ADDR,temp)?!=?FLASH_COMPLETE)//判斷是否寫入成功
??{
????????Return?ERROR;
??}
??ADDR?+=2;//地址要加2,因為每次寫入的是2個字節(1個半字)
}
??

說明:因為STM32的Flash寫入為雙字節(1個半字)寫入,FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)函數即為對地址為Address寫入1個半字的Data,每次寫入完成后地址要加2。

④上鎖:

FLASH_Lock();//Flash 上鎖,一個固件庫函數即可實現。

2、關于中斷向量表的偏移設置,對于BootLoader程序只需設置中斷向量表的指向在0x08000000處,對于用戶程序需要設置中斷向量表的指向在0x08008000處即可。

①在BootLoader程序的中斷向量表指向設置中應有這么一句:

NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//設置中斷向量表指向

其中NVIC_VectTab_FLASH是個宏定義,的值為0x08000000。

②在用戶程序的中斷向量表指向設置用應有這么一句:

NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x8000);//設置中斷向量表指向

四、結束語

總的來說STM32的IAP方案實現需要在進行用戶程序之前加一段Bootloader程序,BootLoader程序的作用就是:

1、什么都不做,直接跳轉到用戶程序。

2、刪除原有的用戶程序,讀取*.bin文件數據并將數據重新寫入新的用戶程序。對于用戶程序相比普通的編程只需要做三步改動即可

3、改變中斷向量表。

4、改變代碼存放的地址空間

5、修改生成*.bin文件

使用通過UART的IAP方案并不是很好的選擇,這只是IAP方案的一個機制,因為能使用PC機通過串口升級程序,同樣能通過Jlink燒寫程序,并且自定義的串口通訊協議在沒有校CRC校驗的情況下不能及時發現數據傳輸過程發生的錯誤。這里推薦使用SD卡(或U盤)進行用戶程序更新,將*.bin文件復制到SD卡(或U盤)中,STM32再通過讀取SD卡(或U盤)的*.bin文件進行用戶程序更新,這也避免了STM32與PC笨重的通訊,只需插一個SD卡(或U盤)更顯得人性化一些,但需要去弄懂STM32如何與SD卡(或U盤)的通訊。




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    16398

    瀏覽量

    178544
  • 存儲器
    +關注

    關注

    38

    文章

    7514

    瀏覽量

    164001
  • STM32F103ZET6
    +關注

    關注

    9

    文章

    67

    瀏覽量

    21157
  • STM32芯片
    +關注

    關注

    0

    文章

    38

    瀏覽量

    4396

原文標題:給你的代碼升個級?—IAP

文章出處:【微信號:pzh_mcu,微信公眾號:痞子衡嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    STM32IAP方案

    源取出對應的中斷向量執行中斷服務程序。最后還需要知道關鍵的一點,通過修改STM32工程的鏈接腳本可以修改程序文件寫入閃存的起始地址。在STM32微控制器上實現IAP
    發表于 03-13 16:38

    轉:STM32IAP方案

    STM32微控制器的時鐘系統、GPIO、定時器、中斷系統、異步串口以及內置可編程flash等設備的應用,作為一個綜合性實驗的同時還具有很強的“實用”意義。這個示例就是STM32IAP方案
    發表于 06-07 16:33

    STM32IAP方案

    情況,而且若使用遠距離或無線的數據傳輸方案,甚至可以實現遠程編程和無線編程。這絕對是ICP或ISP技術無法做到的。某種微控制器支持IAP技術的首要前提是其必須是基于可重復編程閃存的微控制器。S
    發表于 07-19 16:04

    STM32IAP方案

    STM32IAP方案幾乎所有的同類書籍都介紹綜合性的應用示例如“萬年歷 + 溫度顯示 + 鬧鐘響鈴 + 計時表”這樣的一個實時時鐘范例或“STM32 + 音頻解碼 + 大容量存儲
    發表于 08-25 09:44

    STM32IAP方案

    STM32微控制器的時鐘系統、GPIO、定時器、中斷系統、異步串口以及內置可編程flash等設備的應用,作為一個綜合性實驗的同時還具有很強的“實用”意義。這個示例就是STM32IAP方案
    發表于 09-13 16:15

    STM32IAP方案

    STM32微控制器的時鐘系統、GPIO、定時器、中斷系統、異步串口以及內置可編程flash等設備的應用,作為一個綜合性實驗的同時還具有很強的“實用”意義。這個示例就是STM32IAP方案
    發表于 09-18 15:52

    STM32IAP方案

    STM32微控制器的時鐘系統、GPIO、定時器、中斷系統、異步串口以及內置可編程flash等設備的應用,作為一個綜合性實驗的同時還具有很強的“實用”意義。這個示例就是STM32IAP方案
    發表于 04-13 15:16

    STM32IAP方案

    STM32IAP方案幾乎所有的同類書籍都介紹綜合性的應用示例如“萬年歷 + 溫度顯示 + 鬧鐘響鈴 + 計時表”這樣的一個實時時鐘范例或“STM32 + 音頻解碼 + 大容量存儲
    發表于 10-14 14:57

    STM32IAP方案分享

    用遠距離或無線的數據傳輸方案,甚至可以實現遠程編程和無線編程。這絕對是ICP或ISP技術無法做到的。某種微控制器支持IAP技術的首要前提是其必須是基于可重復編程閃存的微控制器。STM32
    發表于 07-06 04:07

    STM32是如何實現IAP功能的

    STM32實現IAP功能的學習筆記最近因項目需求要實現STM32的在線升級即IAP功能,先將這幾
    發表于 08-11 08:07

    使用 USART 實現 STM32F40x/STM32F41x 的 IAP

    使用 USART 實現 STM32F40x/STM32F41x 的 IAP
    發表于 01-25 16:07 ?16次下載

    使用STM32單片機實現IAP的詳細資料說明

    本文檔的主要內容詳細介紹的是使用STM32單片機實現IAP的詳細資料說明。先說一下實現的功能 IAP程序的功能
    發表于 05-17 18:04 ?28次下載
    使用<b class='flag-5'>STM32</b>單片機<b class='flag-5'>實現</b><b class='flag-5'>IAP</b>的詳細資料說明

    STM32--STM32F051 IAP實現

    一、IAP原理及過程《正點原子--STM32F10x串口IAP實驗》《stm32f030 IAP》《ST
    發表于 11-29 15:06 ?33次下載
    <b class='flag-5'>STM32--STM32</b>F051 <b class='flag-5'>IAP</b>的<b class='flag-5'>實現</b>

    STM32通過IAP實現固件升級的分析與示例

    大部分MCU都可以通過IAP對片內flash進行讀寫來實現固件升級。這里主要是STM32如何實現IAP升級。不同內核的
    發表于 12-14 18:50 ?11次下載
    <b class='flag-5'>STM32</b>通過<b class='flag-5'>IAP</b><b class='flag-5'>實現</b>固件升級的分析與示例

    STM32實現IAP功能的學習筆記

    最近因項目需求要實現STM32的在線升級即IAP功能,先將這幾天的學習體會和IAP的具體實現總結出來,分享給大家,希望對同樣
    發表于 12-27 18:41 ?11次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>實現</b><b class='flag-5'>IAP</b>功能的學習筆記
    主站蜘蛛池模板: 日韩欧美高清色码| 午夜免费网址| 欧美特黄特色aaa大片免费看| 天天摸天天| 久久综合视频网| 91久久福利国产成人精品| 欧美xingai| 日本欧美一区二区三区不卡视频 | 欧美刺激午夜性久久久久久久| 女人夜夜春| 国产资源在线播放| 999色综合| 日本在线一本| 啪啪免费视频网站| 青青热久免费精品视频在线观看 | 亚久久| 中国一级特黄真人毛片| 天堂资源在线播放| 欧美一级色| 国产精品久久久精品视频| 五月天综合婷婷| 福利片在线播放| 清冷双性被cao的合不拢腿| 亚洲一级毛片免观看| 青娱乐99| 99视频全部免费| 激情五月激情综合| 欧美一区二区视频三区| 四虎永久在线精品国产免费 | 婷婷在线综合| 久久久噜噜噜久久| 亚洲黄色网址| 性欧美高清极品猛交| 国产精品一久久香蕉产线看| 四虎在线免费视频| 很黄很色网站| 人人天天爱天天做天天摸| 中文字幕一区在线| 四虎最新免费网址| 国产三级国产精品| 黄网在线观看免费|