datasheet

曾道人特码玄机料:STM32的在应用编程(IAP)快速学习

2019-05-24来源: eefocus关键字:STM32  应用编程  IAP

141期曾道人 www.w9okj.cn 1.IAP介绍

IAP(In Application Programming)即在应用编程,IAP 是用户自己的程序在运行过程中对 Flash 部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。实现 IAP 功能时,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如 USB、USART )接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在Flash 中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:


1.检查是否需要对第二部分代码进行更新

2.如果不需要更新则转到4

3.执行更新操作

4.跳转到第二部分代码执行

我们将第一个项目代码称之为 Bootloader 程序,第二个项目代码称之为 APP 程序,他们存放在 STM32 FLASH 的不同地址范围,一般从最低地址区开始存放 Bootloader,紧跟其后的就是 APP 程序(注意,如果FLASH 容量足够,是可以设计很多APP 程序的,本章我们只讨论一个APP 程序的情况)


Note: 

- 代码第一个字( 4bytes )为栈顶地址指向 RAM,RAM起始地址为 0x20000000 

- 代码第二个字( 4bytes )为程序开始地址


代码内多处使用以上两个地址进行正确与否的判断,故希望读者可以先了解一下,代码中具有详细的讲解 

篇幅有限,只贴出相对较为重要的代码,文章末尾有完整代码的链接可供下载


2.Bootloader程序

2.1. main.c

/*

**************************************************************

** 

** 功能介绍: 上电启动3 秒内未收到APP 更新数据

**                         自动跳转至APP 运行,如果3 秒内收到

**                         APP 更新数据,接收完成后将APP 代码

**                         复制到指定地址并开始执行新的APP

**

** CPU     : STM32F103ZET6

** FLASH  : 512K 0x08000000起

** SRAM   : 64K  0x20000000起

**

**************************************************************

*/

int main( void ) 

{   


    u16 oldcount = 0;

    u16 applenth = 0;

    u16 time = 0;

    Stm32_Clock_Init(9);

    delay_init(72);     

    uart_init(72,256000);


    LED_Init();       

    LCD_Init();

    KEY_Init();


    POINT_COLOR=RED;

    LCD_ShowString(50,50,200,16,16,"BootLoader program");   

    LCD_ShowString(50,80,200,16,16,"Update app program? ");

    LCD_ShowString(50,100,200,16,16,"Yes->Updata");

    LCD_ShowString(50,120,200,16,16,"N o->APP");

    POINT_COLOR=BLUE;


    while(1)

    {


        if(USART_RX_CNT)

        {

            time = 0;

            if( oldcount==USART_RX_CNT )

            {

                applenth=USART_RX_CNT;

                oldcount=0;

                USART_RX_CNT=0;

                printf("rnAPP 接收完成rn");

                printf("APP SIZE = %dBytesrn",applenth);

                printf("更新 APP...rn");    

                /*

                **  1.判断新程序地址是否在FLASH 地址

                **   2.USART_RX_BUF定义时也可以不指定地址,判断时使用k 与0xFF000000 与运算

                **  3.k = (((u32)USART_RX_BUF[7])<<24)|(((u32)USART_RX_BUF[6])<<16)|(((u32)USART_RX_BUF[5])<<8)|(((u32)USART_RX_BUF[4]));

                */

                if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)

                {    

                    iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);

                    printf("更新完成...rn");  

                }

                if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)

                {    

                    printf("APP 运行中...rn");

                    iap_load_app(FLASH_APP1_ADDR);

                }


            }

            else 

                oldcount=USART_RX_CNT;          

        }else/* 3s 内未收到APP 更新程序自动跳转*/

        {

            time++;

            if( time>300 )

            {

                if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)

                {    

                    printf("APP 运行中...rn");

                    iap_load_app(FLASH_APP1_ADDR);

                }else

                {

                    printf("无APP..rn");

                }

            }

        }


        delay_ms( 10 );            

    }    

}



2.2. iap.h

#ifndef __IAP_H__

#define __IAP_H__

#include "sys.h"  


typedef  void (*iapfun)(void);              /* 定义函数指针*/

#define FLASH_APP1_ADDR     0x08005000      /* 定义APP 程序在FLASH 中的存放地址*/


void iap_load_app(u32 appxaddr);        

void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 applen);  

#endif


2.3. iap.c

iapfun jump2app; 

u16 iapbuf[1024];   

/*

***********************************************************

** appxaddr : 应用程序起始地址

** appbuf : 应用程序代码

** appsize : 应用程序大小,字节数

***********************************************************

*/

void iap_write_appbin( u32 appxaddr,u8 *appbuf,u32 appsize ){

    u16 t;

    u16 i = 0;

    u16 temp;

    u32 fwaddr = appxaddr;

    u8 *dfu = appbuf;

    for( t=0;t

        temp=(u16)dfu[1]<<8;

        temp+=(u16)dfu[0];    

        dfu+=2;

        iapbuf[i++]=temp;       

        if( i==1024 ){

            i=0;

            STMFLASH_Write( fwaddr,iapbuf,1024 );   

            fwaddr+=2048;

        }

    }

    if( i )

        STMFLASH_Write( fwaddr,iapbuf,i );

}


/*

***************************************************

** appxaddr : 跳转到appxaddr 地址的代码运行

**

** note : appxaddr 存放的是用户程序Flash 的首

**          地址, (*(volatile u32*)appxaddr)的意

**          思是取用户程序首地址里面的数据

**          ,这个数据就是用户代码的栈顶地址

**          栈顶地址指向RAM,而RAM的起始地址

**          是0x20000000,因此上面的判断语句执行

**          判断用户代码的栈顶地址是否落在

**          0x20000000~0x2001FFFF 区间中,这个区间的

**          大小为128K,一般情况下,我们使用的芯

**         片较多的落在<128K RAM 的区间

** 注意: 例程中判断栈顶位置是否合法使用的是

**              与0x2FFE0000 进行与运算, 笔者认为使用

**              0xFFFE0000 运算会更加严谨一些, 故修改

**             

***************************************************

*/

