使用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. jenkins权限配置

    1. 授权匿名账户权限 2 注册新用户,并且把匿名权限删除,添加用户权限 Overall(全局) Credentials(凭证) Slave(节点) Job(任务) View(视图) Administ ...

  2. [Java123] JavaBean

    https://stackoverflow.com/questions/3295496/what-is-a-javabean-exactly A JavaBean is just a standard ...

  3. LeetCode559. Maximum Depth of N-ary Tree

    第一次写出了具有迭代和递归的函数,还是有点收获的,虽然题目比较简答 当要对某些对象重复使用时,考虑循环,也就是迭代 当函数可以简化一个重复的操作时,考虑递归,而且就当下一次使用这和函数的结果已经有啦, ...

  4. Spring源码分析(十二)FactoryBean的使用

    摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 一般情况下,Spring通过反射机制利用bean的class属性指定实现 ...

  5. C语言程序设计I—第四周教学

    第四周教学安排 第四周是本课程的第三次课,依然是我来讲解,学生听讲,也依然继续在寻找大班授课(100人).条件有限(民办学校教学经费投入不够)的情况下如何更好的组织教学. 教学内容 第二章 用C语言编 ...

  6. P1134 阶乘问题

    题目描述 也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 = 479,001, ...

  7. IE8 下处理select标签高度不居中

    IE8:          Chrome:   同样的代码可是在IE8下select的文字并不是垂直居中. 处理:给select的样式添加padding上下的内边距. 加line-height一点用都 ...

  8. C++标准转换运算符dynamic_cast

    dynamic_cast <new_type> (expression) dynamic_cast运算符,应该算是四个里面最特殊的一个,因为它涉及到编译器的属性设置,而且牵扯到的面向对象的 ...

  9. Mybatis的使用与流程解析

    1. 什么是MyBatis MyBatis的前身是Apache的一个开源项目ibatis,后来迁移到Google code就改名为MyBatis. 官方解释: MyBatis是一款优秀的持久层框架,它 ...

  10. 第一次作业:基于Linux-0.12的进程分析

    这次作业主要基于Linux-0.12的源代码,分析Linux是如何组织进程,进程的状态之间是如何转换,以及进程是如何调度的. 一. 进程的概念: 1.进程就是:程序在数据集合上的一次运行过程,是系统进 ...