STM32 IAP程序升级

发布者:tnzph488最新更新时间:2018-08-21 来源: eefocus关键字:STM32  IAP  程序升级 手机看文章 扫描二维码
随时随地手机看文章

硬件平台:STM32F103ZET6的最小系统,512K Flash 64KRAM

Bootloader区:0x08000000 ----- 0x08010000 64K

APP区:     0x080010000 ----- 0x08080000 448K


1.Bootloader部分

#define ApplicationAddress 0x08010000 //app存放的起始地址
#define ApplicationPages 224
#define App1Address 0x20001000 //app程序中接收的更新程序存放在RAM中,起始地址为0x20001000,试验的程序代码比较小

#ifdef iap

if(((*(__IO uint32_t*)(App1Address+4))& 0x2FFE0000 ) == 0x20000000 && (*(__IO uint32_t*)App1Address)!=0) 
{
printf("There is a new app program,now preapring to update the fermware.");
printf("Erasing flash¡­¡­");

FLASH_Unlock();
for(i=0;i{
status=FLASH_ErasePage(ApplicationAddress+i*0x400);
}
FLASH_Lock();

printf("Erase flash ok!!!");

printf("Programing flash¡­¡­");
FlashProgram(ApplicationAddress,(*(__IO uint32_t*)App1Address),(uint8_t *)(App1Address+4));

printf("Programe flash ok!!!");
printf("Jump to app_main!!!");

*(__IO uint32_t*)App1Address = 0;

JumpAddress = (iapfun)*(__IO uint32_t*) (ApplicationAddress+4);  
__set_MSP(*(__IO uint32_t*) ApplicationAddress);  
JumpAddress(); 
}
  else if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)  
  {
printf("Jump to app_main!!!");



JumpAddress = (iapfun)*(__IO uint32_t*) (ApplicationAddress+4);  
__set_MSP(*(__IO uint32_t*) ApplicationAddress);  
JumpAddress();  
}
else   
{
printf("Jump to app_main failed!\n\r");
}
#endif

(1)上电时检测有无更新文件,有更新文件时,根据指定的App长度将新程序拷贝到App的Flash区

(2)跳转到APP的FLASH区执行app程序


2.APP程序的串口接收程序

struct
{
uint32_t length;
uint8_t ReceiveDatebuff1[RecvLength];
}app_program __attribute__ ((at(0X20001000)));


void USART1_IRQHandler()
{
uint8_t ReceiveData; 
if(!(USART_GetITStatus(USART1,USART_IT_RXNE))); 
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);

if(recievestatus==0)

ReceiveData=USART_ReceiveData(USART1);
if(ReceiveData==0x55)recievestatus=1;
printf("prepared for recieve a new app program!");
}
else if(recievestatus==1)
{
ReceiveData=USART_ReceiveData(USART1);
if(recievelength < RecvLength)

app_program.ReceiveDatebuff1[recievelength++]=ReceiveData; 
}
if(app_program.ReceiveDatebuff1[recievelength-1]==0x55
&&app_program.ReceiveDatebuff1[recievelength-2]==0x55)
{
recievelength-=2;
app_program.length=recievelength;
recievestatus=2;
printf("Recieved a new app program!");
printf("please press enter to update the new program");
}
}
else if(recievestatus==2)
{
ReceiveData=USART_ReceiveData(USART1);
if(ReceiveData==0x13)
{
NVIC_SystemReset();
}
}
}  
}

(1)接收0x55,指示准备接收更新程序

(2)发送app.bin文件,APP程序接收后存放在RAM中指定的地址0X20001000处,并记录app长度

(3)接收0x5555,指示接收APP更新程序结束,准备好更新操作

(4)接收0x13,启动更新操作,软复位,跳转至Bootloader处重启


实现的功能很简单,在APP中接收更新程序,再跳转到Bootloader中去更新;这里没有做任何的出错检验,只是简单的演示下IAP的过程。


(1)BIN文件在通过串口接收时,速率过快可能会出错,可以将波特率调低些做实验

(2)接收APP更新程序可以在APP中也可以在Bootloader中,获取更新文件的途径可以为串口、USB、SD卡、can等

(3)更新文件的存放可以是任何的存储设备,只要足够大的空间即可;

(4)为了更新的准确性和可操作性,无线方式应考虑BIN的分包断点续传;更新前旧APP程序的备份;数据的校验;


关键字:STM32  IAP  程序升级 引用地址:STM32 IAP程序升级

上一篇:STM32F103测试SD卡串口写入测试
下一篇:STM32_SPI驱动分析(SD卡)

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

