OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 120679|回复: 119

STM32串口IAP实验(战舰STM32开发板实验)

  [复制链接]

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2013-1-1 12:20:53 | 显示全部楼层 |阅读模式
 

第四十八章 串口IAP实验

IAP,即在应用编程。很多单片机都支持这个功能,STM32也不例外。在之前的FLASH模拟EEPROM实验里面,我们学习了STM32FLASH自编程,本章我们将结合FLASH自编程的知识,通过STM32的串口实现一个简单的IAP功能。fficeffice" />

48.1 IAP简介   

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

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

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

3)执行更新操作   

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

第一部分代码必须通过其它手段,如JTAGISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一起烧入,以后需要程序更新是再通过第一部分IAP代码更新。  

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

STM32APP程序不仅可以放到FLASH里面运行,也可以放到SRAM里面运行,本章,我们将制作两个APP,一个用于FLASH运行,一个用于SRAM运行。

我们先来看看STM32正常的程序运行流程,如图48.1.1所示:



48.1.1 STM32正常运行流程图

       STM32的内部闪存(FLASH)地址起始于0x08000000,一般情况下,程序文件就从此地址开始写入。此外STM32是基于Cortex-M3内核的微控制器,其内部通过一张“中断向量表”
来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张“中断向量表”的起始地址是
0x08000004,当中断来临,STM32的内部硬
件机制亦会自动将
PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。

       在图48.1.1中,STM32在复位后,先从0X08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,如图标号①所示;在复位中断服务程序执行完之后,会跳转到我们
main函数,如图标号②所示;而我们的main函数一般都是一个死循环,在main函数执行过程中,如果收到中断请求(发生重中断),此时STM32强制将PC指针指回中断向量表处,如图标号③所示;然后,根据中断源进入相应的中断服务程序,如图标号④所示;在执行完中断服务程序以后,程序再次返回main函数执行,如图标号⑤所示。

       当加入IAP程序之后,程序运行流程如图48.1.2所示:

       在图48.1.2所示流程中,STM32复位后,还是从0X08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到IAPmain函数,
如图标号①所示,此部分同图
48.1.1一样;在执行完IAP以后(即将新的APP代码写入STM32FLASH,灰底部分。新程序的复位中断向量起始地址为0X08000004+N+M),跳转至
新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的
main函数,如图标号②和③所示,同样main函数为一个
死循环,并且注意到此时
STM32FLASH,在不同位置上,共有两个中断向量表。

       main函数执行过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址0X08000004中断向量表处,而不是新程序的中断向量表,如图标号④所示;程序再根据我们设置
的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示;在执行完中断服务程序后,程序返回
main函数继续运行,如图标号⑥所示。

       通过以上两个过程的分析,我们知道IAP程序必须满足两个要求:

1)  新程序必须在IAP程序之后的某个偏移量为x的地址开始;

2)  必须将新程序的中断向量表相应的移动,移动的偏移量为x

本章,我们有2APP程序,一个为FLASHAPP,程序在FLASH中运行,另外一个位SRAMAPP,程序运行在SRAM中,图48.1.2虽然是针对FLASH APP来说的,但是在

SRAM里面运行的过程和FLASH基本一致,只是需要设置向量表的地址为SRAM的地址。

1.APP程序起始地址设置方法

随便打开一个之前的实例工程,点击Options for TargetàTarget选项卡,如图48.1.3所示:

48.1.3 FLASH APP Target选项卡设置

       默认的条件下,图中IROM1的起始地址(Start)一般为0X08000000,大小(Size)为0X80000,即从0X08000000开始的512K空间为我们的程序存储(因为我们的STM32F103ZET6
FLASH
大小是512K)。而图中,我们设置起始地址(Start)为0X08010000,即偏移量为0X1000064K字节),因而,留给APP用的FLASH空间(Size)只有0X80000-0X10000=0X70000
448K字节)大小了。设置好StartSzie,就完成APP程序的起始地址设置。

       这里的64K字节,需要大家根据Bootloader程序大小进行选择,比如我们本章的Bootloader程序为22K左右,理论上我们只需要确保APP起始地址在Bootloader之后,
并且偏移量为
0X200的倍数即可(相关知识,请参考:http://www.openedv.com/posts/list/392.htm)。这里我们选择64K0X10000)字节,留了一些余量,方便Bootloader以后的升级修改。

       这是针对FLASH APP的起始地址设置,如果是SRAM APP,那么起始地址设置如图48.1.4所示:


48.1.4 SRAM APP Target选项卡设置

       这里我们将IROM1的起始地址(Start)定义为:0X20001000,大小为0XA00040K字节),即从地址0X20000000偏移0X1000开始,存放APP代码。因为整个STM32F103ZET6
