1-CH579+Air724UG(4G GPRS)遠程升級篇(自建物聯網平台)-CH579升級程序跳轉流程說明


<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLCH579M/Air724UG/myota.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

 

說明

剛剛完成了CH579單片機的升級的最基本的流程,由於流程過於繁瑣

這節詳細的說明一下為何會有這么繁瑣的流程......

這節代碼不是完整的代碼不能使用到項目,只是為了訴說流程!

 

推薦使用ST-Link 進行下載

 

 

 

工程說明

要想實現完整可靠穩定的升級這個單片機,需要3套程序才能完成.

主要原因是該單片機沒有設置中斷向量偏移的方法,只能在其中一個程序里面轉過去...

具體會在后面敘述.

 

 

開始測試

1.首先下載base程序到開發板

 

 

 

2.然后下載BootLoader程序到開發板

 

 

下載完BootLoader就可以看見運行BootLoader程序打印的日志

 

 

 

3.最后下載UserApp程序到開發板

 

 

下載完用戶程序就可以看見運行用戶程序打印的日志

 

 

 

提示

三套程序加載順序是base加載BootLoader, BootLoader加載UserApp

 

補充知識點

1.使用UltraEdit軟件(其它可以打開bin文件的也可以)打開base程序里面的bin文件

 

 

 

 

 

 

2.打開CH579M數據手冊,找到中斷向量表

 

 

2.從表格中得知flash的0x00000004-0x00000007保存的是復位中斷函數地址

 

 

3.從bin數據中得知復位中斷函數地址是 35 01 00 00

 

 

4.然后呢

如果程序復位,程序就會根據flash的0x00000004-0x00000007地址得到復位中斷函數的地址,然后就去執行這個函數.

同理: 

如果定時器0要執行中斷,程序就會根據flash的0x00000040-0x00000042地址得到定時器0中斷函數的地址,然后就去執行這個函數.

 

 

 

 

現在看跳轉程序的流程

一開始的時候說了,這個單片機無法設置中斷偏移,所以單片機就會在默認的flash地址里面找中斷函數.

 

1.base程序里面設置好了所有用到的中斷回調函數

 

 

 

2.我在flash的第2560地址里面寫了個0x55555555

 

 

 

3.然后呢加載程序

 

 

 

注意看哈.

一開始我在flash的2560地址寫了個0x55555555

這里把flash的2560地址里面的數取出來,

下面判斷取出來的數是不是0x55555555, 當然是啦

所以跳轉的程序地址是0xC00

 

 

 

4.打開BootLoader程序的配置頁面

BootLoader程序設置的就是運行在flash的0xC00這個地址上,所以呢下載完base,再下載完BootLoader以后就運行了BootLoader程序

 

 

 

再補充個知識點

1.使用UltraEdit軟件(其它可以打開bin文件的也可以)打開BootLoader程序里面的bin文件

 

 

 

 

 

 

 

2,說明

BootLoader程序和base程序一樣也有一份中斷函數的地址.

同樣,AD 0C 00 00 也是BootLoader程序中復位中斷函數地址

不過記住哈,BootLoader程序是從flash的0xC00開始存儲的,

這個單片機因為沒有設置中斷偏移的地方,所以咱這個地方的函數哈不采取措施是永遠不會執行的......

常理來說,既然跳轉到了BootLoader程序了就應該運行BootLoader里面的中斷函數.

但是中斷發生的時候都跑到base里面運行去了.......

 

 

現在看如何把中斷函數轉到BootLoader里面去的

1.假設執行了不可屏蔽中斷

上面說了哈,所有的中斷都會到base里面運行

 

 

 

2.能力有限就直接說了哈

1.把整個bin數據作為一個數組看(數組是4字節的)

 

 

 

 

 

2.整個的呢是一個數組,這個數組記錄的是地址,數組的基地址是JumpNext()得到的,也就是0xC00

如果數組下標是0,那么就是把flash地址0xC00里面的地址取出來作為函數執行

如果數組下標是2,那么就是把flash地址0xC08里面的地址取出來作為函數執行

 

 

 

 

3.查看一下NonMaskableInt_IRQn的值

 

 

 

 

 

4.  -14+16就是 2

 

 

 

 

5.  所以如果來了不可屏蔽中斷,會執行base函數里面的NMI_Handler中斷函數

然后接着呢把flash地址0xC08里面的地址取出來作為函數執行

 

 

 

0xC08正好記錄的是BootLoader程序里面的不可屏蔽中斷函數地址

 

 

 

 

 

 

現在看如何把中斷函數轉到UserApp里面去的

1.打開BootLoader程序里面的這個位置

 

 

 

 

 

 

 

 

 

 從上面可以看到,在跳轉到用戶程序之前,把在flash的2560地址里面記錄的值改為了0xAAAAAAAA

然后跳轉到用戶程序里面執行去了

 

 

2.假設現在來了不可屏蔽中斷了

由於現在flash的2560地址里面的數不是0x55555555了,所以就返回了0x8400

中斷執行和上面說的一樣,就去到0x8400這個地址里面去找中斷執行了

 

 

 

2.其實0x8400是用戶程序的運行地址

 

 

這些地址呢都是咱配置完flash分配以后讓程序計算的

 

 

 

 

Flash分配情況

單片機有基本的250K可以使用

 

 

 

我把前3K作為了base程序使用,然后剩余的做了如下分配

 

 

 

結語

這節只是稍微簡介一下這個單片機的升級跳轉流程.

拋去base程序,其實就是下面的樣子

正常情況下在運行區運行用戶程序,需要升級的時候跳轉到BootLoader執行升級.

升級完成再跳轉到用戶程序運行區執行.

為避免意外情況,升級前先備份,如果升級失敗或者執行有問題便會回滾程序.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM