使用stm32f105rct6的can通信做IAP,实现固件的远程更新功能。IAP的实现包括两个程序:BootLoader和应用程序。启动过程先启动BootLoader,等待1s,若接收到烧写指令则开始更新程序,若无指令则启动应用程序。应用程序接收到更新指令后,切换到BootLoader。
远程程序更新需要防止更新失败后,程序卡死,只能通过人工现场更新的情况。可以使用看门狗实现重启返回BootLoader,给重新烧写留出时间。
实现IAP流程,需要的工作包括:
1、规划单片机存储区,设置中断向量位置,生成应用程序bin文件
2、编写BootLoader,实现应用程序切换
3、编写远程更新上位机,实现通信协议
4、插入看门狗程序,实现烧写失败后重启
1、规划单片机存储区,设置中断向量位置,生成应用程序bin文件
stm32f105rct6的flash共256KB,规划flash空间:  
0x08000000~0x08004000 共16KB空间,给BootLoader  
0x08004000~0x08010000 共48KB空间,给应用程序
0x08010000~0x08014000 共16KB空间,保留
0x08014000~0x08018000 共16KB空间,给配置
单片机应用程序在起始地址中的结构,首先是中断向量,然后是代码。
中断向量的结构:开头4字节堆栈指针,接下来是4字节reset函数地址,之后是其他中断函数的地址。
单片机开机后,从0x08000000处取得SP,然后从0x08000004处取得reset地址作为PC,在reset函数中调用main函数,进入C语言控制的程序中。
 
在keil中的options -> target -> IROM 填写应用程序的起始和长度,并在linker -> use memory layout from target dialog中打钩
在应用程序中,调用NVIC函数,设置中断向量位置为0x08004000
生成应用程序的bin文件:
keil中,在options -> user -> after build -> run   中输入指令 
    fromelf.exe --bin -o ..\w01sim\bin\mcubin\canext.bin .\obj\test.axf
2、编写BootLoader,实现应用程序切换
建立一个普通的stm32工程,实现can通信和数据协议、flash烧写等功能,当超时无指令,或烧写成功后,需要进行程序切换。
程序切换时,首先应关闭设备时钟、关闭中断,避免应用程序中未对设备进行初始化,导致boot方式启动与冷启动有功能差别。
切换原理:模拟单片机上电过程,人工设置堆栈指针,调用应用程序入口函数。
切换代码如下:
 void switch_2_addr(u32 *pc) //切换到指定的程序指针
{
u32 i = ;
RCC->APB1RSTR = 0x00000000;//复位结束
RCC->APB2RSTR = 0x00000000; RCC->AHBENR = 0x00000014; //睡眠模式闪存和SRAM时钟使能.其他关闭.
RCC->APB2ENR = 0x00000000; //外设时钟关闭.
RCC->APB1ENR = 0x00000000;
RCC->CR |= 0x00000001; //使能内部高速时钟HSION
RCC->CFGR &= 0xF8FF0000; //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]
RCC->CR &= 0xFEF6FFFF; //复位HSEON,CSSON,PLLON
RCC->CR &= 0xFFFBFFFF; //复位HSEBYP
RCC->CFGR &= 0xFF80FFFF; //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE
RCC->CIR = 0x00000000; //关闭所有中断 NVIC->ICER[] = 0xFFFFFFFF;
NVIC->ICER[] = 0x000007FF;
NVIC->ICPR[] = 0xFFFFFFFF;
NVIC->ICPR[] = 0x000007FF;
for(i = ; i < 0x0B; i++)
{
NVIC->IP[i] = 0x00000000;
}
__ASM volatile("cpsid i"); //关闭所有中断 MSR_MSP(*pc); //堆栈指针是应用程序起始的第一个u32
((void (*)(void))*(pc+))();//入口函数是应用程序起始的第二个u32
}

其中MSR_MSP函数如下:

 __asm void MSR_MSP(u32 addr)
{
MSR MSP, r0 //set Main Stack value
BX r14
}
3、编写远程更新上位机,实现通信协议
上位机实现通信协议:
每个程序具有自己的version,16bit,高1字节为程序代号,低1字节为程序发布版本  
通信的过程:  
1. 控制方发送查询指令,应用程序或BootLoader收到后发送自身version  
2. 控制方发送起始指令,指令中带有长度和crc,应用程序收到后,若不准许,则发不准更新包,若准许,则不响应,直接切入BootLoader  
3. 控制方持续发送起始指令,BootLoader收到后,回复相同canid的包,准许更新  
4. 控制方得到准许后,发送id递增的can包,将bin文件下载到MCU  
5. 发送完成后,控制方额外发送一个can id低16bit为0xffff的包,内容任意,表示结束。BootLoader收到后开始计算crc,若失败,则发失败包。若成功,则开始烧写flash,若烧写失败,发送烧写失败包。  
6. 烧写成功,BootLoader切换到应用程序,此时控制方一直发查询指令,直到应用程序回复版本号正确。  
 4、插入看门狗程序,实现烧写失败后重启