SRAM大小为64K字节,所以IRAM1SRAM)的起始地址变为0X2000B0000x20001000+0xA000=0X2000B000),大小只有0X500020K字节)。这样,整个STM32F103ZET6SRAM
分配情况为:最开始的
4KBootloader程序使用,随后的40K存放APP程序,最后20K,用作APP程序的内存。这个分配关系大家可以根据自己的实际情况修改,不一定和我们这里的设
置一模一样,不过也需要注意,保证偏移量为
0X200的倍数(我们这里为0X1000)。

       2.中断向量表的偏移量设置方法

       之前我们讲解过,在系统启动的时候,会首先调用systemInit函数初始化时钟系统,同时systemInit还完成了中断向量表的设置,我们可以打开systemInit函数,看看函数体的结尾处有这样几行代码:

#ifdef VECT_TAB_SRAM

SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET;

 /* Vector Table Relocation in Internal SRAM. */

#else

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;

/* Vector Table Relocation in Internal FLASH. */

#endif

从代码可以理解,VTOR寄存器存放的是中断向量表的起始地址。默认的情况VECT_TAB_SRAM是没有定义,所以执行SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;  

对于FLASH APP,我们设置为FLASH_BASE+偏移量0x10000,所以我们可以在FLASH APPmain函数最开头处添加如下代码实现中断向量表的起始地址的重设:

SCB->VTOR = FLASH_BASE | 0x10000;

       以上是FLASH APP的情况,当使用SRAM APP的时候,我们设置起始地址为:SRAM_bASE+0x1000,同样的方法,我们在SRAM APPmain函数最开始处,添加下面代码:

SCB->VTOR = SRAM_BASE | 0x1000;

       这样,我们就完成了中断向量表偏移量的设置。

通过以上两个步骤的设置,我们就可以生成APP程序了,只要APP程序的FLASHSRAM大小不超过我们的设置即可。不过MDK默认生成的文件是.hex文件,并不方便我
们用作
IAP更新,我们希望生成的文件是.bin文件,这样可以方便进行IAP升级(至于为什么,请大家自行百度HEXBIN文件的区别!)。这里我们通过MDK自带的格式转换
工具
fromelf.exe,来实现.axf文件到.bin文件的转换。该工具在MDK的安装目录\ARM\BIN40文件夹里面。

fromelf.exe转换工具的语法格式为:fromelf [options] input_file。其中options有很多选项可以设置,详细使用请参考光盘《mdk如何生成bin文件.pdf.

本章,我们通过在MDK点击Options for TargetàUser选项卡,在Run User Programs After Build/Rebuild 栏,勾选Run#1DOS16,并写入:D:\Keil3.80a\ARM\BIN40\fromelf.exe  --bin -o  ..\OBJ\TEST.bin ..\OBJ\TEST.axf ,如图48.1.6所示:


       通过这一步设置,我们就可以在MDK编译成功之后,调用fromelf.exe(注意,我的MDK是安装在D:\Keil3.80A文件夹下,如果你是安装在其他目录,请根据你
自己的目录修改
fromelf.exe的路径),根据当前工程的TEST.axf(如果是其他的名字,请记住修改,这个文件存放在OBJ目录下面,格式为xxx.axf),生成一个

TEST.bin的文件。并存放在axf文件相同的目录下,即工程的OBJ文件夹里面。在得到.bin文件之后,我们只需要将这个bin文件传送给单片机,即可执行IAP升级。

       最后再来APP程序的生成步骤:

1) 设置APP程序的起始地址和存储空间大小

对于在FLASH里面运行的APP程序,我们可以按照图48.1.3的设置。对于SRAM里面运行的APP程序,我们可以参考图48.1.4的设置。

2) 设置中断向量表偏移量

这一步按照上面讲解,重新设置SCB->VTOR的值即可。

3) 设置编译后运行fromelf.exe,生成.bin文件.

通过在User选项卡,设置编译后调用fromelf.exe,根据.axf文件生成.bin文件,用于IAP更新。 

以上3个步骤,我们就可以得到一个.binAPP程序,通过Bootlader程序即可实现更新。

大家可以打开我们光盘的两个APP工程,熟悉这些设置。

48.2 硬件设计

本章实验(Bootloader部分)功能简介:开机的时候先显示提示信息,然后等待串口输入接收APP程序(无校验,一次性接收),在串口接收到APP程序
之后,即可执行
IAP。如果是SRAM APP,通过按下KEY0即可执行这个收到的SRAM APP程序。如果是FLASH APP,则需要先按下WK_UP按键,将串口接
收到的
APP程序存放到STM32FLASH,之后再按KEY2既可以执行这个FLASH APP程序。通过KEY1按键,可以手动清除串口接收到的APP程序。DS0用于指示程序运行状态。