void iap_load_app(u32 appxaddr) {


    if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000){ /* 检查栈顶位置是否合法*/

jump2app=(iapfun)*(vu32*)(appxaddr+4); /* 用户代码区第二个字为程序

[1] [2]

关键字:STM32  应用编程  IAP

编辑:什么鱼 引用地址://www.w9okj.cn/mcu/ic462814.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32的ETR引脚计数功能
下一篇:STM32的FLASH模拟EEPROM

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32复习笔记(四)串口通信

一、常见的串行通信接口:二、STM32的串口通信接口:UART:通用异步收发器USART:通用同步异步收发器大容量STM32F10x系列芯片,包含3个USART和2个UART三、UART异步通信方式引脚连接方法:-RXD:数据输入引脚。数据接受。-TXD:数据发送引脚。数据发送。四、UART异步通信方式引脚:-RXD:数据输入引脚。数据接受。-TXD:数据发送引脚。数据发送。五、UART异步通信方式特点:全双工异步通信。分数波特率发生器系统,提供精确的波特率。     -发送和接受共用的可编程波特率,最高可达4.5Mbits/s可编程的数据字长度(8位或者9位);可配置的停止位(支持1或者2位停止位
发表于 2019-06-26
STM32复习笔记(四)串口通信

STM32复习笔记(十一)USMART调试组件

一、什么是USMART?USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具。具体工作过程是通过串口发送命令给单片机,然后单片机收到命令之后调用单片机里面对应的相关函数,并执行,同时支持返回结果。二、USMART调试过程:三、USMART应用场景:开发过程中,经常需要修改函数入口参数,查看运行效果的情况下应用非常方便。不用多次下载代码,或者多次用JLINK调试。四、USMART特点:可以调用绝大部分用户直接编写的函数。资源占用极少(最少情况:FLASH:4K;SRAM:72B)。支持参数类型多(数字(包含10/16进制)、字符串、函数指针等)。支持函数返回值显示。支持参数及返回值格式设置
发表于 2019-06-26
STM32复习笔记(十一)USMART调试组件

STM32复习笔记(十)LCD的介绍和使用方法

:      FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接,STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器。FSMC的框图如下图所示:四、FSMC简介-FSMC驱动LCD原理:      FSMC驱动外部SRAM时,外部SRAM的控制一般有:地址线(如A0~A25)、数据线(如D0~D15)、写信号(WE,即WR)、读信号(OE,即RD)、片选信号(CS),如果SRAM支持字节控制,那么还有UB/LB信号。      而TFTLCD的信号我们在前面介绍过,包括
发表于 2019-06-26
STM32复习笔记(十)LCD的介绍和使用方法

STM32入门之优先级分组

在配置中断时需要配置优先级,在此对优先级进行总结。首先,优先级分为抢占优先级和响应优先级。判定顺序为先判定抢占优先级,如果抢占优先级相同的情况下再判定响应优先级。      始终先解决抢占优先级高的!优先级由4位组成区间为 0000 ~ 1111因为要分为抢占优先级和响应优先级,故一共有5种分组。、看代码注释具体分配如下(红线前为抢占优先级后为响应优先级)还看不懂就看这个表:故设置时不能超过相对应的值。
发表于 2019-06-26
STM32入门之优先级分组

STM32入门之中断

NVIC_InitTypeDef NVIC_InitStructure;//定义用于初始化中断优先级 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置分组为2 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//打开时钟    TIM.TIM_Prescaler = 7199;//预分频 TIM.TIM_CounterMode = TIM_CounterMode_Up ;//计数器(装载值)模式,向上计数 TIM.TIM_Period = 9999;//定义时钟的装载值 TIM.TIM_ClockDivision
发表于 2019-06-26

STM32的精确延时

/*----------------------------------------------------------文件名称:systick.c文件描述:sysTick 系统滴答时钟1us中断函数库,中断时间可自由配置备注:程序默认使用72M时钟,无分频-----------------------------------------------------------------*/#include "delay.h"static __IO u32 TimingDelay
发表于 2019-06-26

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 141期曾道人 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright ? 2005-2019 www.w9okj.cn, Inc. All rights reserved
  • 提升双创教育质量的关键在机制协同 2019-06-23
  • 观世变专题汇总页不让历史撒谎 2019-06-09
  • 5分钟搞定的微波炉米麻薯,颜值口感双满分 2019-06-08
  • 以大刀阔斧改革激发社会活力 2019-06-04
  • 央视4频道每天下午播放。 2019-06-03
  • 细数vivo NEX亮点 骁龙8458GB+256GB屏幕指纹 2019-06-03
  • 五月来电排行榜——五大热盘最火 ——凤凰网房产北京 2019-05-29
  • 2018年全军院校招生计划下达:计划招收学员3.05万名 2019-05-28
  • 新疆喀纳斯湖再现不明水生物 2019-05-28
  • 各地一周答复网民留言四千项 最受关注领域与你息息相关 2019-05-27
  • 北京冬奥场馆建设注重赛后利用 2019-05-25
  • 侯德义:用全生命周期理念推动环境修复行业发展 2019-05-21
  • 中山八路总站 调整12公交线 2019-05-15
  • 让山里娃感受智慧科技乐趣 2019-05-09
  • 余静:“有一肚子的好消息想说给乡亲们说” 2019-05-09
  • 辽宁快乐12任3最大遗漏 年期特码大公开 北京赛车pk10有无赚钱 体育彩票快速赛车 最新11选5加奖 上海时时彩哪儿买的 4399炸金花网页游戏 河南22选5玩法 2019年七星彩走势图表 中国福彩网公告 七乐彩中2个号码 南粤36选7开奖结果查询结果 35选7中奖规则 nba球队 诈金花玩现金的