1.什么是IAP?
IAP:In Application Programming 是指在应用编程,即在程序运行中编程,就是片子提供一系列的机制(硬件/软件上的)当片子在运行程序的时候可以提供一种改变flash数据的方法。通俗点讲,也就是说程序自己可以往程序存储器里写数据或修改程序。这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的ISP功能就是通过IAP技术来实现的,即片子在出厂前就已经有一段小的bootloader程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到存储区。
2.与ISP的区别
在线编程目前有两种实现方法:在系统编程(ISP)和在应用编程(IAP)。ISP一般是通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程,而IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将控制从一个存储体转向另一个。ISP的实现一般需要很少的外部电路辅助实现,而IAP的实现更加灵活,通常可利用单片机的串行口接到计算机的RS232口,通过专门设计的固件程序来编程内部存储器。
3.为什么要用IAP
STM32F1XX单片机在出厂前,固化了ISP自举程序,挺强悍的,至少我觉得,因为人家还自适应波特率呢,才2KByteROM+512ByteRAM。上位机下载软件现成的,也不用自己操心了。不过呢,需要boot0跳线进入,详见文档 RM0008芯片参考手册第2章 和 AN2606系统内存引导模式。那我就要在我明亮的壳子上打个白米粒大的洞,然后就像路由器那样,拿牙签捅啊捅的。还有,就是把HEX文件发布让客户自己升级,感觉不像回事,老板也会担心他们抄东西(其实没有什么是安全的啦)。所以,不需要拆机就能对产品进行固件升级是很多人想要的效果,不仅方便而且节省精力和成本。
4.如何设计IAP
经过上面的介绍我们知道完整的IAP应该包括三个部分:1.boot 2.user app 3.上位机控制端。
在做之前在网上查了很多资料,要不就是空空而谈如何如何实现要不就是只有一个boot代码,就是找不到整套的资料,这可能与整个电子行业的封闭有关。在这方面真的要学学互联网的开源精神。
当然啦,也有很多优秀的文章,这里给大家传送门:
所以我决定将这个项目开源出来,整个项目包括三套代码。
boot部分:可用于stm32f1xx平台,几乎不需要修改代码,只需要根据你的MCU简单的配置一下工程文件就好了。(我的平台是stm32f103ze)
app部分:其实就是你需要实现产品功能的部分。我这里采用了usmart框架,用它的原因主要是方便和boot部分以及上位机部分进行通信。这部分目前做的比较少,之后会将他抽象出来。
上位机部分:前面两个部分运行在MCU内部用的是C编程。这部分运行在windows平台用的是C#,基于 .net4.0。你可以很方便的将它移植到你的项目中。
5.干货在哪里
说了这么多,是时候show my code了。我把代码都托管在github上了(之后会放到csdn上面),每套代码都有说明文档(请按照下述编号看起)。但是文档不够详细,之后会丰富。目前测试的平台比较少,希望大家可以一起来测试提交bug,一起来完善。
6.还需要去做什么
实现aes文件加密
实现一边接收数据一边写入数据
-
实现可更改每包数据大小(目前每包是1024字节)
- 已经实现32Byte、64Byte、128Byte、256Byte、512Byte、1KByte可选(2017.6.11更新)
-
实现蓝牙串口iap
- 我采用HC-08蓝牙透传模块(BLE类型),在32Byte和64Byte的情况下可以实现蓝牙串口iap(跟蓝牙模块有关,建议不要使用BLE类型的,它的延时较高。2017.6.11)
增加spi接口和i2c接口的iap(目前是uart接口)