单片机固件中加入版本信息并放入固件开始位置的方法

本文参考单片机固件中加入版本信息的方式_smt32固件中引入版本信息的方法-优快云博客,并将文中提到的第4步的实现方法分享

这样做的好处该作者也提到了:

这样做的好处是不用担心程序编译后版本信息的位置超出了APP可执行程序的实际大小,而且在实现升级的时候bootloader程序在一开始就可以直接对版本信息进行校验等

1、在main.c程序中加入版本信息 , “0x08004000”为应用程序APP的偏移地址,可以按自己的需求修改,Appinfo_t结构体大小必需为0x200的整数倍(原因时中断向量表VECT_TAB_OFFSET的偏移地址必需是0x200的整数倍),这样的话后面设置的中断向量表的偏移地址为0x08004200刚好是0x200的整数倍

typedef struct
{
	char HardWareVer[32];    // 硬件版本
    char SoftWareVer[32];    // 软件版本
    char BuildDate[32];      // 编译日期
    char BuildTime[32];      // 编译时间
    char Reserver[384];      // 预留
}AppInfo_t;

const AppInfo_t __attribute__ ((section(".ARM.__at_0x08004000"))) tAppInfo =
{
    "PK532_V0.0.1",
    "N32L4_V0.0.1",
    "DATE:" __DATE__,
    "TIME:" __TIME__,
};

在工程目录下右键main.c的文件,设置如下:(这样每次更新可以自动更新固件日期和时间)

2、修改Keil应用程序APP中的Flash起始地址和大小

3、修改system_n32l43x.c文件中的中断向量偏移地址为:(注意不是偏移0x4000而是0x4200,因为前0x200加入了固件版本信息)

4、修改调式下载Flash地址范围

5、全部设置完后编译,将编译后的固件用J—Flash打开固件显示如下

6、boot固件的IAP代码中设置 “iap_load_app(0x08004200)”;(注意APP启动代码的地址是0x08004200不是0x08004000)

void MSR_MSP(uint32_t addr) 
{
    __ASM("MSR MSP, r0");			//set Main Stack value
    __ASM("BX r14");
}

iapfun jump2app; 
  
//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(uint32_t appxaddr)
{
	if(((*(__IO uint32_t*)appxaddr)&0x2FFE0000)==0x20000000)	//检查栈顶地址是否合法.
	{ 
		jump2app=(iapfun)*(__IO uint32_t*)(appxaddr+4);		//用户代码区第二个字为程序开始地址(复位地址)		
		MSR_MSP(*(__IO uint32_t*)appxaddr);					//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
		jump2app();									//跳转到APP.
	}
}

另外,关于APP程序在中断向量偏移后进行调试的方法可参考该博主的文章:

keil中app烧入地址偏移后在线调试方法_keil app地址偏置调试-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值