OpenEdv-开源电子网

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

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

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-4-21
在线时间
5 小时
发表于 2016-5-19 21:28:11 | 显示全部楼层 |阅读模式
5金钱
求大侠帮忙,最近在一个项目中需要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.期望大侠能帮我分析一下。

最佳答案

查看完整内容[请看2#楼]

答案已经找到了,是因为APP程序中的一个任务函数引起的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-4-21
在线时间
5 小时
 楼主| 发表于 2016-5-19 21:28:12 | 显示全部楼层
答案已经找到了,是因为APP程序中的一个任务函数引起的
回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-11-26
在线时间
9 小时
发表于 2016-5-20 00:45:49 | 显示全部楼层
检查一下你的app写到了flash中还是在SRAM中?
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-4-21
在线时间
5 小时
 楼主| 发表于 2016-5-20 09:15:02 | 显示全部楼层
APPLICATION_ADDRESS定义的地址是0x08010000,通过Ymode协议写进去的,而且通过仿真查看memory的0x08010000地址,有程序。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 09:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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