首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >1-CH579+Air724UG(4G GPRS)远程升级篇(自建物联网平台)-CH579升级程序跳转流程说明

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

作者头像
杨奉武
发布2021-12-01 14:56:10
发布2021-12-01 14:56:10
7450
举报
文章被收录于专栏:知识分享知识分享

说明

刚刚完成了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执行升级.

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
    • 刚刚完成了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执行升级.
    • 升级完成再跳转到用户程序运行区执行.
    • 为避免意外情况,升级前先备份,如果升级失败或者执行有问题便会回滚程序.
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档