本实验用到的资源如下:

1)  指示灯DS0

2)  四个按键(KEY0/KEY1/KEY2/WK_UP

3)  串口

4)  TFTLCD模块

这些用到的硬件,我们在之前都已经介绍过,这里就不再介绍了。

48.3 软件设计

本章,我们总共需要3个程序:1Bootloader2FLASH APP3SRAM APP;其中,我们选择之前做过的RTC实验(在第二十章介绍)来做为FLASH APP程序
(起始地址为
0X08010000),选择触摸屏实验(在第三十一章介绍)来做SRAM APP程序(起始地址为0X20001000)。Bootloader则是通过TFTLCD显示实验(在第
十八章介绍)修改得来。本章,关于
SRAM APPFLASH APP的生成比较简单,我们就不细说,请大家结合光盘源码,以及48.1节的介绍,自行理解。本章软件设计仅针对Bootloader程序。

打开本实验工程,可以看到我们增加了IAP组,在组下面添加了iap.c文件以及其头文件isp.h。打开iap.c 代码如下:

#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "stmflash.h"

#include "iap.h"      

iapfun jump2app;

u16 iapbuf[1024];

//appxaddr:应用程序的起始地址

//appbuf:应用程序CODE.

//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<appsize;t+=2)

       {                                           

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

              temp+=(u16)dfu[0];       

              dfu+=2;//偏移2个字节

              iapbuf[i++]=temp;     

              if(i==1024)

              {

                     i=0;

                     STMFLASH_Write(fwaddr,iapbuf,1024);   

                     fwaddr+=2048;//偏移2048  16=2*8.所以要乘以2.

              }

       }

       if(i)STMFLASH_Write(fwaddr,iapbuf,i);//将最后的一些内容字节写进去. 

}

//跳转到应用程序段

//appxaddr:用户代码起始地址.

void iap_load_app(u32 appxaddr)

{

       if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)      //检查栈顶地址是否合法.

       {

              jump2app=(iapfun)*(vu32*)(appxaddr+4);        

//用户代码区第二个字为程序开始地址(复位地址)         

              MSR_MSP(*(vu32*)appxaddr);                               

//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)

              jump2app();    //跳转到APP.

       }

}

       该文件总共只有2个函数,其中,iap_write_appbin函数用于将存放在串口接收buf里面的APP程序写入到FLASHiap_load_app函数,则用于跳转到APP程序运行,
其参数
appxaddrAPP程序的起始地址,程序先判断栈顶地址是否合法,在得到合法的栈顶地址后,通过MSR_MSP函数(该函数在sys.c文件)设置栈顶地址,
最后通过一个虚拟的函数(
jump2app)跳转到APP程序执行代码,实现IAPàAPP的跳转。

       打开iap.h代码如下:

#ifndef __IAP_H__

#define __IAP_H__

#include "sys.h"   

typedef  void (*iapfun)(void);     //定义一个函数类型的参数.  

#define FLASH_APP1_ADDR            0x080010000      

//第一个应用程序起始地址(存放在FLASH)

//保留0X08000000~0X0800FFFF的空间为Bootloader使用     

void iap_load_app(u32 appxaddr);                                                 //跳转到APP程序执行

void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 applen);   //在指定地址开始,写入bin

#endif

       这部分代码比较简单,。本章,我们是通过串口接收APP程序的,我们将usart.cusart.h做了稍微修改,在usart.h中,我们定义USART_REC_LEN55K字节,
也就是串口最大一次可以接收
55K字节的数据,这也是本Bootloader程序所能接收的最大APP程序大小。然后新增一个USART_RX_CNT的变量,用于记录接收到
的文件大小,而
USART_RX_STA不再使用。打开usart.c,可以看到我们修改USART1_IRQHandler部分代码如下:

//串口1中断服务程序

//注意,读取USARTx->SR能避免莫名其妙的错误       

u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)));

//接收缓冲,最大USART_REC_LEN个字节,起始地址为0X20001000.   

//接收状态

//bit15 接收完成标志

//bit14 接收到0x0d

//bit13~0     接收到的有效字节数目

u16 USART_RX_STA=0;              //接收状态标记      

u16 USART_RX_CNT=0;                   //接收的字节数      

void USART1_IRQHandler(void)

