• 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执行升级.

    升级完成再跳转到用户程序运行区执行.

    为避免意外情况,升级前先备份,如果升级失败或者执行有问题便会回滚程序.

  • 相关阅读:
    HTML学习笔记Day16
    HTML学习笔记Day15
    HTML学习笔记Day14
    三角形
    三级菜单
    开关制作源代码
    HTML标签
    弹性盒模型
    怪异盒模型
    实验7:Problem F: STL——字典
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/15245288.html
Copyright © 2020-2023  润新知