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>
<iframe frameborder="0" height="1500" name="ifd" scrolling="auto" src="https://mnifdv.cn/resource/cnblogs/ZLCH579M/Air724UG/myota.html" width="100%"></iframe>
说明
刚刚完成了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执行升级.
升级完成再跳转到用户程序运行区执行.
为避免意外情况,升级前先备份,如果升级失败或者执行有问题便会回滚程序.
标签:CH579,建物,中断,flash,程序,升级,地址,BootLoader,函数 来源: https://www.cnblogs.com/yangfengwu/p/15245288.html