STC51单片机IAP升级

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档



前言

大家好,最近在搞一个stc的51单片机在线iap升级项目,也是第一次搞iap升级,途中遇到很多的问题,也不清楚怎么进行iap升级,一直就在百度,请教别人,搞了两三个星期终于搞出来了,最开始是想要两个app左右切换升级的,但是由于一这个项目上位机不能动的原因就做一个app,所以记录这次项目的问题,有错的地放多多指出 


提示:以下是本篇文章正文内容,下面案例可供参考


一、iap升级是什么?

IAP(In Application Program)在应用编程允许用户直接在应用程序中直接对程序进行编程。因此我们可以利用IAP功能实现程序的远程更新。STC采用的方式则是对单片机进行IAP分区。在此需要了解STC如何对整个单片机的FLASH进行分区的。 

个人理解就是单片机能接收数据给自己下载更新程序,iap升级并不是所有都支持,要看芯片是否支持iap功能


二、使用步骤

我们知道,iap升级包括最基本的两个程序,一个是boot程序,用来引导启动,接收数据,flash擦除与写入,没有这些功能,你就没法进行升级,boot程序是必须要有的,第二个则是app程序了,你要运行的程序,要升级的程序。我做的芯片是stc8h3k64s4的芯片,他有64kflash,也可以全部设置为eeprom。通过串口接收数据升级 ,通过串口接收上位机的数据,写进flash,接收到结束命令时跳转到app应用 地址进行执行程序。

程序流程 :


1.boot程序与分区

1.boot程序区分配大小的3.5k,记录一些升级状态标志位的0.5k,app区就存放0x1000开始的后面64k的空间,iap擦除的的扇区每次是512字节,所以要分配好地址,要保存的保存,擦除的擦除

0x0000-0xDFF0x0e00-0x0FFF0x1000-0xFFFF
boot区升级数据状态保存区app区

2.设置中断重映射;

51单片机的中断地址是固定的,并没有像32那样能进行重映射, 那我们可以在产生中断时进入固定的中断地址中再跳转到相应的中断服务函数地址。

汇编的中断地址重映射,在51单片机的启动文件中用汇编做地址映射,相应的指令就不说了,自行百度 ,转移的地址是你app的首地址加上每个中断的偏移量。当进入中断 

boot与app地址的跳转,用函数指针的方式,((void (code *) (void)) 0x1000) (); 将地址0x1000强转为函数指针进行调用,跳转到该地址执行启动文件,初始化堆栈。

 


2.app程序设置

1.设置启动文件的启动地址,启动地址就是app地址改为1000H

 

2,设置代码存放地址空间,起始地址也是0x1000,大小就最小都要比程序大

 

 

3.设置中断偏移,偏移后就是重映射的地址。

打开.m51后缀的文件,用keil打开你可以看到相应的函数名存放的地址空间,看到是从1000开始的,编译出来的函数存放的地址,这个函数地址信息会编译进去bin文件,这也是我将这设置在1000地址的程序工程下载到第二个app地址8000时运行不了的原因,这些函数的地址信息已经写进bin文件里面了,程序运行时调用时就根据地址信息调用,下载到别的空间地址就对应不上了,下载到相应地址的app要设置相应的地址

 上电时执行的第一个函数1235地址的,上图可以看出1235地址的正是c51启动文件,161b是串口1中断函数地址,13d8是time中断函数地址

 

 

app运行过程中接收到升级命令时,往升级状态的flash写进升级标志,然后跳转到boot程序,可以用((void (code *) (void)) 0x0000) ()函数指针跳转或者软件复位都可以。


 


总结

 总体来说,iiap升级你要知道单片机程序的启动过程,还有就是如何进行地址跳转,中断的偏移与重映射,初次搞这个,还是有很多的不懂,还是多多请教大家。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值