<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執行升級.
升級完成再跳轉到用戶程序運行區執行.
為避免意外情況,升級前先備份,如果升級失敗或者執行有問題便會回滾程序.