{

       u8 res;    

#ifdef OS_CRITICAL_METHOD

//如果OS_CRITICAL_METHOD定义了,说明使用ucosII.

       OSIntEnter();   

#endif

       if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到数据

       {    

              res=USART_ReceiveData(USART1);

              if(USART_RX_CNT<USART_REC_LEN)

              {

                     USART_RX_BUF[USART_RX_CNT]=res;

                     USART_RX_CNT++;                                                                                    

              }

       }

#ifdef OS_CRITICAL_METHOD      

//如果OS_CRITICAL_METHOD定义了,说明使用ucosII.

       OSIntExit();                                                                                

#endif

}

       这里,我们指定USART_RX_BUF的地址是从0X20001000开始,该地址也就是SRAM APP程序的起始地址!然后在USART1_IRQHandler函数里面,将串口发
送过来的数据,全部接收到
USART_RX_BUF,并通过USART_RX_CNT计数。代码比较简单,我们就不多说了。

最后我们看看main函数如下:

int main(void)

{           

       u8 t,key;

       u16 oldcount=0;     //老的串口接收数据值

       u16 applenth=0;     //接收到的app代码长度

       u8 clearflag=0;

       uart_init(256000);      //串口初始化为256000

       delay_init();               //延时初始化

       LCD_Init();            //液晶初始化

       LED_Init();                 //初始化与LED连接的硬件接口

      KEY_Init();                  //按键初始化       

POINT_COLOR=RED;//设置字体为红色

       LCD_ShowString(60,50,200,16,16,"Warship STM32");    

       LCD_ShowString(60,70,200,16,16,"IAP TEST");     

       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

       LCD_ShowString(60,110,200,16,16,"2012/9/24"); 

       LCD_ShowString(60,130,200,16,16,"WK_UP:Copy APP2FLASH");

       LCD_ShowString(60,150,200,16,16,"KEY1:Erase SRAM APP");

       LCD_ShowString(60,170,200,16,16,"KEY0:Run SRAM APP");

       LCD_ShowString(60,190,200,16,16,"KEY2:Run FLASH APP");

       POINT_COLOR=BLUE;

       //显示提示信息

       POINT_COLOR=BLUE;//设置字体为蓝色  

       while(1)

       {

             if(USART_RX_CNT)

              {

                     if(oldcount==USART_RX_CNT)

//新周期内,没有收到任何数据,认为本次数据接收完成.

                     {

                            applenth=USART_RX_CNT;

                            oldcount=0;

                            USART_RX_CNT=0;

                            printf("用户程序接收完成!\r\n");

                            printf("代码长度:%dBytes\r\n",applenth);

                     }else oldcount=USART_RX_CNT;                    

              }

              t++; delay_ms(10);

              if(t==30)

              {

                     LED0=!LED0; t=0;

                     if(clearflag)

                     {

                            clearflag--;

                            if(clearflag==0)LCD_Fill(60,210,240,210+16,WHITE);//清除显示

                     }

              }            

              key=KEY_Scan(0);

              if(key==KEY_UP)

              {

                     if(applenth)

                     {

                            printf("开始更新固件...\r\n");     

                            LCD_ShowString(60,210,200,16,16,"Copying APP2FLASH...");

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

//判断是否为0X08XXXXXX.

                            {           

iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,

applenth); //更新FLASH代码  

                                   LCD_ShowString(60,210,200,16,16,"Copy APP Successed!!");

                                   printf("固件更新完成!\r\n");      

                            }else

                            {

                                   LCD_ShowString(60,210,200,16,16,"Illegal FLASH APP!  ");         

                                   printf("FLASH应用程序!\r\n");

                            }

                    }else

                     {

                            printf("没有可以更新的固件!\r\n");

                            LCD_ShowString(60,210,200,16,16,"No APP!");

                     }

                     clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示         

              }

              if(key==KEY_DOWN)

              {

                     if(applenth)

                     {                                                                                                             

                            printf("固件清除完成!\r\n");   

                            LCD_ShowString(60,210,200,16,16,"APP Erase Successed!");

                            applenth=0;

                     }else

                     {

                            printf("没有可以清除的固件!\r\n");

                            LCD_ShowString(60,210,200,16,16,"No APP!");

                     }

                     clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示                                                        

              }

              if(key==KEY_LEFT)

              {

                     printf("开始执行FLASH用户代码!!\r\n");

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

//判断是否为0X08XXXXXX.

                     {    

                            iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码

                     }else

                     {

                            printf("FLASH应用程序,无法执行!\r\n");

                            LCD_ShowString(60,210,200,16,16,"Illegal FLASH APP!");      

                     }                                                            

                     clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示  

              }

              if(key==KEY_RIGHT)

              {

                     printf("开始执行SRAM用户代码!!\r\n");

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

//判断是否为0X20XXXXXX.

                     {    

                            iap_load_app(0X20001000);//SRAM地址

                     }else

                     {

                            printf("SRAM应用程序,无法执行!\r\n");

                            LCD_ShowString(60,210,200,16,16,"Illegal SRAM APP!");       

                     }                                                            

                     clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示

              }                            

               

       }             

}

       该段代码,实现了串口数据处理,以及IAP更新和跳转等各项操作。Bootloader程序就设计完成了,但是一般要求bootloader程序越小越好(给APP省空间嘛),
