STM32 IAP(在线更新程序)的使用关键点

发布者:快乐舞动最新更新时间:2016-12-27 来源: eefocus关键字:STM32  IAP  使用关键点 手机看文章 扫描二维码
随时随地手机看文章

所谓IAP其实就相当于一个小小的bootloader 用来更新程序的

很多产品基本都是程序做好后就直接在产线烧录一次就OK了,但是,但是BUG有时候是无可避免的,经常有产品装好后又要重新拆外壳 取下板子重新上烧录架烧的惨痛经历,所以,这种情况下IAP就很有必要了,只要一个对外的接口就能在线更新了,常用的是USB口,当然要是一定要用串口的话也是可以的 硬件上麻烦一些而已,下面就是例程


  1. typedef  void (*pFunction)(void);  

  2. pFunction Jump_To_Application;  

  3. unsigned long  JumpAddress;  

  4.   

  5. if(!Check_Whether_Enter_UpdateMode())//这个函数是自定义的 通过判断按键决定进入bootloader 还是APP应用  

  6. {  

  7.     if (((*(__IO uint32_t*)FLASH_START_ADDR_NORMAL_FIRMWARE) & 0x2FFE0000 ) == 0x20000000)//检查栈顶指针  

  8.     {   

  9.         /* Jump to user application */  

  10.         JumpAddress = *(__IO uint32_t*) (FLASH_START_ADDR_NORMAL_FIRMWARE + 4);//取出APP的RESET地址   

  11.         Jump_To_Application = (pFunction) JumpAddress;//将地址传给函数指针  

  12.         /* Initialize user application's Stack Pointer */  

  13.         __set_MSP(*(__IO uint32_t*) FLASH_START_ADDR_NORMAL_FIRMWARE);//设置栈顶指针  

  14.         Jump_To_Application();//跳入APP  

  15.     }  

  16. }  


  1. FLASH_START_ADDR_NORMAL_FIRMWARE这个地址是APP起始地址  

  2. 这就是IAP的基本思路 如果不进入APP的话就进入IAP进行代码更新 IAP里在添加USB的处理 到了这里IAP的程序就基本完成了(不过USB协议的相关处理还是有点麻烦有点难度的,  

  3. 要理解了才好动手,不然容易懵,我本人就是经常懵了...)  

  4. 其实类似的关于IAP博文已经很多人写了,这里之所以又写是因为有一点比较容易被忽略的,自己就碰到了,可能是我比较粗心人家其实已经提醒而我没注意到,亦或是我读的文章  

  5. 不够多,又啰嗦了...唉,进入正题  

  6. 上面例程的APP地址我设的是0x08003000; 那APP工程的程序基地址也要设为0x08003000 FLASH SIZE 也要相应的减去0x3000  


