引 言
Cortex-M3是首款基于ARMv7-M體系結(jié)構(gòu)的32位標準處理器,RISC結(jié)構(gòu),,包含高效靈活的Thumb-2指令集,,擁有杰出的低功耗特性,為微控制器系統(tǒng),、汽車車身控制系統(tǒng),、工業(yè)控制系統(tǒng)和無線網(wǎng)絡(luò)等嵌入式應(yīng)用量身設(shè)計。ST公司推出基于Cortex-M3內(nèi)核的STM32系列處理器,,憑借其出眾的性能,、創(chuàng)新的外設(shè)、優(yōu)越的功耗控制,,得到眾多工程師的青睞,。
針對嵌入式應(yīng)用的特點,STM32處理器提供功能強大的硬件調(diào)試接口——JTAG接口和串行接口,,極大方便了設(shè)計,,縮短了產(chǎn)品的開發(fā)周期。不僅如此,,STM32處理器內(nèi)嵌的閃存存儲器允許在電路編程(In-Circuit Pro-gramming,,ICP)和在應(yīng)用中編程(In-Application Program-ming,IAP),。利用在應(yīng)用中編程,,僅需通過一根串口線,就可以完成產(chǎn)品固件的更新,。本文對STM32處理器的在應(yīng)用中編程進行了詳細的分析,,結(jié)合硬件和驅(qū)動給出了IAP的具體實現(xiàn)方法,稍加修改,,便可應(yīng)用于STM32處理器的所有系列產(chǎn)品,。
1 STM32F10x處理器
1.1 STM32處理器特點
STM32全系列處理器具有腳對腳、外設(shè)及軟件的高度兼容性,。這給應(yīng)用帶來很好的靈活性,,易于將應(yīng)用升級到不同存儲空間或不同封裝的平臺。STM32處理器的產(chǎn)品全系列兼容,,使得項目之間的代碼重用和移植很方便,。
1.2 STM32處理器內(nèi)存映射
Cortex-M3的存儲系統(tǒng)采用統(tǒng)一編址的方式,程序存儲器、數(shù)據(jù)存儲器,、寄存器被組織在4 GB的線性地址空間內(nèi),,以小端格式(little-endian)存放。內(nèi)存映射如圖1所示,。
在代碼區(qū),,0x00000000地址為啟動區(qū)。上電以后,,CPU從這個地址開始執(zhí)行代碼0x08000000為用戶Flash的起始地址,,0x1FFFF000為系統(tǒng)存儲器(system memory)的起始地址。對于STM32處理器,,可以通過配置BOOT0和BOOT1兩個引腳來選擇不同的啟動模式,,如表1所列。CPU在時鐘信號的第4個上升沿鎖存BOOT引腳的值,,根據(jù)兩個引腳的值將對應(yīng)的存儲器物理地址映射到啟動區(qū),。
系統(tǒng)存儲器也稱為“大信息塊”,有2 KB的容量,。所有上市的STM32處理器,,在出廠前已經(jīng)燒寫進去自舉模式下的啟動程序(Bootloader),并且將之鎖定防止用戶擦寫,。通過配置BOOT0和BOOT1選擇系統(tǒng)存儲器啟動,,相應(yīng)的啟動程序在復(fù)位后得以執(zhí)行,,配合PC端的通信軟件,,通過USART1口允許用戶將程序燒寫到用戶Flash區(qū)。之后,,將BOOT0和B00T1重新配置為用戶Flash存儲器啟動,,進入正常的應(yīng)用程序。
上述的自舉模式類似于ISP編程,,相比其他燒寫方式方便許多,,但真正方便靈活的是在應(yīng)用中編程(IAP),只需一根串口線就可以載入程序,,復(fù)位后立即執(zhí)行新的應(yīng)用程序,。
2 IAP功能原理
在應(yīng)用中編程(IAP)使得用戶可以在程序運行時重新對Flash進行編程。簡單地說,,IAP的編程工作是:下載編譯好的二進制文件數(shù)據(jù)到RAM,;將數(shù)據(jù)重新編程到特定的Flash區(qū)。這兩個工作是由IAP驅(qū)動程序完成的,。使用IAP功能后,,系統(tǒng)的固件由2部分組成:第1部分是IAP驅(qū)動,不執(zhí)行通常的功能,而是通過微控制器支持的任一種通信管道(如USB,、USART,、SPI等,本文使用USART)接收數(shù)據(jù),,并執(zhí)行對第2部分代碼的更新,;第2部分是真正的應(yīng)用程序代碼,實現(xiàn)具體的功能,。這兩部分代碼共同燒寫在Flash中,。要注意的是,這兩部分代碼不能重疊,,否則無法實現(xiàn)IAP功能,。
系統(tǒng)上電以后,IAP驅(qū)動首先運行,,它主要執(zhí)行如下的操作:
?、俑鶕?jù)硬件信號或軟件條件判斷是否需要對第2部分代碼進行更新;
?、谌绻恍枰?,則跳轉(zhuǎn)到④;
?、蹐?zhí)行更新操作,;
④跳轉(zhuǎn)到第2部分代碼執(zhí)行,。
STM3210x處理器IAP驅(qū)動的流程如圖2所示,。圖中顯示IAP主界面是利用超級終端實現(xiàn)的,傳輸協(xié)議用的是Ymodem協(xié)議,。需要注意的是,,由于IAP驅(qū)動占用了用戶Flash區(qū)的一段起始空間,因此Flash的可編程最大空間要把這部分除去,。
3 IAP功能實現(xiàn)
3.1 硬件電路
采用STM32F10x型處理器作為核心,。該處理器可全速工作在72 MHz,擁有3個USART接口,,內(nèi)嵌128 KB Flash和20 KB SRAM,。Flash是以頁的形式組織的,擦除1頁的時間約為20~40 ms,;在整個工作范圍內(nèi)其擦除次數(shù)可達10 000次,,經(jīng)10 000次擦除后,在+55℃的保存環(huán)境中數(shù)據(jù)保存期限仍可達20年,。用戶完全不必擔(dān)心使用了IAP功能后對產(chǎn)品造成不良影響,。
IAP驅(qū)動使用USART1口作為通信管道,,PB口的第9引腳作為IAP判斷是否進入IAP功能的信號線。引出一個按鍵,,作為IAP功能選擇按鍵,,只要在上電或復(fù)位時按住此鍵就會進入IAP功能主界面,否則直接執(zhí)行正常應(yīng)用程序,。BOOT0和BOOT1是啟動配置跳線,。相應(yīng)的硬件電路分別如圖3、圖4和圖5所示,。
3.2 IAP驅(qū)動
IAP驅(qū)動主要包含如下源文件,。
main.c:完成Flash解鎖、按鍵端口初始化,、按鍵判斷,、USART1的初始化以及處理器的始終初始化,另外還初始化指針和跳轉(zhuǎn)到應(yīng)用程序處語句,。然后從common.c執(zhí)行主菜單,。
common.c:顯示主菜單。主菜單上顯示一系列操作,,如加載二進制文件,、執(zhí)行應(yīng)用程序以及禁止寫保護(如果事先Flash被寫保護)。
download.c:等待用戶選擇傳送文件操作,,或者放棄操作以及一些提示信息,,但真正實現(xiàn)傳送的是ymodem.c源文件。
ymodem.c:負責(zé)從超級終端接收數(shù)據(jù)(使用Ymodem協(xié)議),,并將數(shù)據(jù)加載到內(nèi)部RAM中,。如果接收數(shù)據(jù)正常,則將數(shù)據(jù)編程到Flash中,;如果發(fā)生錯誤,,則提示出錯,。
3.3 軟件實現(xiàn)
要實現(xiàn)IAP功能,,還需做一些準備工作:
①要準備BIN類型的代碼文件,。開發(fā)環(huán)境使用的是Keil,,默認情況下Keil生成HEX類型的編譯文件。利用Keil自帶的fromelf.exe工具,,就可以生成二進制文件,。
②對超級終端進行設(shè)置,。IAP驅(qū)動中對USART1的設(shè)置為:波特率為115 200 kb/s,,8位數(shù)據(jù)位,1位停止位,無校驗位和硬件控制,。超級終端也必須保持相同設(shè)置,。
IAP驅(qū)動和應(yīng)用程序代碼需要分配在Flash的合適位置。圖6是2部分代碼在Flash中的存儲情況,。由于IAP驅(qū)動代碼占用8 KB的空間,,故而將Flash最初的8 KB劃出來,應(yīng)用程序是從0x08020000地址處開始存放的,。這是通過在common.h頭文件中語句定義的:
#define ApplicationAddress 0x08020000
也可以定義在其他0x08020000地址后的任何位置,,只要保證應(yīng)用程序大小不超過所用處理器Flash的容量。在platform_config.h頭文件中有定義Flash的語句:
#define PAGE_SIZE(0x400) //Flash頁大小為1 KB
#define FLASH_SIZE(0x20000)//Flash容量為128 KB
STM32F10x處理器有2種Flash頁的大?。? KB和2 KB,。通過以上語句即可定義頁大小。
在platform_config.h頭文件中還定義了進入IAP功能選擇按鍵映射引腳:
IAP驅(qū)動在Keil中編譯,、鏈接后,,利用ARM公司的RealView ULINK2仿真器將生成的HEX文件燒寫到Flash中。此時Keil自帶的Flash燒寫工具要設(shè)置Flash的起始地址為0x08000000,。在應(yīng)用程序中,,定義向量表的函數(shù)NVIC_SetVectorTabl(NVIC_VectTab_FLASH,0x2000)中的第2個參數(shù),,即Flash的偏移量一定要設(shè)置成0x2000或更大的數(shù)值,。同時,F(xiàn)lash燒寫工具也要做相對應(yīng)的設(shè)置,。將系統(tǒng)的串口與PC機串口相連,,打開已經(jīng)設(shè)置好參數(shù)的超級終端。將BOOT0跳線為0,,BOOT1為0或1都可以,。按住IAP功能選擇按鍵,給系統(tǒng)上電,。此時,,在超級終端就會顯示IAP功能主界面,如圖7所示,。
在鍵盤上按1選擇待載入二進制文件,,界面上會出現(xiàn)提示語。在“傳送”菜單中選擇傳送文件后,,只需幾秒鐘可以將6 KB左右的文件燒寫到Flash,。下載完后,在鍵盤上按2或復(fù)位就可以直接執(zhí)行應(yīng)用程序了,,如圖8所示,。雖然IAP功能使用的是USART1口,,但進入應(yīng)用程序后就可以正常使用USART1口。隨時可以通過復(fù)位后按住IAP功能選擇鍵來進行IAP方式燒寫應(yīng)用程序,。
結(jié) 語
STM32F10x處理器性能出眾,,已被廣泛應(yīng)用于各種場合。其IAP功能給用戶帶來了極大方便,,使得產(chǎn)品的固件更新快捷,、簡單。本文闡述了IAP的基本原理,,并詳細描述了如何在STM32F10x處理器平臺中實現(xiàn)IAP功能,,并在所設(shè)計的系統(tǒng)中進行了IAP實驗。實驗證明,,該款處理器的IAP功能可靠,、快捷。