硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5780|回复: 2
收起左侧

[有问必答] F4的IAP程序掉电后不能重启动APP程序

[复制链接]

3

主题

3

回帖

12

积分

新手上路

积分
12
发表于 2016-5-19 21:47:11 | 显示全部楼层 |阅读模式
求大侠帮忙,最近在一个项目中需要bootloader支持,下面是我的IAP主程序
int main(void)
{
    uint8_t     key  = 0;

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

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

    BSP_Printf("Bootloader restart!\n\r");

    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!\n\r");
    BSP_Printf("Enter 1 to start YModem upgrade!\n\r");
    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.期望大侠能帮我分析一下。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-5-20 09:45:51 | 显示全部楼层
查下你的IAP程序是不是超过16KB了。
0x08000000~0x08003fff
回复

使用道具 举报

3

主题

3

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2016-5-20 20:26:01 | 显示全部楼层
问题已经解决了,原因是我的APP程序中有一部分对Flash的操作有点问题,目前已经解决了。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 01:12 , Processed in 0.041367 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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