stm32 OTA空中升级详解

        主要呢还是记录下自己最近调试这OTA升级前的 boot和app程序的问题。

        首先这个东西在三四年前就已经调试过了 最近项目又遇到了 所以在这里做一个记录 一是巩固下 二是有些坑在第一次的时候没有出现 但是这个问题也容易忽视

        在我们boot的代码中 经常看到一个函数是JumpToAPP(),这个函数名字呢不固定 但是都是一样的内容。代码部分我就不贴出来了,百度上一大堆。我简述一下这个函数的具体流程。

if(((*(volatile uint32_t *)APP_START_ADD) & 0x2FFE0000) != 0x20000000)
    {
        return;
    }

这个函数是检测栈顶指针的合法性的,但是这个地方有时候会return 我今天也找了很多原因,最开始的时候APP_START_ADD这个是0x08005000  我用他去&0x2FFE000 去查看结果 发现这个APP_START_ADD一直是0 但是我觉得不用重视这个问题 因为这个可能是你app或者boot部分有些函数导致的,比如我之前boot里面写了一个内部flash擦除函数 就会导致这个问题 只要你设置的APP_START_ADD是0x0800xxxx 应该都没有问题

    ptop = *(volatile u32 *)(APP_START_ADD + 4);
    APP = (FunAPP)ptop;
    __set_MSP(*(volatile u32 *)APP_START_ADD);
    APP();

这几行代码主要就是一个+4的疑问,APP_START_ADD : 0x8005000 为我们应用程序区的起始地址,APP_START_ADD +4是因为ARM内核中段向量表第四位为Reset Handler,使BOOT程序直接跳入应用程序区内。还有就是app()这个函数很多初学者看不懂,是因为这是一个函数指针,外部是一个函数指针的define,如typedef void (*FunAPP)(void);这个地方,大家就当做一个函数入口就行,目的就是跳转。

        在我们的app代码中,你需要找到一个名叫SystemInit的函数,这里面有一个宏定义是没有define,

L284行 这句话就是我们app程序第一件事 就是设置中断向量表的便宜 可以直接在你app代码的main函数最开始去设置它,

#define ROM_START 0x0800000UL

SCB->VTOR = ROM_START | 0x5000;
    __enable_irq();

我看了很多教程说的是在设置之前需要关总中断 但是我目前没有 __disable_irq();也正常  这个后续再去研究。

        最后一点就是在boot和app的keil工程中呢 ,点击魔法棒,设置一下两个代码去的地址如图:

最后提醒下大家 如果代码要去修改内部flash内容 记得unlock之后再修改 否则会导致正在运行代码崩溃。

        我今天遇到的问题是我上述设置好后,但是我仿真我的app程序失败 用f10单步调试就是崩溃 原因找了好久,原来是我在下载app部分的时候把boot代码部分擦除了 但是我在魔法棒里面选择的是部分擦除 我最后改成不擦除就可以正常跳转了。这个问题我目前还不知道原因为什么部分擦除变成的全部擦除。

教大家一个小方法,在仿真的时候快速查看你的内部flash如图输入你自己需要查看的地址 如0x08000000和0x08005000.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值