F4的IAP程序掉电后不能重启动APP程序

2019-07-20 22:09发布

求大侠帮忙,最近在一个项目中需要bootloader支持,下面是我的IAP主程序
int main(void)
{
    uint8_t     key  = 0;

    BSP_Init();                                                                /* 硬件初始化 (LED) */

    BSP_UART_Init(115200);                                            /* 串口初始化        */     

    BSP_Printf("Bootloader restart! ");

    BSP_APP_START(APPLICATION_ADDRESS);                  /* 起动APP程序       */

    BSP_APP_START(ORIGIBACKUP_ADDRESS);                 /* 起动备份APP程序   */   

    STM32F4_FLASH_Init();                                            /* 初始化flash操作   */

    BSP_Timer3_Init(5999, 6);                                        /* 定时器初始化      */   

                                                                              /* 如果用户区flash有写保护 */
    if (STM32F4_FLASH_GetWriteProtectionStatus() == 0)   
    {
        STM32F4_FLASH_DisableWriteProtection();
    }   
    BSP_Printf("Flash no program, please download! ");
    BSP_Printf("Enter 1 to start YModem upgrade! ");
    while(1)
    {
                /* 等待接收字符(通过电脑键盘输入) */
                key = GetKey(60000);

                if (key == 0x31)
                {
                        /* 下载新的用户代码到flash里面  */
                     TIM_StatusControl(TIM3, DISABLE);  /* 一定要关掉打开的中断 */         
                     Download();                                  /* Ymode协议接收*/
                     BSP_IAP(HeaderAddr);
                }

               if(IS_TIMEOUT_1MS(eTimUpdata, 200))
                     BSP_LED_Toggle(1u);
    }   
}


static void  BSP_IAP(uint32_t Address)
{
    if(((*(__IO uint32_t*)Address) & 0x2FFE0000) == 0x20000000)/* 检查栈顶地址是否合法   */
    {
        JumpAddress = *(__IO uint32_t*) (Address + 4);
        /* 用户应用地址 */
        Jump_To_Application = (pFunction) JumpAddress;
        /* 初始化MSP */
        __set_MSP(*(__IO uint32_t*) Address);
        Jump_To_Application();
    }
}


static void  BSP_APP_START(uint32_t Address)
{
    uint32_t    data = 0;
    PROGRAM     program;   
    uint32_t    crc;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE); /* CRC模块时钟初始化 */
        CRC_ResetDR();   

    memcpy(&program, (void*)ApplicationHeaderAddress, sizeof(PROGRAM));

    data = *(uint32_t*)Address;
    if(data != 0xFFFFFFFF)
    {
        //如果有中断,一定要关中断
        if(Address == APPLICATION_ADDRESS)
        {
            crc = CRC_CalcBlockCRC((uint32_t*)Address, program.APP.iLength);
            if((program.APP.iCheck == ApplicationCheck) && (crc == program.APP.iCRC))
            {
                BSP_IAP(APPLICATION_ADDRESS);            
            }
        }
        else if(Address == ORIGIBACKUP_ADDRESS)
        {
            crc = CRC_CalcBlockCRC((uint32_t*)Address, program.BCK.iLength);
            if((program.BCK.iCheck == ApplicationCheck) && (crc == program.BCK.iCRC))
            {
                BSP_IAP(ORIGIBACKUP_ADDRESS);            
            }        
        }
    }
}


上面就是IAP启动的主代码,通过J-Link仿真IAP程序时,既可以下载APP程序也可以顺利启动APP;但是只要把board断电重启,超级终端什么信息都没有打印出来,好像程序没有运行,但是Flash中没有APP段程序的情况下,bootloader可以掉电重启运行,我的IAP范围0x08000000~0x08003fff开始,APP范围0x08010000~0x080fffff.期望大侠能帮我分析一下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
信阳茶农
1楼-- · 2019-07-21 03:57
 精彩回答 2  元偷偷看……
DayDayUp
2楼-- · 2019-07-21 08:49
检查一下你的app写到了flash中还是在SRAM中?
信阳茶农
3楼-- · 2019-07-21 09:36
APPLICATION_ADDRESS定义的地址是0x08010000,通过Ymode协议写进去的,而且通过仿真查看memory的0x08010000地址,有程序。

一周热门 更多>