所以,本章我们把一些不需要用到的
.c文件全部去掉,最后得到工程截图如图48.3.1所示:


48.3.1 Bootloader 工程截图

       从上图可以看出,虽然去掉了一些不用的.c文件,但是Bootloader大小还是有22K左右,比较大,主要原因是液晶驱动和printf占用了比较多的flash,如果大家
想进一步删减,可以去掉
LCD显示和printf等,不过我们在本章为了演示效果,所以保留了这些代码。

      至此,本实验的软件设计部分结束。

       FLASH APPSRAM APP两部分代码,我们在实验目录下提供了两个实验供大家参考,不过要提醒大家,根据我们的设置,FLASH APP的起始地址必须是0X08010000,而SRAM APP的起始地址必须是0X20001000

48.4 下载验证

在代码编译成功之后,我们下载代码到ALIENTEK战舰STM32开发板上,得到,如图48.4.1所示:


48.4.1 IAP程序界面

此时,我们可以通过串口,发送FLASH APP或者SRAM APP到战舰STM32开发板,如图48.4.2所示:

48.4.2 串口发送APP程序界面

       先用串口调试助手的打开文件按钮(如图标号1所示),找到APP程序生成的.bin文件,然后设置波特率为256000(为了提高速度,Bootloader程序将波特率被设置为256000了),
最后点击发送文件(图中标号
3所示),将.bin文件发送给战舰STM32开发板。

       在收到APP程序之后,我们就可以通过KEY0/KEY2运行这个APP程序了(如果是FLASH APP,则先需要通过WK_UP将其存入对应FLASH区域)。  


实验48 串口IAP实验-战舰STM32开发板.zip

1.75 MB, 下载次数: 20148

我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-3-17
在线时间
5 小时
发表于 2015-3-17 13:43:45 | 显示全部楼层
原子哥,这个程序也可以在stm32 mini板上运行吧,我将这个项目程序移植到mini stm32中时出现些问题。(也改了些配置LED,kEY,lcd库都是用的mini板中的库),烧录到mini板上后程序启动不起来,在线调试了,发现进入这个循环中,出不来了
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

请问这是什么情况,怎么解决呢
回复 支持 1 反对 1

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-3-15 11:21:36 | 显示全部楼层
回复【5楼】450165485:
---------------------------------
你先在我们的板子上,学会这个,然后再移植到你的VET6,就很简单的了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

15

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2012-7-5
在线时间
6 小时
发表于 2013-1-1 13:41:38 | 显示全部楼层
哈哈,好教程啊!!!!
前排学习啦!
相信自己,我能行
回复 支持 反对

使用道具 举报

头像被屏蔽

275

主题

327

帖子

0

精华

禁止访问

积分
1065
金钱
1065
注册时间
2011-7-7
在线时间
34 小时
发表于 2013-1-2 08:56:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

3

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2012-10-10
在线时间
1 小时
发表于 2013-1-2 09:03:56 | 显示全部楼层
这个是新改写的?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2013-3-14
在线时间
1 小时
发表于 2013-3-15 09:19:57 | 显示全部楼层
原子大哥,我想学习IAP-FLASH,这个程序下载到我自己的电路板上,咋不成功啊。是不是要设置其它参数。我的MCU是STM32F103VET6
回复 支持 反对

使用道具 举报

50

主题

201

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2013-4-9
在线时间
1 小时
发表于 2013-4-9 11:52:22 | 显示全部楼层

 首先谢谢原子哥  不错的例程

但是这个升级一次后 怎么才能再次升级呢
是把中断向量改回去
再把APP程序代码删了吗

还是在APP中做好下次升级的接口?

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-4-9 12:18:06 | 显示全部楼层
回复【7楼】charlieholy:
---------------------------------
这个是个简单的串口IAP例程,如果想再升级,很简单,复位一下,就运行IAP代码了,再发送你的APP代码,就可以了。
当然实际应用,一般不会这么做,会有一个判断的,而且会有协议。比如收到某个指令,就进入IAP模式。之类的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

50

主题

