1-CH579+Air724UG(4G GPRS)远程升级篇(自建物联网平台)-CH579升级程序跳转流程说明 2021-12-01 14:56:10 浏览数 (1) 说明刚刚完成了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 004.然后呢如果程序复位,程序就会根据flash的0x00000004-0x00000007地址得到复位中断函数的地址,然后就去执行这个函数.同理: 如果定时器0要执行中断,程序就会根据flash的0x00000040-0x00000042地址得到定时器0中断函数的地址,然后就去执行这个函数.现在看跳转程序的流程一开始的时候说了,这个单片机无法设置中断偏移,所以单片机就会在默认的flash地址里面找中断函数.1.base程序里面设置好了所有用到的中断回调函数2.我在flash的第2560地址里面写了个0x555555553.然后呢加载程序注意看哈.一开始我在flash的2560地址写了个0x55555555这里把flash的2560地址里面的数取出来,下面判断取出来的数是不是0x55555555, 当然是啦所以跳转的程序地址是0xC004.打开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就是 25. 所以如果来了不可屏蔽中断,会执行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执行升级.升级完成再跳转到用户程序运行区执行.为避免意外情况,升级前先备份,如果升级失败或者执行有问题便会回滚程序. flash 单片机 编程算法 0 人点赞 上一篇:分享雷军22年前编写的代码