在BootLoader中开看门狗,切换到应用程序后喂狗。若程序烧写失败,则切换到应用程序后程序卡死,导致MCU重启,又进入BootLoader,停留1s,等待下次烧写。

can总线实现stm32的IAP的更多相关文章

  1. STM32的IAP实现

    STM32的IAP实现 2014年07月28日 16:31:06 Stylesen 阅读数:556   IAP,全称是“In-Application Programming”,中文解释为“在程序中编程 ...

  2. STM32的IAP方案

    from:   http://bbs.eeworld.com.cn/thread-294115-1-1.html 几乎所有的同类书籍都介绍综合性的应用示例如“万年历 + 温度显示 + 闹钟响铃 + 计 ...

  3. STM32串口IAP实验笔记

    STM32的IAP功能确实方便,以前对此如何实现有所了解,但是一直没去测试,这两天来练了下,可谓困难重重,搞了两天问题也一一解决,下面做些简要的笔记 IAP就是在线应用编程,方便程序升级,可以不用打开 ...

  4. 关于STM32的IAP与APP互相跳转

    关于STM32的IAP与APP互相跳转 之前做了一个不带系统的IAP与APP互相跳转,在网上找了资料后,很顺畅就完成了,后来在IAR集成开发环境下,IAP无系统,APP用UCOS系统做互相跳转出现了很 ...

  5. stm32实现iap远程固件更新

    前提 想来做iap升级了,应该不是什么新手. 下面的程序需要用到一些简单的功能 串口收发数据开关总中断虽然本文标题是实现远程固件更新,但是具体远程方案本文不做详细说明,重点在于介绍mcu接收到新的固件 ...

  6. STM32串口IAP分享

    什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通 ...

  7. STM32 IAP docs

    /********************************************************************************* * STM32 IAP docs ...

  8. 【转】stm32 IAP升级程序

      一.什么是IAP,为什么要IAP       IAP即为In Application Programming(在应用中编程),一般情况下,以STM32F10x系列芯片为主控制器的设备在出厂时就已经 ...

  9. stm32之存储系统

    一.STM32系统结构 要想深刻理解STM32的存储器,需要首先知道STM32的系统结构. 如Figure 1,是STM32系统结构框图. 根据STM32 Reference manual (RM00 ...

随机推荐

  1. 20145203JAVA课程总结

    20145203盖泽双 <Java程序设计>课程总结 课程总结 (按顺序)每周读书笔记链接汇总 调查问卷:http://www.cnblogs.com/GZSdeboke/p/524832 ...

  2. virtualbox+vagrant学习-2(command cli)-5-vagrant halt命令

    Halt 格式: vagrant halt [options] [name|id] 该命令关闭vagrant管理的正在运行的机器. userdeMacBook-Pro:~ user$ vagrant ...

  3. 真机测试出现INSTALL_FAILED_USER_RESTRICTED安装错误

    之前用小米测试的时候遇到一个问题,两个一样型号的手机一个能直接用Android Studio安装公司的项目一个却不可以,总是报INSTALL_FAILED_USER_RESTRICTED错误,具体见下 ...

  4. JavaScript里的创建对象(一)

    一.序 面向对象有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.ECMA-262把对象定义为“无序属性的集合,其属性可以包含基本值.对象或者函数”. 使用Obje ...

  5. java 快速开发框架平台 二次开发 代码生成器 springmvc SSM后台框架源码

    官网 http://www.fhadmin.org/D 集成安全权限框架shiro  Shiro 是一个用 Java 语言实现的框架,通过一个简单易用的 API 提供身份验证和授权,更安全,更可靠E ...

  6. OpenGL ES 渲染立体图形

    一.理解 顶点数据存储在申请的缓冲区中,其由数据总线传递给着色器(如果是片元着色器,还须将顶点转换成片元),再由着色器最终渲染到涂层上: 二.思路 1.设置涂层: 2.创建上下文: 3.清空缓存区: ...

  7. Nginx服务器的平滑启动、平缓停止、平滑升级

    注:Nginx服务在运行时,会保持一个主进程(master process)和一个或多个工作进程(worker process). 每一个进程都会有一个PID进程号,可以通过向主进程的PID进程号发送 ...

  8. golang cgo 使用总结

    原文地址 CGO 提供了 golang 和 C 语言相互调用的机制.某些第三方库可能只有 C/C++ 的实现,完全用纯 golang 的实现可能工程浩大,这时候 CGO 就派上用场了.可以通 CGO ...

  9. mfc 引用

    一.引用的概念 引用(reference)是另一标识符的别名,可以说是C++的一种新的变量类型,是对C的重要扩充.当建立引用时,程序用另一个变量或对象(目标)的名字初始化它(即它代表了标识符的左值), ...

  10. python+soket实现 TCP 协议的客户/服务端中文(自动回复)聊天程序

    [吐槽] 网上的代码害死人,看着都写的言之凿凿,可运行就是有问题. 有些爱好代码.喜欢收藏代码的朋友,看到别人的代码就粘贴复制过来.可是起码你也试试运行看啊大哥 [正文] 昨日修改运行了UDP协议的C ...