打印

有没有CY的IAP方案

[复制链接]
806|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
PSoC4也是M3内核,不知道有没有大神做过IAP的方案,可以学习学习
沙发
huihui520|  楼主 | 2015-3-30 19:42 | 只看该作者
IAP,全称是“In-Application Programming”,中文解释为“在程序中编程”。IAP是一种对通过微控制器的对外接口(如USART,IIC,CAN,USB,以太网接口甚至是无线射频通道)对正在运行程序的微控制器进行内部程序的更新的技术(注意这完全有别于ICP或者ISP技术)。ICP(In-Circuit Programming)技术即通过在线仿真器对单片机进行程序烧写,而ISP技术则是通过单片机内置的bootloader程序引导的烧写技术。无论是ICP技术还是ISP技术,都需要有机械性的操作如连接下载线,设置跳线帽等。若产品的电路板已经层层密封在外壳中,要对其进行程序更新无疑困难重重,若产品安装于狭窄空间等难以触及的地方,更是一场灾难。但若进引入了IAP技术,则完全可以避免上述尴尬情况,而且若使用远距离或无线的数据传输方案,甚至可以实现远程编程和无线编程。这绝对是ICP或ISP技术无法做到的。某种微控制器支持IAP技术的首要前提是其必须是基于可重复编程闪存的微控制器。STM32微控制器带有可编程的内置闪存,同时STM32拥有在数量上和种类上都非常丰富的外设通信接口,因此在STM32上实现IAP技术是完全可行的。

使用特权

评论回复
板凳
huihui520|  楼主 | 2015-3-30 19:43 | 只看该作者
实现IAP技术的核心是一段预先烧写在单片机内部的IAP程序。这段程序主要负责与外部的上位机软件进行握手同步,然后将通过外设通信接口将来自于上位机软件的程序数据接收后写入单片机内部指定的闪存区域,然后再跳转执行新写入的程序,最终就达到了程序更新的目的。

在STM32微控制器上实现IAP程序之前首先要回顾一下STM32的内部闪存组织架构和其启动过程。STM32的内部闪存地址起始于0x8000000,一般情况下,程序文件就从此地址开始写入。此外STM32是基于Cortex-M3内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动。而这张“中断向量表”的起始地址是0x8000004,当中断来临,STM32的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。最后还需要知道关键的一点,通过修改STM32工程的链接脚本可以修改程序文件写入闪存的起始地址。

使用特权

评论回复
地板
huihui520|  楼主 | 2015-3-30 19:43 | 只看该作者
在STM32微控制器上实现IAP方案,除了常规的串口接收数据以及闪存数据写入等常规操作外,还需注意STM32的启动过程和中断响应方式。图1显示了STM32常规的运行流程。

使用特权

评论回复
5
huihui520|  楼主 | 2015-3-30 19:44 | 只看该作者
stm32

EECOL_2013Dec31_CTR_TA_01_7.jpg (20.11 KB )

EECOL_2013Dec31_CTR_TA_01_7.jpg

使用特权

评论回复
6
huihui520|  楼主 | 2015-3-30 19:44 | 只看该作者
对图1解读如下:

1、 STM32复位后,会从地址为0x8000004处取出复位中断向量的地址,并跳转执行复位中断服务程序,如图1中标号(1)所示。

2、 复位中断服务程序执行的最终结果是跳转至C程序的main函数,如图1中标号(2)所示,而main函数应该是一个死循环,是一个永不返回的函数。

3、 在main函数执行的过程中,发生了一个中断请求,此时STM32的硬件机制会将PC指针强制指回中断向量表处,如图1中标号(3)所示。

4、 根据中断源进入相应的中断服务程序,如图1中标号(5)所示。

5、 中断服务程序执行完毕后,程序再度返回至main函数中执行,如图1中标号(6)所示。
若在STM32中加入了IAP程序,则情况会如图2所示。

使用特权

评论回复
7
huihui520|  楼主 | 2015-3-30 19:45 | 只看该作者
ltu2

IAP2-243x300.jpg (18.94 KB )

IAP2-243x300.jpg

使用特权

评论回复
8
huihui520|  楼主 | 2015-3-30 19:48 | 只看该作者
从上述两个过程的分析可以得知,对将使用IAP过程写入的程序要满足2个要求:

1、新程序必须从IAP程序之后的某个偏移量为x的地址开始;

2、必须将新程序的中断向量表相应的移动,移动的偏移量为x;

而设置程序起始位置的方法是(keil uvision4集成开发环境)在工程的“Option for Target….”界面中的“Target”页里将“IROM”的“Start”列改为欲使程序起始的地方,如图3中将程序起始位置设为0x8002000。

使用特权

评论回复
9
huihui520|  楼主 | 2015-3-30 20:03 | 只看该作者
将中断向量表移动的方法是在程序中加入函数:

1
void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);
其中参数NVIC_VectTab为中断向量表起始位置,而参数Offset则为地址偏移量,如将中断向量表移至0x8002000处,则应调用该函数如下:

1
void NVIC_SetVectorTable(0x8000000, 0x2000);
同时有必要提醒读者注意的是,此函数只会修改STM32程序中用于存储中断向量的结构体变量,而不会实质地改变中断向量表在闪存中的物理位置,详情请研究该程序原型。

有了以上准备后就可以着手设计一个IAP方案了,如下:

1、STM32复位后,利用一个按键的状态进行同步,当按键按下时表示将要进行IAP过程;

2、IAP过程中,通过上位机软件向STM32的USART1设备发送所要更新的程序文件,STM32接收到数据后转而从0x8002000地址开始写入收到的数据;

3、STM32借助定时器来判断数据是否完全接收,完全接收后IAP过程结束;

4、再次复位后,跳转0x8002004地址开始运行新写入的程序;

最后提出几点注意事项:

1、利用IAP写入的程序文件最好是.bin格式的文件,但不能是.hex格式的文件;

2、向STM32发送程序文件时尽量慢一些,因为STM32对FLASH的写入速度往往跟不上通讯外设接口的速度;

3、建议在STM32和上位机之间设计一套握手机制和出错管理机制,这样可以大幅提高IAP的成功率;

使用特权

评论回复
10
huihui520|  楼主 | 2015-3-30 20:03 | 只看该作者
这是一个STM32的例程,不知道CY的怎么样?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

706

帖子

2

粉丝