201

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2013-4-9
在线时间
1 小时
发表于 2013-4-11 20:37:59 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
额  复位是一定要设计复位电路的吗 或者软件复位吗
为什么我掉电再上电还是跑的是APP程序- -!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-4-11 20:44:16 | 显示全部楼层
回复【9楼】charlieholy:
---------------------------------
不会吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

50

主题

201

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2013-4-9
在线时间
1 小时
发表于 2013-4-12 11:10:28 | 显示全部楼层
我百思不得其解 而且这个IAP原来的串口还在占用
升级后的APP灯有变化外其他的KEY 串口 软中断都没反应- -!
回复 支持 反对

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-8-22
在线时间
2 小时
发表于 2013-8-22 11:42:10 | 显示全部楼层
回复【楼主位】Admin:
---------------------------------
楼主,你好。
看了你的很多文章,钦佩你的技术,感谢你对大家的帮助。(好听的话少说,进入正题!)
--------------
您提到 用 fromelf.exe 生成bin文件,然后再 下载到 应用程序区域。
我在生成app.bin时,碰到了困难:
只要我在MDK中,给app程序设置一个flash偏移地址(即不是从0x8000000开始),就无法生成app.bin文件,得到的是一个杂乱的app文件夹。!!!!!!
----------------
我检查了,fromelf的配置没有问题,该配置能在boot程序(从0x8000000开始)中 生成对应的bin,路径也没问题。
该配置也能正确转化其它*.axf文件。
但就是不能转化 flash 有偏移地址的*.axf文件。
另外:
1、我的bootloader 已完成,可以正常进入用户程序;
2、我的app程序, 也能从用户程序 软复位 进入bootloader;后来用某烧写器软件,非常繁琐地把app.hex转成 app.bin,再下载到app区域,功能ok。
+++++++++++++++++++++++++++++++++++++++++++++
盼请原子大师指点:
为何在设置flash偏移地址后,我的fromelf 就无法生成bin文件了呢。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-8-22 14:09:44 | 显示全部楼层
附上你的工程,我测试下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-9-24
在线时间
32 小时
发表于 2013-9-24 11:07:14 | 显示全部楼层
看了下源程序,非常不错。不过好像APP程序 最大只能到55k
回复 支持 反对

使用道具 举报

4

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-7-31
在线时间
12 小时
发表于 2013-10-3 23:54:18 | 显示全部楼层
原子哥 这个iap实验的源代码在哪里啊 想看下 没找见啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-10-4 11:25:44 | 显示全部楼层
回复【15楼】beyoung:
---------------------------------
本帖就有啊,楼主位,最后。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2012-6-26
在线时间
0 小时
发表于 2013-10-17 16:39:41 | 显示全部楼层
回复【11楼】charlieholy:
---------------------------------
大神,请问你那问题怎么解决的呢?
回复 支持 反对

使用道具 举报

18

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2012-6-26
在线时间
0 小时
发表于 2013-10-17 17:18:10 | 显示全部楼层
原子哥,请教下对于上述的一段描述:
1)检查是否需要对第二部分代码进行更新   
2)如果不需要更新则转到4)   
3)执行更新操作   
4)跳转到第二部分代码执行 

当烧写好了第一部分代码后,上电运行时,刚一开始进行1),这个时候如果未发现需更新第二部分APP请求,则执行4),这里问题来了,既然这个时候还没有APP,怎么执行这部分代码呢,如果有APP的话,也在APP的main中无返回的运行了,怎么检测下一次1)是不是需要更新呢?
回复 支持 反对

使用道具 举报

5

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2012-8-31
在线时间
15 小时
发表于 2013-10-17 21:25:55 | 显示全部楼层
回复【楼主位】Admin:
---------------------------------
好东西要收藏啊。立此存照
回复 支持 反对

使用道具 举报

18

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2012-6-26
在线时间
0 小时
发表于 2013-10-18 13:50:06 | 显示全部楼层
回复【18楼】jianwenchang:
---------------------------------回复【16楼】正点原子:
---------------------------------
原子哥,请你帮我解释一下17楼的问题吧,谢谢
1)检查是否需要对第二部分代码进行更新    
2)如果不需要更新则转到4)    
3)执行更新操作    
4)跳转到第二部分代码执行  

当烧写好了第一部分代码后,上电运行时,刚一开始进行1),这个时候如果未发现需更新第二部分APP请求,则执行4),这里问题来了,既然这个时候还没有APP,怎么执行这部分代码呢,如果有APP的话,也在APP的main中无返回的运行了,怎么检测下一次1)是不是需要更新呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-10-18 14:18:16 | 显示全部楼层
回复【20楼】jianwenchang:
---------------------------------
这个要你自己去做个标记,来表示是否存在APP。通过判断标记去处理。

在APP,你可以通过软件复位,让MCU重新回到IAP代码,然后回到之前,把APP存在的标志清除掉,不就可以了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-7-30
在线时间
0 小时
发表于 2013-11-28 16:02:35 | 显示全部楼层
原子哥,我按照你讲的方法做串口IAP, bootloader程序能运行,接收到串口程序后在这个地方没进入if里进入了else里。
                 if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
                {     
                    iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码  
                    delay_ms(100);
                    printf("固件更新完成!\r\n");
                    key = 44;   
                }else      
                {      
                    printf("非FLASH应用程序!\r\n");
                }
想问下原子哥 为什么加这一句,是什么意思? if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
我用的是STM32F107
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-11-28 16:20:54 | 显示全部楼层
回复【23楼】ghpboy:
---------------------------------
简单的判断一下是不是合法的FLASH APP代码.
因为只要是APP,必定是存放在0X08XXXXXX的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-11-27
在线时间
0 小时
发表于 2013-12-3 22:48:49 | 显示全部楼层
怎样再从APP调转至IAP啊?跳过去就死了。。。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2013-12-9
在线时间
12 小时
发表于 2013-12-9 13:19:31 | 显示全部楼层
if(((*(vu32*) (0X20001000+4) )&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX. 
不明白 (0X20001000+4) 这个为什么加上4呢。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-12-9 19:33:00 | 显示全部楼层
回复【26楼】孔凤明:
---------------------------------
首先开始的4个字节是MSP.
随后的4个字节,才是程序的起始地址.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2013-12-9
在线时间
12 小时
发表于 2013-12-10 11:00:00 | 显示全部楼层
回复【27楼】正点原子:
---------------------------------
原子哥这个MSP什么意思,,
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-12-10 22:41:18 | 显示全部楼层
回复【28楼】孔凤明:
---------------------------------
MSP=Main SP
即:主堆栈。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-3-1
在线时间
0 小时
发表于 2014-3-1 20:54:13 | 显示全部楼层
原子哥,我的芯片也是stm32f103zet,现在将app的IROM已经设置为0x8010000,而且在程序开头也写了SCB->VTOR = FLASH_BASE | 0x10000;但是生成的bin文件发送给串口,发现*(vu32*)(FLASH_APP1_ADDR+4)是0x08000147,居然小于0x8010000。我用例程改的时候就没有这个问题,自己新建工程做的时候出现的这个问题。您觉得会是哪里的问题啊?
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-4-28
在线时间
0 小时
发表于 2014-3-27 10:43:08 | 显示全部楼层
回复【29楼】正点原子:
---------------------------------
感谢原子兄提供的实验,实验已经成功。但是将flash app改为我的程序后就出问题了,我的flash bin大小为266K,已经设置好起始地址和大小,并在开头调用了SCB->VTOR = FLASH_BASE | 0x10000; 通过按键更新固件库时提示"非FLASH应用程序”,不知是什么原因,请原子兄指点。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-4-28
在线时间
0 小时
发表于 2014-3-27 10:44:06 | 显示全部楼层
回复【31楼】ouyangjian22:
---------------------------------
忘了说,我的CPU为vet6,flash有512K
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-4-28
在线时间
0 小时
发表于 2014-3-27 10:50:39 | 显示全部楼层
回复【31楼】ouyangjian22:

回复【29楼】正点原子:
---------------------------------
感谢原子兄提供的实验,实验已经成功。但是将flash app改为我的程序后就出问题了,我的flash bin大小为266K,已经设置好起始地址和大小,并在开头调用了SCB->VTOR = FLASH_BASE | 0x10000; 通过按键更新固件库时提示"非FLASH应用程序”,不知是什么原因,请原子兄指点。

---------------------------------
看了下,开缓冲最大55K,如果我的程序有266K该怎么做IAP
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-3-27 23:54:25 | 显示全部楼层
回复【33楼】ouyangjian22:
---------------------------------
我这只是个参考,具体实际应用,你是要做协议的。
每传输一次,就要等待一个应答,才传输下一次,比如假定一次最多4K字节,那么266K,就可以慢慢的传输,收到4K就写入FLASH,再清空缓存,再收4K,再写FLASH,再清缓存....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-12-15
在线时间
0 小时
发表于 2014-4-4 16:39:50 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子哥,实际应用中一般用什么协议呢?想了解下
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-4-4 22:11:12 | 显示全部楼层
回复【35楼】Eagle_Flying:
---------------------------------
modbus不错。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2014-3-6
在线时间
31 小时
发表于 2014-4-16 09:58:27 | 显示全部楼层
LZ你好,我用你的IAP程序能够实现RTC等小程序实验,现在我想加入自己的程序,发现有130K左右,用这个程序进行串口接收,接收到的包是放在RAM缓存里面,但是RAM最多只有64k,那么这个串口改怎么实现分包处理呢?需要在你这个程序里面添加什么样的语句才能实现串口分包写入FLASH呢?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-5-13
在线时间
0 小时
发表于 2014-5-14 11:13:19 | 显示全部楼层
请教一个问题,整个过程中在两个地方对app的地址进行了定义(希望没理解错),以flash_app为例,第一个地方是IAP代码中iap.h文件中的

#define FLASH_APP1_ADDR 0x08010000   //第一个应用程序起始地址(存放在FLASH)
//保留0X08000000~0X0800FFFF的空间为IAP使用;

第二个地方就是在建立flash_app工程时,点击Options for Targetà >>Target选项卡,图48.1.3的相关设置。
请问这两个地方的设置是什么关系?前者比较好理解,是通过IAP程序将flash_app直接写到指定的地址;后者不能理解,既然我们用.bin文件进行传递(其中已经没有地址信息),那么我们还在Options for Targetà >>Target选项卡设置地址的用意是什么?还有意义吗?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2014-5-18
在线时间
0 小时
发表于 2014-5-18 21:57:22 | 显示全部楼层
好贴,正在学习,顶一个!
回复 支持 反对

使用道具 举报

15

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2013-10-15
在线时间
0 小时
发表于 2014-6-19 10:28:53 | 显示全部楼层
回复【24楼】正点原子:
---------------------------------
原子哥
想问下原子哥 为什么加这一句,是什么意思? if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX. 
您的解释还是有点不懂?在详细点?
“简单的判断一下是不是合法的FLASH APP代码. 
因为只要是APP,必定是存放在0X08XXXXXX的.”还是有点不解
书山有路,悬崖辅路
回复 支持 反对

使用道具 举报

15

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2013-10-15
在线时间
0 小时
发表于 2014-6-19 10:30:50 | 显示全部楼层
回复【23楼】ghpboy:
---------------------------------
帅哥   你懂了  那句话的意思?
书山有路,悬崖辅路
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2012-3-30
在线时间
3 小时
发表于 2014-7-8 22:41:00 | 显示全部楼层
不能直接发送HEX吗?
回复 支持 反对

使用道具 举报

11

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2014-4-18
在线时间
4 小时
发表于 2014-9-5 15:59:33 | 显示全部楼层
回复【37楼】xiaosi204:
---------------------------------
哥们  你搞出来了么  怎么分包往flash里面写啊
回复 支持 反对

使用道具 举报

8

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-5-22
在线时间
0 小时
发表于 2014-10-13 10:43:31 | 显示全部楼层
这个好啊,程序不用重新烧了。
回复 支持 反对

使用道具 举报

18

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
258
金钱
258
注册时间
2012-10-26
在线时间
23 小时
发表于 2014-11-4 16:08:14 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
不能理解什么叫也能放到RAM中运行,RAM不是掉电清空么,还是放到RAM中只是调试用的?
无个性,不签名
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-11-4 23:06:07 | 显示全部楼层
回复【45楼】suebillt:
---------------------------------
所以掉电后,重新上电就没法运行了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

18

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2011-12-19
在线时间
0 小时
发表于 2014-11-15 00:15:10 | 显示全部楼层
如何分批发送 BIN 文件,因为如何程序比较大,绶冲区没有这么大,怎么办,用什么软件提出BIN二进制数转为16进制数据
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-11-15 23:22:42 | 显示全部楼层
回复【47楼】lixingling:
---------------------------------
用modbus协议,多大的程序都可以传。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

18

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2011-12-19
在线时间
0 小时
发表于 2014-11-15 23:56:15 | 显示全部楼层
那还得写上位机
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-8-12
在线时间
1 小时
发表于 2014-11-17 20:03:40 | 显示全部楼层
//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
       if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)      //检查栈顶地址是否合法.
       {
              jump2app=(iapfun)*(vu32*)(appxaddr+4);        
//用户代码区第二个字为程序开始地址(复位地址)         
              MSR_MSP(*(vu32*)appxaddr);                               
//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
              jump2app();    //跳转到APP.
       }
}   栈顶地址是否合法怎么检测的
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-8-12
在线时间
1 小时
发表于 2014-11-17 20:05:21 | 显示全部楼层
看不明白  还有jump2app()怎么跳到应用程序代码的 没找到jump2app()下的子代码啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 02:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表