到了这里还有一点要注意的,我们都知道一般情况STM32复位后从0x08000000开始取指,中断向量从0x08000004开始第一个为RESET向量 那APP工程的中断向量就不能如此了 APP的向量地址要从0x08003000开始,这点比较容易被忽略掉,不过也可能是我自己比较傻的问题,说不定大部分人都懂了就我还蒙在鼓里  如下图


    关键字:STM32  IAP  使用关键点 引用地址: STM32 IAP(在线更新程序)的使用关键点

    上一篇:STM32 中断使用
    下一篇:STM32管脚的复用与重映像关系

    推荐阅读最新更新时间:2024-03-16 15:27

    STM32-自学笔记(4.丰富多样的外部设备中)
    PWM输入模式: 定时器的捕获单元,还可以同时使用两个捕获通道测量一个外部PWM信号的周期和占空比。 在PWM的输入模式下,输入信号与两个捕获通道连接。假设使用捕获通道1,2。在PWM一个周期开始之后,捕获通道2在其上升沿将主计数器清除并开始向上计数,而随后捕获通道1捕获到PWM的下降沿,此时就得到高电平周期。而捕获通道2再次捕获到下一个周期的PWM的上升沿,就可以得到PWM的周期。并将计数器清楚,准备下一次测量。 编码器接口: 每个定时器的捕获单元都可以和外部的编码器连接。编码器接口的一个典型的应用是电机的角速度和转角位置的检测。 捕获单元在编码器接口工作模式下,由捕获引脚提供定时计数器的驱动时钟,显然该计数器可以识
    [单片机]
    STM32学习日志——电容触摸按键实验
    这次的代码很有意思,可以学到很多编程的思想。 首先,电容触摸按键是基于模电的RC充放电电路,一开始:R+=v1,R-=0,I1=V1/R;充电过程中:R+=v1,R-=V2,I2=(V1-V2)/R I1;充电完成:R+=V1,R-=V1,I3=0。所以电压与时间的对应关系图如下。 从公式中可以看出,在相同的条件中,充电时间是与电容值成正比的,而且当手触碰电容触摸按键,它的容值就会增加,根据这个原理,我们可以测量充电的时间来判断是否按下了按键。 程序的思路是这样的,1)初始化TIM5的通道2输入捕获,将PA1的模式设为推挽输出,输出0,放电,然后将定时器清零,以等待按下充电。2)捕获上升沿,即充电完成的时间。3)10次捕获
    [单片机]
    STM32之DAC
    STM32F103VCT6自带两个12位DAC,DAC的转换速度一直没有查到,网上有人说是1MHZ的频率,那就是1us了。ADC的转换时间在56MHZ工作频率下为1us,在72MHZ工作频率下为1.17us。如果AD和DA有对称关系的话,那么很可能跟ADC的时间相同。(仅作分析用!) DAC于我,有两个用途:输出波形和输出固定电压。先来说说前者的配置。 第一个参数:触发方式,DAC_InitStructure.DAC_Trigger。可选的外部触发源一共有八个。六个是定时器触发:TIM2,TIM4,TIM5,TIM6,TIM7和TIM8。剩下两个分别是:EXTI线路9和软件触发。如果采用定时器触发的话,就
    [单片机]
    STM32 V3.4库函数使用建立工程方法
    清晰地记得刚从51单片机过度到STM32,那种一头雾水的感觉。使用的STM32开发板是非常不适合初学者使用的开发板,它是硬件看上去华丽的神舟开发板。在这里我不评论神舟开发板如何如何,如果你是初学者,建议你不要使用神舟开发板。 拿到神舟开发板的教程,坑爹啊,如何使用STM32库的说明都没有,这对初学者也太不公平了吧。鄙人一个STM32菜鸟在网上花了半天时间才弄明白如何使用这个库,如何建立工程。今天分享我当初是如何使用STM32库文件建立工程的,非常适合初学者。 少废话,上图:
    [单片机]
    STM32中发送中断标志位
    数据手册中对此标志位的解释: Bit 7 TXE : Transmit data register empty This bit is set by hardware when the content of the TDR register has been transferred into the shift register. An interrupt is generated if the TXEIE bit =1 in the USART_CR1 register. It is cleared by a write to the USART_DR register. 0: Data is not transferred t
    [单片机]
    stm32引脚速度GPIO_Speed的区别
    首先GPIO最基本、最简单的作用是我们可以通过编程的方式让它作输入或者输出,而输入/输出的形式为高低电平(通常0V为低电平,3.3V为高电平)。 要让GPIO作输入或者输出,首先就需要对IO口相关的寄存器进行配置。而寄存器是中央处理器内的组成部分,寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。 因此对IO口的初始化就是向相关寄存器里面写不同的值,从而确定使用哪一个IO口(IO口标号)、以及IO口工作模式(输入还是输出)、输出速度等参数。 在经过初始化之后就可以正常使用IO口了,比如如果IO口设置成了某个输入模式,就可以通过调用相关函数或者直接操作相关寄存器去得到IO口的电平是高电平还是低电平。 -
    [单片机]
    6步教你在STM32程序中添加 printf函数
    简介:6步教你在STM32程序中添加 printf函数 前提是你有一个完整的keil工程 比如ADC的 调试的时候很多时候用到串口 这里教你怎么样使用Printf 函数 在程序中添加Printf 1, #include stdio.h 2, /* Private functions ---------------------------------------------------------*/ 下添加 void USART_Configuration(void); #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker
    [单片机]
    STM32 RTC实时时钟(二)
    上次实验完成了对实时时钟的基本功能——计时的实验,这次在计时的基础上对RTC的可编程闹钟的功能进行测试。 RTC 单元提供两个可编程闹钟,即闹钟 A 和闹钟 B。 可通过将 RTC_CR 寄存器中的 ALRAE 和 ALRBE 位置 1 来使能可编程闹钟功能。如果日历亚秒、秒、分钟、小时、日期或日分别与闹钟寄存器RTC_ALRMASSR/RTC_ALRMAR 和RTC_ALRMBSSR/RTC_ALRMBR 中编程的值相匹配,则 ALRAF 和 ALRBF 标志会被置为1。可通过 RTC_ALRMAR 和 RTC_ALRMBR 寄存器的 MSKx 位以及 RTC_ALRMASSR 和RTC_ALRMBSSR 寄
    [单片机]
    <font color='red'>STM32</font> RTC实时时钟(二)
    小广播
    添点儿料...
    无论热点新闻、行业分析、技术干货……
    设计资源 培训 开发板 精华推荐

    最新单片机文章
    何立民专栏 单片机及嵌入式宝典

    北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

    换一换 更多 相关热搜器件
    随便看看
    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved