stm32 IAP程序烧写方案

最近做了一个飞行器,感觉使用jlink仿真器下载更新程序好复杂,每次都需要把一个大块头(Jlink)挂到飞行器上,操作极为不便,网上查了一下,stm32的程序烧写方式一共有三种

(1)使用Jlink,JTAG等仿真器;这种方式简单快捷

(2)使用系统自带bootloader,ISP,这种方式需要更改stm32boot0 boot1引脚,以更改启动方式。

(3)使用ISP,即 in application programming,这种方式利用stm32的任意一个通讯端口,如spi,iic,can,usart等来更新程序。可以方便快捷的烧写程序到flash中,前提是要自己编写加载程序,即bootloader。我的初步计划是用蓝牙+串口来烧写更新程序。

IAP---》APP模式工作流程分析

(1)系统上电-;

(2)bootloader加载程序;

(3)等待10s钟以等待串口发送程序

(4)若串口发送过来程序,此时更新程序(将接收到的程序烧写到指定的flash中),然后在跳转到正常程序;若无程序更新,则跳转到正常程序

(5)正常程序接收到串口命令要求reset_cpu,此时stm32复位,运行bootloader,按(2)往下循环执行。



注意事项:

(1)正常程序的flash起始地址需要给一个偏移量

(2)中断向量表也需要给一个偏移量;这样才能从中断向量表中找到中断服务程序入口地址,第一个执行的程序是Reset_Handler();

(3)系统复位后执行过程:启动---从中断向量表取复位中断入口地址,执行复位中断服务程序---跳转到main函数开始执行程序。


补充:昨天在F103上试验成功后,又开始把程序移植到STM32F405上,无奈flash操作不一样,lz修改了之后还是不能奏效。后来查到st公司官网上有关于stm32F4系列的iap程序using usart,下载了调试了,程序写的移植性性很好,但是令我郁闷的是,使用串口调试工具和secureCRT都无法将bin文件传输到下位机,最后发现网上有人讲的,必须使用超级终端(HyperTerminal),于是乎下载了一个试了一下,选择Ymodem,终于出现了期待已久的program succeeded;但是又有一个问题困扰到了我,为毛app程序没有按照我的要求来执行?LED灯没有闪烁,后来发现是中断在搞怪,也就是说app程序中的中断开了之后,会有问题,于是我在初始化中不打开中断,也就是先不使用中断,结果证明程序工作正常,终于离结果又近了一步!

接下来就是要把中断向量的问题搞定,让app程序能够正常work。 

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

纠结了一阵之后,突然发现,还是app程序的中断偏移没有设置好,因为我的NVIC_SetVector(base,offset)卸载了system_init()函数之前,但是system_init()中又对中断向量作了初始化,所以我写的偏移根本没有起作用!修改回来后,app工作一切正常。

为了方便大家学习,我把我的资料上传,包括iap,app,下载工具,说明书,注意事项等内容。

下载地址:http://my.csdn.net/?ref=toolbar

有什么问题可以联系我:qq406124065.希望我们一起学习交流进步。



你可能感兴趣的:(编程)