编程语言
首页 > 编程语言> > 1-CH579+Air724UG(4G GPRS)远程升级篇(自建物联网平台)-CH579升级程序跳转流程说明

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