iap学习

bootloader程序设计:
1.确定存放APP程序的首地址  
#define FLASH_APP_ADDR 0x08003C00 //应用程序起始地址
2.将接收到的程序镜像写入到Flash中
3.跳转到新程序运行
if ((((__IO uint32_t)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) ------1
{
//关闭中断
__disable_irq();
//跳转至用户代码
JumpAddress = (__IO uint32_t) (ApplicationAddress + 4);------2
Jump_To_Application = (pFunction) JumpAddress;

        //初始化用户程序的堆栈指针
        __set_MSP(*(__IO uint32_t*) ApplicationAddress);--------3
        Jump_To_Application();
}

1.在程序里#define ApplicationAddress 0x8003000 ,(__IO uint32_t)ApplicationAddress) 即取0x8003000开始到0x8003003 的4个字节的值, 因 为我们的应用程序APP中设置把 中断向量表 放置在0x08003000 开始的位置,中断向 量表里第一个放的就是栈顶地址的值
也就是说,这句话即通过判断栈顶地址值是否正确(是否在0x2000 0000 - 0x 2000 2000 之间) 来判断是否应用程序已经下载了
2.ApplicationAddress + 4 即为0x0800 3004 ,里面放的是中断向量表的第二项“复位地 址”
3.startup_stm32f10x_md_lv. 文件中别名 typedef void (*pFunction)(void); 这个看 上去有点奇怪;正常第一个整型变量 typedef int a; 就是给整型定义一个别名 a
void (pFunction)(void); 是声明一个函数指针,加上一个typedef 之后 pFunction只 不过是类型 void ()(void) 的一个别名

用户App设计:
正常的用户工程设计完成后,对用户的工程和部分代码进行修改来实现IAP方案下的用户APP。关键点在Flash地址的设置和中断偏移量的设置,这两处设置不正确会导致app无法跳转成功。
1、Flash地址设置(这个地址需要和BootLoader中对应)
这里的地址起点与Bootloader的FLASH_APP_ADDR必须一致,与下面的位移偏移量SCB->VTOR也要一致
在这里插入图片描述

2、中断向量表偏移(必须和BootLoader中FLASH_APP_ADDR以及keil设置一样),使能全局中断
在这里插入图片描述

3、通过串口,或者can接收到更新指令后,跳转到bootloader,(BootLoader在跳转前会关闭全局中断)

typedef用法:
typedef 返回类型(*新类型)(参数表)
typedef char (*PTRFUN)(int);
PTRFUN pFun;
char glFun(int a){ return;}
void main()
{
pFun = glFun;
(*pFun)(2);
}
typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种 类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以 像使用int,char一样使用PTRFUN了。第二行的代码便使用这个新类型定义了变量pFun

启动文件:
启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段 时间(称为启动过程)所必须进行的工作
startup_stm32f10x_md_vl.s

1.通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同 时复位后PC指针位于0x2000000处;
2.通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000, 同时复位后PC指针位于0x8000000处;
Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断 入口向量地址,这样在Cortex-M3内核复位后,会自动从起始地址的下一个32位空间 取出复位中断入口向量,跳转执行复位中断服务程序。
在这里插入图片描述
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值