源码:
#include <string.h>
#include "stm32_flash.h"
#include "App_Init.h"
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
Sysint();//系统初始化
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
/* GPIO初始化 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOF, &GPIO_InitStructure);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
/* GPIO初始化 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOF, GPIO_Pin_9);
GPIO_ResetBits(GPIOF, GPIO_Pin_10);
while(1)
{
delay_ms(100);
ReadFlagTable(&Flag_Table);//将标志位的表读
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
{
Flag_Table.ull_updaterun_flag =0x00000011;//写入APP1的向量表偏移长度
}
else if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)
{
Flag_Table.ull_updaterun_flag =0x00000022;//写入APP1的向量表偏移长度
}
switch (Flag_Table.ull_updaterun_flag)
{
case 0x00000011://跳转APP1
{
if(((*(vu32*)(STM32_FLASH_APP1_BASE+4))&0xFF000000)==0x08000000)//判断是否为Flash区域
{
if(Flag_Table.ull_vetofflen!=0x20000)
{
Flag_Table.ull_vetofflen =0x20000;//写入APP1的向量表偏移长度
WriteFlagTable(&Flag_Table);//将标志位的表写入
}
iap_load_app(STM32_FLASH_APP1_BASE);//程序跳转
}
}
break;
case 0x00000022://跳转APP2
{
if(((*(vu32*)(STM32_FLASH_APP2_BASE+4))&0xFF000000)==0x08000000)//判断是否为Flash区域
{
if(Flag_Table.ull_vetofflen!=0x40000)
{
Flag_Table.ull_vetofflen =0x40000;//写入APP1的向量表偏移长度
WriteFlagTable(&Flag_Table);//将标志位的表写入
}
iap_load_app(STM32_FLASH_APP2_BASE);//程序跳转
}
}
break;
default://默认在当前BootLoader中
{
GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
GPIO_ToggleBits(GPIOF, GPIO_Pin_10);
}
break;
}
}
}
|