張思聰+胡社教
摘 要:隨著嵌入式設備的廣泛應用,對嵌入式設備程序升級的要求也越來越高。在探討應用編程(IAP)原理的基礎上,設計一種基于STM32的充電樁系統遠程升級方案。系統闡述了在應用中編程的技術原理以及升級流程,并通過TFTP方案實現了充電樁固件遠程升級。實際應用表明,該方案具有較高的應用價值和推廣價值。
關鍵詞:STM32;Flash;在應用中編程(IAP);遠程升級;充電樁
DOIDOI:10.11907/rjdk.162697
中圖分類號:TP319
文獻標識碼:A 文章編號:1672-7800(2017)007-0077-04
0 引言
隨著新能源電動汽車的推廣與普及,電動汽車配套設施充電樁正在蓬勃發展。當前充電樁的布設往往采取建立充電站的形式,各充電站之間距離遠,充電樁數量多。充電樁設備投入使用后,由于程序本身的漏洞或者用戶新的需求,需要對樁程序進行升級。傳統的升級方法是相關技術人員到現場用代碼燒寫工具對設備進行升級,工作量大,升級過程復雜。本文提出的基于STM32的充電樁遠程升級方案,可以讓用戶通過以太網實現對目標充電樁系統程序的實時更新,提高充電樁系統的可拓展性和可維護性。
1 設計原理
1.1 STM32存儲原理
STM32是一種32位微處理器[1],共有4GB線性地址空間,分為8個存儲塊,每個存儲塊512MB。第一塊為代碼區,用來存儲程序的代碼文件以及常量,主要分為嵌入式閃存、系統存儲區、選項字節等。第二塊內部包含嵌入式SRAM區等,程序的變量以及堆棧存儲在這一塊。不同型號的STM32芯片,閃存存儲器(Flash)容量也不同[2],最小的只有16K字節,最多的能達到1 024K字節[3]。本方案采用的STM32F207微控制器具有1 024K的Flash,起始地址為0x80000000,終止地址為0x080FFFFF,總共分為12個扇區,其中0~3號扇區大小為16K,4號扇區大小為64K,5~11號扇區大小為128K,Flash模塊組織如表1所示。
1.2 IAP原理
IAP(In-Application Programming)是指在用戶程序運行過程中對其Flash區域進行程序燒寫[4],燒寫完成后,運行新的程序,完成升級。要實現IAP功能,需要將項目代碼分成兩部分進行設計。第一部分稱為裝載區,即Bootload區,這一區域程序主要用來判斷設備是否需要進行用戶程序升級并進行相應的跳轉,裝載區代碼必須從Flash首地址開始燒寫。第二部分稱為用戶區,即App區,這一區域用來存放真正的功能代碼。兩部分代碼分別存儲在Flash的不同地址上,設備上電以后系統首先執行裝載區程序,并根據是否需要升級跳轉執行升級代碼或者用戶代碼。在實際設計過程中,可以設計多個App區,以防止在升級失敗時系統可以運行之前的程序。
2 IAP的實現
2.1 裝載程序
裝載程序是IAP實現過程中最重要的一步,在進行裝載程序設計時,需要保證邏輯清晰、代碼簡明。當設備上電開始運行時,系統從Flash的首地址即0x8000000開始執行裝載程序。首先完成的是STM32的初始化工作,包括堆棧和內核的初始化。接著讀取存儲器中的用戶升級標志位[5],若標志位為0x55,則說明沒有升級請求,程序跳轉執行用戶區代碼;若標志位為0xAA,說明有升級請求,需要對用戶程序進行更新,接下來要對時鐘和外設進行相應的初始化,并在主循環中等待用戶程序文件寫入FLash的用戶程序區,接受完成后將用戶升級標志位置為0x55,同時執行軟件復位。整個裝載程序的流程如圖1所示。
要保證裝載程序能夠正常運行,需注意兩個方面:一是在跳轉執行用戶程序時,要將程序指針重定向并指向程序用戶程序起始地址,堆棧指針指向用戶堆棧的起始地址;二是在將用戶程序文件寫入Flash之前需要對Flash進行解鎖并擦除當前Flash區域中的代碼。
2.1.1 跳轉實現
STM32內部通過中斷向量表來響應中斷,程序正常啟動時,將首先從中斷向量表中取出復位中斷向量執行復位中斷程序完成啟動。中斷向量表的起始地址是0x80000004[6],當有中斷來臨時,STM32內部硬件機制會將PC指針強制指向中斷向量表處,并根據中斷源取出對應中斷向量執行中斷服務程序。加入IAP以后,如果沒有升級請求,程序需跳轉執行用戶代碼,啟動流程如圖2所示。
(1)STM32復位后,從0x80000004取出復位中斷向量的地址,并跳轉到復位中斷服務程序,在執行完中斷復位程序之后跳轉到IAP的main函數當中。
(2)在執行完IAP以后(如果需要新的用戶代碼寫入Flash或者沒有更新直接跳轉,用戶代碼的復位中斷向量起始地址應為0x80000004+N+M)跳轉至用戶程序的復位中斷向量表。
(3)取出用戶程序的復位中斷向量地址,并跳轉執行新程序的復位中斷服務程序,隨后跳轉至新程序的main函數。
(4)在main函數死循環(while(1))中,如果有中斷請求,應注意在Flash上有兩個中斷向量表,PC指針被強制跳轉到地址0x80000004中斷向量地址處,而不是用戶程序的中斷向量表。
(5)程序再根據設置的中斷向量偏移量,跳轉到對應中斷源的用戶中斷服務程序中。
(6)執行完中斷服務程序后,程序返回main函數繼續執行。跳轉部分的代碼如下:
//定義pFunction為函數指針數據類型
typedef void (*pFunction)(void);
//定義Jump_To_Application為函數指針
pFunction Jump_To_Application;
//定義一個32位的跳轉地址
uint32_t JumpAddress;
//取出存儲器中的升級標志位
Flag=Rx1_Buffer[0];
//判斷是否需要升級
If(Flag==0x55)
{
//判斷用戶的棧定地址值是否在,0x20000000~0x20002000之間
if(((*(__IOuint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
//取復位地址
JumpAddres = *(__IO uint32_t*) (USER_FLASH_FIRST_PAGE_ADDRESS + 4);
//強制轉化為函數指針
Jump_To_Application = (pFunction)JumpAddress;
//將用戶代碼的棧頂地址設為棧頂指針
_set_MSP(*(_IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);
//設置程序指針為復位地址
Jump_To_Application();
}
}
2.1.2 Flash編程
在進行IAP過程中,接收到的數據必須寫入STM32的Flash中。在對STM32的Flash進行擦除或者寫操作時,必須先打開內部的RC振蕩器(HSI),然后對Flash編程控制器進行解鎖,再對需要寫入數據的Flash扇區進行擦除操作,最后進行寫操作。需要注意的是,在寫操作完成后必須對Flash編程控制器進行鎖定[7-8]。具體實現Flash編程代碼如下:
//初始化Flash,包括打開RC振蕩器和解鎖Flash編程控制器
FLASH_If_Init();
//擦除從USER_FLASH_FIRST_PAGE_ADDRESS開始的指定扇區
FLASH_If_Erase(USER_FLASH_FIRST_PAGE_ADDRESS);
//從Flash_Write_Address地址開始將數據寫入扇區,數據為data_buffer,寫入的長度為count
FLASH_If_Write(&Flash_Write_Address, data_buffer ,count)
2.2 用戶程序
用戶程序是一套完整的可以獨立運行的程序,它除了實現特定的目標功能外,還要求能夠接受升級指令并且跳轉至裝載程序[9]。從圖2可以看出,在IAP過程結束后,Flash上存儲了包括裝載程序和用戶程序在內的兩張“中斷向量表”,即有兩個中斷向量起始地址。在用戶程序正常運行過程中,如果有中斷請求,PC指針被強制跳轉到地址0x80000004中斷向量地址處,而不是用戶程序的中斷向量表,這就造成了中斷向量表的起始地址和用戶程序的中斷處理程序之間出現了偏移量。因此,需要對用戶程序的中斷向量偏移量進行重定向,即配置向量表偏移量寄存器[10]。用戶程序中可以通過以下代碼對中斷向量偏移量進行設置:
//VectTab 起始地址,Offset 偏移量
Void NVIC_SetVectorTable(u32_t VectTab, u32_t Offset)
用戶程序在初始化過程中完成中斷向量偏移量的重定向,然后執行相應的功能。在主函數運行過程中利用中斷或者輪詢接收遠程升級指令,在接收到遠程升級指令后,用戶程序會根據自身工作狀態選擇是否進行升級,若狀態允許,則改變升級標志位并寫入存儲器,同時進行軟件復位,使系統開始執行裝載程序。整個用戶程序流程圖如圖3所示。
3 實際應用
在實際應用中,采用一種基于TFTP(簡單文件傳輸協議)的IAP方案,它廣泛應用于嵌入式應用當中并且通過以太網實現對充電樁的遠程升級。這種升級方案運行在Lwip協議棧上,Lwip協議棧是瑞典計算機科學院開發的TCP/IP協議套件的一種輕量級實現,減少了內存使用率和代碼大小,適合資源有限的嵌入式系統。
簡單文件傳輸協議(TFTP)是工作在UDP傳輸層上的一種簡單的文件傳輸協議。它基于客戶端/服務器架構體系,文件傳輸是從TFTP客戶端發起的,TFTP客戶端向TFTP服務器發送讀或寫請求。當服務器確認請求以后,文件數據傳輸開始,數據按照固定大小的數據塊發送,一般是512字節的數據塊。必須在每個傳輸的數據塊被接收端響應以后,發送端才能發送下一個數據塊,這種回應機制是通過隨每個數據塊一起發送的數據塊編號來實現的。當檢測到接收的數據塊大小小于固定數據塊大小時,表示文件傳輸結束。TFTP包格式如圖4所示。
TFTP操作碼如表2所示。
在對充電樁的遠程升級過程中,充電樁作為TFTP服務器,接受PC客戶端發來的寫請求。服務器將接收到的數據寫入STM32的用戶Flash區,當接收到的數據塊小于512個字節時,可以判斷文件傳輸結束,此時修改升級標志位并重啟MCU完成升級過程。使用TFTP實現IAP操作的流程圖如圖5所示。
4 結語
本文設計并實現了基于STM32控制器的充電樁遠程升級系統,介紹了STM32的存儲原理、應用編程(IAP)原理以及IAP實現過程中的重要技術,實現了基于TFTP協議的遠程升級。通過以太網進行遠程升級與傳統嵌入式設備的程序升級方式相比具有較大的優勢,能有效節約時間,降低人員成本,提高系統的可擴展性和可維護性,具有較高的推廣價值。
參考文獻:
[1]Joseph Yiu.宋巖譯.ARM Cortex-M3權威指南[M]. 北京:北京航空航天大學出版社,2009.
[2]意法半導體(中國)投資有限公司.STM32參考手冊[EB/OL].www.stmcu.org,2009.
[3]黃智偉,王兵,朱衛華.STM32F32位ARM微控制器應用設計與實踐[M].北京:北京航空航天大學出版社,2012:3-4.
[4]姜曉梅,李祥和,任朝榮,等.基于ARM的在線及遠程升級技術[J].計算機應用,2008(2):519-521.
[5]闕凡博.基于stm32的程序遠程升級設計[J].儀器儀表用戶,2013(5):90-92.
[6]蒙博宇.STM32自學筆記[M].北京:北京航空航天大學出版社,2012:395-399.
[7]STM32F2x7 in application programming(IAP) over ethernet[Z].STMicroelectronics,2011.
[8]孫偉,郭寶亮,陳龍.便攜式水聽器測試儀的研究與實現[J].儀器儀表學報,2011,32(2):375-380.
[9]李興鶴,蔡亮,宋吉波,等.STM32用戶基于IAP的程序更新技術[J].單片機與嵌入式系統應用,2012(1):74-75.
[10]張巖松,葛俊鋒,葉林,等.基于STM32的程序遠程升級設計與實現[J].電子設計工程,2016(1):131-134.