STM32的MDK工具使用技巧
RVMDK使用技巧 Version:uVision V4.70.0.0 修改颜色/字体 点击“工具”按钮,打开如下界面,然后点击各个元素修改为你喜欢的颜色,也可以修在Font栏修改字体大小等。 添加自定义关键字 点击“工具”按钮,打开如下界面,点击“User Keyword”后的“小方框”按钮添加自定义的关键字,添加完成后该关键字即与系统关键字一样颜色。 巧用TAB 点击“工具”按钮,打开如下界面,修改Tab Size,建议4。 MDK的Tab支持块操作,块选代码后,按Tab代码后移,按Tab+Shift前移 快速定位 点击“魔术棒”按钮,勾选“Browse Information”即可使用快速定
[单片机]
stm32调试遇到问题及解决
一、PB4始终是高电平,导致超声波传感器用不起来。 百度了一下,stm32有些管脚上电默认的功能不是通用的GPIO,比如JTAG与SWD调试管脚,所以如果想要使用这几个管脚作为通用IO口的话就必须将JTAG与SWD功能关闭,并且要开启AFIO时钟。即外设的复用IO。 加上这两句:RCC_APB2PeriphClockCmd(RCC_APBPeriph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE); 二、多通道AD转换时有一个引脚的电压没接外部电流时都是一点几伏 由于AD转换需要设置引脚为模拟输入,模拟输入的引脚电压不固定空引脚大概为1/2V
[单片机]
STM32高级开发(2)-安装使用ubuntu
作为一切开发的起点,我们首先要安装一个Linux发行版系统作为我们开发的最基础的支持性平台,这里推荐下载ubuntu系统,ubuntu可以说是近些年来最流行和使用广泛的Linux发行版系统了。 安装虚拟机软件 这里我默认大家使用的系统是windows。所以接下来的一切介绍都已这个为前提。 要安装虚拟机我们有两个选择: 1. VMware Workstation 2. VirtualBox 前者是一个商业化软件,需要付费才能够正常使用,当然你也可以破解。关于方法网上全是我想就不用我过多介绍了。而后者是一个开源软件,自然地功能性上可能有一些欠缺但也还算够用。当然啦,如果有条件还是用前者吧~ 下载ubuntu系统安装文件 htt
[单片机]
<font color='red'>STM32</font>高级开发(2)-安装使用ubuntu
STM32中按键中断分析(附源码)
  在按键学习中,我们有用到查询的方法来判断按键事件是否发生,这种查询按键事件适用于程序工作量较少的情况下,一旦程序中工作量较大较多,则势必影响程序运行的效率,为了简化程序中控制的功能模块的执行时间,引入中断控制就很有必要,,一旦有中断时间发生,则程序立马跳转到中断向量的执行程序中,执行完成后就恢复到正常的程序状态。   在STM32F中采用中断控制器NVIC来设定中断。按照中断初始化配置的结构体文件,我们需要在NVIC初始化结构体配置如下:   void EXti_PB12_Config(void)   {   //定义结构体   GPIO_InitTypeDef GPIO_InitStructure;   EXTI_I
[单片机]
STM32实验1:IO输出
LED控制端口初始化 //初始化PA8和PD2为输出口.并使能这两个口的时钟 //LED IO初始化void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能APB2外设时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mod
[单片机]
stm32使用tim3输出4路pwm(khz级)
tim3_pwm4.h /********************************************************* TIM3输出4路pwm,单独控制占空比 **********************************************************/ #ifndef _PWM_ #define _PWM_ #include stm32f10x.h #define CLOCK 72000 extern u16 arr; //预加载值 extern u16 psc; //分频值 /**************************************
[单片机]
建立STM32的工程步骤(版本1)
建立STM32的工程步骤(版本1):
[单片机]
建立<font color='red'>STM32</font>的工程步骤(版本1)
SD NAND在STM32应用上的保姆级教程
SD NAND与正点原子精英板的连接 由于正点原子精英板没有SD NAND接口,只有TF卡接口,所以SD NAND需要用到转接板来连接。 SD NAND正常运行现象 本次实验的程序是正点原子的SD卡实验例程,先用读卡器把SD NAND接到电脑上,并复制一个文件进去,再插到开发板上; 用送的数据线连接USB UART接口,下载好程序,打开电脑上的串口助手,按下KEY0,即可读取到数据, 具体实验步骤和现象可以看例程文件夹中的readme, 另外LED-DS0闪烁也表示SD NAND芯片在正常运行, SD NAND芯片用的是MK-米客方德的工业级芯片MKDV1GIL-AS;MK-米客方德家还有其他各种型号的SD NAN
[单片机]
SD NAND在<font color='red'>STM32</font>应用上的保姆级教程
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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