STM32F10X的IAP编程详解——开发指南
轉:http://blog.sina.com.cn/s/blog_b315f69b0102whtg.html
這篇文章摘自STM32開發指南,偶然在網上翻到了一次,經典的文章和大家一起分享。
IAP(?In Application Programming)即在應用編程,?IAP?是用戶自己的程序在運行過程中對User Flash?的部分區域進行燒寫,目的是為了在產品發布后可以方便地通過預留的通信口對產
品中的固件程序進行更新升級。 通常實現IAP?功能時,即用戶程序運行中作自身的更新操作,
需要在設計固件程序時編寫兩個項目代碼,第一個項目程序不執行正常的功能操作,而只是通
過某種通信方式(如?USB、USART)接收程序或數據,執行對第二部分代碼的更新;第二個項目
代碼才是真正的功能代碼。這兩部分項目代碼都同時燒錄在?User Flash?中,當芯片上電后,首
先是第一個項目代碼開始運行,它作如下操作:
1)檢查是否需要對第二部分代碼進行更新
2)如果不需要更新則轉到?4)
3)執行更新操作
4)跳轉到第二部分代碼執行
第一部分代碼必須通過其它手段,如?JTAG?或?ISP?燒入;第二部分代碼可以使用第一部分代碼IAP?功能燒入,也可以和第一部分代碼一起燒入,以后需要程序更新是再通過第一部分?IAP代碼更新。我們將第一個項目代碼稱之為?Bootloader?程序,第二個項目代碼稱之為?APP?程序,他們存放在?STM32 FLASH?的不同地址范圍,一般從最低地址區開始存放?Bootloader,緊跟其后的就是APP?程序(注意,如果?FLASH?容量足夠,是可以設計很多?APP?程序的,這里只討論一個?APP?程序的情況)。這樣我們就是要實現?2?個程序:Bootloader?和?APP。STM32?的?APP?程序不僅可以放到?FLASH?里面運行,也可以放到?SRAM?里面運行,這里,我們將制作一個APP,用于?FLASH運行。我們先來看看?STM32?正常的程序運行流程,如圖?53.1.1?所示:
圖53.1.1 STM32?正常運行流程圖
STM32?的內部閃存(?FLASH)地址起始于?0x08000000,一般情況下,程序文件就從此地址開始寫入。此外STM32 F10X是基于?Cortex-M3?內核的微控制器,其內部通過一張“中斷向量表”來響應中斷,程序啟動后,將首先從“中斷向量表”取出復位中斷向量執行復位中斷程序完成啟動,而這張“中斷向量表”的起始地址是0x08000004,當中斷來臨,?STM32?的內部硬件機制亦會自動將?PC?指針定位到“中斷向量表”處,并根據中斷源取出對應的中斷向量執行中斷服務程序。
在圖?53.1.1?中,?STM32?在復位后,先從?0X08000004?地址取出復位中斷向量的地址,并跳轉到復位中斷服務程序,如圖標號①所示;在復位中斷服務程序執行完之后,會跳轉到我們的main?函數,如圖標號②所示;而我們的main?函數一般都是一個死循環,在?main?函數執行過程中,如果收到中斷請求(發生重中斷),此時STM32?強制將?PC?指針指回中斷向量表處,如圖標號③所示;然后,根據中斷源進入相應的中斷服務程序,如圖標號④所示;在執行完中斷服務程序以后,程序再次返回main?函數執行,如圖標號⑤所示。
當加入?IAP?程序之后,程序運行流程如圖?53.1.2?所示:
圖53.1.2?加入?IAP?之后程序運行流程圖
在圖?53.1.2?所示流程中,?STM32?復位后,還是從?0X08000004?地址取出復位中斷向量的地址,并跳轉到復位中斷服務程序,在運行完復位中斷服務程序之后跳轉到IAP?的?main?函數,如圖標號①所示,此部分同圖53.1.1?一樣;在執行完?IAP?以后(即將新的?APP?代碼寫入?STM32的FLASH,灰底部分。新程序的復位中斷向量起始地址為?0X08000004+N+M),跳轉至新寫入程序的復位向量表,取出新程序的復位中斷向量的地址,并跳轉執行新程序的復位中斷服務程序,隨后跳轉至新程序的?main?函數,如圖標號②和③所示,同樣?main?函數為一個死循環,并且注意到此時?STM32?的FLASH,在不同位置上,共有兩個中斷向量表。在?main?函數執行過程中,如果CPU?得到一個中斷請求,?PC?指針仍強制跳轉到地址0X08000004?中斷向量表處,而不是新程序的中斷向量表,如圖標號④所示;程序再根據我們設置的中斷向量表偏移量,跳轉到對應中斷源新的中斷服務程序中,如圖標號⑤所示;在執行完中斷服務程序后,程序返回?main?函數繼續運行,如圖標號⑥所示。通過以上兩個過程的分析,我們知道?IAP?程序必須滿足兩個要求:
1) 新程序必須在?IAP?程序之后的某個偏移量為?x?的地址開始;
2) 必須將新程序的中斷向量表相應的移動,移動的偏移量為?x;
1.APP?程序起始地址設置方法
隨便打開一個之前的實例工程,點擊?Options for Targe-> Target選項卡,如圖所示:
?
?
圖53.1.3 FLASH APP Target?選項卡設置 ????默認的條件下,圖中?IROM1?的起始地址(?Start)一般為?0X08000000,大小(Size)為0X80000,即從0X08000000?開始的512K?空間為我們的程序存儲(假設使用的STM32F103ZET6,其?FLASH大小是?512K)。而圖中,我們設置起始地址(?Start)為0X08010000,即偏移量為?0X10000(?64K字節),因而,留給?APP?用的?FLASH?空間(?Size)只有0X80000-0X10000=0X70000(?448K?字節)大小了。設置好?Start?和Szie,就完成APP?程序的起始地址設置。2.中斷向量表的偏移量設置方法
之前我們講解過,在系統啟動的時候,會首先調用?systemInit?函數初始化時鐘系統,同時systemInit?還完成了中斷向量表的設置,我們可以打開?systemInit?函數,看看函數體的結尾處有這樣幾行代碼:
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET;
?
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
?
#endif
從代碼可以理解,VTOR寄存器存放的是中斷向量表的起始地址。默認的情況VECT_TAB_SRAM?是沒有定義,所以執行SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;對于?FLASH APP,我們設置為FLASH_BASE+偏移量0x10000,所以我們可以在FLASH APP?的main?函數最開頭處添加如下代碼實現中斷向量表的起始地址的重設:
SCB->VTOR = FLASH_BASE | 0x10000;
以上是FLASH APP?的情況,當使用SRAM APP?的時候, 我們設置起始地址為:SRAM_bASE+0x1000,同樣的方法,我們在?SRAM APP?的?main?函數最開始處,添加下面代碼:
SCB->VTOR = SRAM_BASE | 0x1000;
這樣,我們就完成了中斷向量表偏移量的設置。
通過以上兩個步驟的設置,我們就可以生成?APP?程序了,只要?APP?程序的?FLASH?大小不超過我們的設置即可。不過?MDK?默認生成的文件是.hex?文件,并不方便我們用作?IAP更新,我們希望生成的文件是.bin?文件,這樣可以方便進行?IAP?升級,這里我們通過?MDK?自帶的格式轉換工具?fromelf.exe,來實現.axf文件到.bin?文件的轉換。該工具在?MDK?的安裝目錄\ARM\BIN40文件夾里面。
fromelf.exe?轉換工具的語法格式為:?fromelf [options] input_file。其中?options?有很多選項可以設置?.
本章,我們通過在?MDK?點擊?Options for Targe->USER選項卡,在
?
通過這一步設置,我們就可以在?MDK?編譯成功之后,調用?fromelf.exe(注意,我的?MDK是安裝在D:\Keil3.80A?文件夾下,如果你是安裝在其他目錄,請根據你自己的目錄修改fromelf.exe的路徑),根據當前工程的?TEST.axf(如果是其他的名字,請記住修改,這個文件存放在?OBJ?目錄下面,格式為?xxx.axf),生成一個?TEST.bin?的文件。并存放在?axf文件相同的目錄下,即工程的?OBJ?文件夾里面。在得到.bin?文件之后,我們只需要將這個?bin?文件傳送給單片機,即可執行?IAP?升級。
最后再來APP?程序的生成步驟:
1)????設置?APP?程序的起始地址和存儲空間大小
?對于在?FLASH?里面運行的APP?程序,?我們可以按照圖53.1.3?的設置。
2)????設置中斷向量表偏移量
這一步按照上面講解,重新設置?SCB->VTOR?的值即可。
3)????設置編譯后運行?fromelf.exe,生成.bin?文件.
通過在User?選項卡,設置編譯后調用?fromelf.exe,根據.axf?文件生成.bin?文件,用于IAP?更新。
以上?3?個步驟,我們就可以得到一個.bin?的?APP?程序,通過?Bootlader?程序即可實現更新。
參考類似文章:http://bbs.elecfans.com/jishu_422057_1_1.html?(包含中斷向量表詳解)
總結
以上是生活随笔為你收集整理的STM32F10X的IAP编程详解——开发指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分区工具PQ
- 下一篇: 风口的猪-中国牛市(小米2016校招)