由于本人項目需要,要做STM8L052R8的bootloader,用于遠程程序升級功能,為了安全考慮,不使用ST自帶的bootloader,而是自制bootloader。
基本的功能是這樣的,首先程序運行在一個V1.0的版本上,且帶了BOOT,當程序收到一條命令后,程序跑入死循環,等待硬件看門狗復位;程序復位后進入bootload區,等待第二條命令的接收,接收到正確的數據幀后,bootloader開始擦除FLASH,并接收數據包,直到最后一個數據包接收完畢,通過指示燈以2HZ的頻率閃爍,指示升級完成。
第一步:boot區程序設計,首先修改link文件,
define region NearFuncCode = [from 0x8000 to 0xAFFF];
define region FarFuncCode = [from 0x8000 to 0xAFFF];
define region HugeFuncCode = [from 0x8000 to 0xAFFF];
place at start of NearFuncCode { block INTVEC };
以上是link文件部分,可以看出flash地址為0x8000開始,結束于0x17FFF; 長度為64kB,中斷向量地址為0x8000,這樣,知道了這個我們就可以修改BOOT程序的link和主程序的link了,這里我把BOOTLOAD區劃分為8K,應用區為48K設置link文件如下,這樣把boot區和APP區分開,互不干擾,你也可以根據需要調整他們的大小。
program:
define region NearFuncCode = [from 0xB000 to 0xFFFF];
define region FarFuncCode = [from 0xB000 to 0xFFFF]| [from 0x10000 to 0x17FFF];
define region HugeFuncCode = [from 0xB000 to 0x17FFF];
place at start of NearFuncCode { block INTVEC };
bootload:
define region NearFuncCode = [from 0x8000 to 0xAFFF];
define region FarFuncCode = [from 0x8000 to 0xAFFF];
define region HugeFuncCode = [from 0x8000 to 0xAFFF];
place at start of NearFuncCode { block INTVEC };
像STM32這樣的芯片中斷向量地址可以任意定,所有boot區和APP區都可以使用中斷,且互不干擾,但是STM8的中斷向量表固定在0X8000地址,不能修改,所以BOOT區不能開中斷,否則會和APP區的中斷打架,但是APP區的一但開啟中斷后就會跳轉到0x8000地址,這樣就跳到了BOOT區,因此需要使用跳轉指令將中斷跳回到APP區,
__root const long reintvec[]@".intvec"=
{ 0x82008080,0x8200b004,0x8200b008,0x8200b00c, //當應用程序地址不是0xB000時則要相應改掉除第一個
0x8200b010,0x8200b014,0x8200b018,0x8200b01c, //0x82008080以外的數值
0x8200b020,0x8200b024,0x8200b028,0x8200b02c,
0x8200b030,0x8200b034,0x8200b038,0x8200b03c,
0x8200b040,0x8200b044,0x8200b048,0x8200b04c,
0x8200b050,0x8200b054,0x8200b058,0x8200b05c,
0x8200b060,0x8200b064,0x8200b068,0x8200b06c,
0x8200b070,0x8200b074,0x8200b078,0x8200b07c,
};
這里大概的含義就是重定義STM8的中斷,STM8中斷向量重定義,至于這里為什么這樣寫,請網上自己去看,我也不是很清楚。
第二步:芯片上電后,從bootload start 跳轉到 program start
當我們上電時,我們往往不需要用到bootload ,但是程序起來就先跑到ROM的起始地址,因此需要做一個跳轉從bootload start 跳轉到 program start。設計如下
asm("LDW X, SP ");
asm("LD A, $FF");
asm("LD XL, A ");
asm("LDW SP, X ");
asm("JPF $B000");
這里我們用B000,表示上電以后BOOT區沒有接收到升級請求則直接跳轉到APP區,0XB000是我的APP的起始地址,你可以根據自己的要求定義。
第三步:在線擦寫flash
void Boot_EraseChip(void)
{
U16 usCnt;
/* Define flash programming Time*/
FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);
Boot_UnLock();
/*擦除FLASH*/
LED_ALARM_H();
LED_RUN_L();
for(usCnt = USER_FLASE_ALL_OF_BLOCK;usCnt >0;usCnt-- )
{
HD_Clear_WDT();
FLASH_EraseBlock(USER_FLASH_START_BLOCK+(usCnt-1), FLASH_MemType_Program);
/* Wait until End of high voltage flag is set*/
while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET)
{}
}
LED_ALARM_L();
LED_RUN_H();
Boot_Lock();
}
這個函數里面我的BOOT程序一旦接收到升級命令后,先將FLASH擦除,這里用到了一個庫函數,STM8 的lib 庫里面有stm8l15x_flash.h stm8l15x_flash.c
這個文件里面有一段注釋,如下所示,意思是要使用flash的擦寫,必須要在stm8l15x.h里面定義
#define RAM_EXECUTION (1) ,flash 擦寫的函數都是定義在ram地址中的,所以在這些函數前都有個in_ram
* To enable execution from RAM you can either uncomment the following define
* in the stm8l15x.h file or define it in your toolchain compiler preprocessor
* - #define RAM_EXECUTION (1)
并且由于 stm8的庫對不同芯片處理不同,還需要定義你使用的芯片型號,這里我用的芯片是
STM8L052,因此使用的宏為 :
#define STM8L05X_HD_VL
這樣就可以調用擦寫函數去升級APP程序了,其他的工做就是在BOOT 區進行數據的收發等待,數據校驗等工做了,沒什么特別的東西。不管用什么芯片,只要是FLASH是分塊的,都可以做boot,去加載APP。
上一篇:STM8使用自帶的bootloader
下一篇:STM8問題總結
推薦閱讀
史海拾趣
Electron Products Inc(簡稱EPI)成立于XXXX年,由一群對電子技術充滿熱情的工程師共同創立。初期,公司主要從事電子產品的設計和研發,致力于為小型企業和消費者提供高質量的電子產品。通過不斷創新和優化產品,EPI逐漸在市場上樹立了自己的品牌形象。
方舟公司高度重視產品品質管理,從原材料采購到生產加工,再到成品檢驗,每一個環節都嚴格把關。公司引進了先進的生產設備和檢測儀器,建立了完善的質量管理體系。通過ISO9001質量管理體系認證,方舟公司的產品質量得到了有效保障,贏得了客戶的信賴和支持。
1998年,Epic Games發布了一款名為“虛幻”的3D第一人稱射擊游戲。這款游戲不僅游戲內容新穎,更引人注目的是它背后完全自主開發的3D游戲引擎。這個引擎后來被稱為“虛幻引擎”,并成為了Epic Games的核心技術之一。隨著游戲的成功,虛幻引擎也逐漸受到了業界的關注。許多其他游戲開發商開始采用這款引擎來開發自己的游戲,從而使得Epic Games在游戲引擎領域取得了顯著的商業成功。
除了自主研發和收購外,CSR plc還積極與其他企業進行技術合作與轉讓。例如,2012年7月,三星電子以3.1億美元的價格收購了CSR Plc的無線技術部門,包括該部門的310名員工和相關的21項技術專利。這次技術合作不僅為CSR plc帶來了可觀的收益,也推動了整個行業的技術進步和發展。
通過以上五個故事,我們可以看到CSR plc在電子行業中的發展歷程充滿了創新與挑戰。從初創時期的音頻技術突破,到后來的多元化發展、重要收購和技術合作,CSR plc不斷適應市場變化,拓展業務領域,最終在電子行業中取得了顯著的地位和成就。
西鐵城公司的歷史可以追溯到1881年,由日本商人戶田清創立。最初,公司名為“戶田時計商店”,主要從事時計的維修和銷售業務。然而,隨著時間的推移,戶田清意識到僅僅依靠維修和銷售并不能滿足市場的需求,于是公司開始致力于制造自己的鐘表產品。這一轉變不僅擴大了公司的業務范圍,也為西鐵城日后在電子行業中的崛起奠定了基礎。
Renesas Electronics的前身可以追溯到1958年,當時日立制作所成立了半導體部門。隨著技術的不斷進步和市場的擴大,該部門逐漸發展壯大,成為日立公司內的一個重要業務部門。進入20世紀90年代,隨著半導體市場的競爭加劇,日立公司決定將半導體業務獨立出來,以便更加靈活地應對市場變化。1999年,日立半導體部門正式更名為ELANTEC,開始了獨立發展的道路。
第一個WINCE的項目,有兩個問題要請教大家。 前提是,我只負責軟件部分。 1 分辨率問題 顯示屏幕尺寸是640*480,我做的程序要滿屏幕顯示。我在模擬器上通過GetClientWindow確定了窗口大小為640*480.而且我還通過MoveWindow,再次將窗口設置為0,0, ...… 查看全部問答∨ |
|
LIB_VER2.0.LIB(1): error C100: unprintable character 0x07 skipped LIB_VER2.0.LIB(1): error C141: syntax error near \',\' LIB_VER2.0.LIB(2): error C100: unprintable character 0xFD skipped LIB_VER2.0.LIB(3): error C129: missing \ ...… 查看全部問答∨ |
|
講解430的書現在也有很多了,不過大多數都是詳細說明底層硬件結構的,看了不免有些空洞和枯燥,我認為了解一個MCU的操作首先要對其基礎特性有所了解,然后再仔細研究各模塊的功能。 1.首先你要知道msp430的存儲器結構。典型微處理器的結構有兩 ...… 查看全部問答∨ |