STM32F429 FreeRTOS使用IAP跳转

2019-07-20 11:08发布

本帖最后由 leoo 于 2017-11-6 17:41 编辑

硬件:阿波罗STM32F429
问题描述:
1、APP单独运行完全可以,用IAP方式下载就出现故障
2、bootloader 跳转到APP时,程序运行到
[mw_shl_code=c,true]                xTaskCreate((TaskFunction_t )         start_task,
                                                                (char*                                        )         "start_task",
                                                                (uint16_t                                )         START_STK_SIZE,
                                                                (void*                                         )         NULL,
                                                                (UBaseType_t                )         START_STK_PRIO,
                                                                (TaskHandle_t *        )         &StartTask_Handler );
               
                vTaskStartScheduler();                                        //开启任务调度器                  [/mw_shl_code]

vTaskStartScheduler();任务调度器开启之后,
PC指针由原来的 22222.jpg   变为 1111.jpg

这是BootLoader的跳转函数
[mw_shl_code=c,true]void iap_load_app(u32 appxaddr)
{
        printf("开始跳转判断2=%x ",((vu32)appxaddr)&0xFF000000);
        if((((vu32)appxaddr)&0xFF000000)==0x08000000)        
        {
                printf("验证成功,开始跳转2 ");
                SCB->VTOR = appxaddr;
    /* reset register values */
    __set_BASEPRI(0);
    __set_FAULTMASK(0);

    /* set up MSP and switch to it */
    __set_MSP(*(uint32_t*)appxaddr);
    __set_PSP(*(uint32_t*)appxaddr);
    __set_CONTROL(0);

    /* ensure what we have done could take effect */
    __ISB();
    __disable_irq();
                INTX_DISABLE();
                jump2app=(iapfun)*(vu32*)(appxaddr+4);                  
                jump2app();                                                                  
        }
}                 [/mw_shl_code]

在论坛找了好多方法,都没有解决问题。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
leoo
2019-07-20 14:12
找到原因了,原来sys.c里面有这个函数[mw_shl_code=c,true]//系统时钟初始化函数
//plln:主PLL倍频系数(PLL倍频),取值范围:64~432.
//pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
//pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
//pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
{  
        RCC->CR|=0x00000001;                //设置HISON,开启内部高速RC振荡
        RCC->CFGR=0x00000000;                //CFGR清零
        RCC->CR&=0xFEF6FFFF;                //HSEON,CSSON,PLLON清零
        RCC->LLCFGR=0x24003010;        //PLLCFGR恢复复位值
        RCC->CR&=~(1<<18);                        //HSEBYP清零,外部晶振不旁路
        RCC->CIR=0x00000000;                //禁止RCC时钟中断
        Sys_Clock_Set(plln,pllm,pllp,pllq);//设置时钟
        //配置向量表                                  
#ifdef  VECT_TAB_RAM
        MY_NVIC_SetVectorTable(1<<29,0x0);
#else   
        MY_NVIC_SetVectorTable(0,0x0);
#endif
}                    [/mw_shl_code]

这里调用又把PC指针给改回去了,修改完的代码如下
[mw_shl_code=c,true]//系统时钟初始化函数
//plln:主PLL倍频系数(PLL倍频),取值范围:64~432.
//pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
//pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
//pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
{  
        RCC->CR|=0x00000001;                //设置HISON,开启内部高速RC振荡
        RCC->CFGR=0x00000000;                //CFGR清零
        RCC->CR&=0xFEF6FFFF;                //HSEON,CSSON,PLLON清零
        RCC->LLCFGR=0x24003010;        //PLLCFGR恢复复位值
        RCC->CR&=~(1<<18);                        //HSEBYP清零,外部晶振不旁路
        RCC->CIR=0x00000000;                //禁止RCC时钟中断
        Sys_Clock_Set(plln,pllm,pllp,pllq);//设置时钟
        //配置向量表                                  
#ifdef  VECT_TAB_RAM
        MY_NVIC_SetVectorTable(1<<29,0x0);
#else   
        MY_NVIC_SetVectorTable(0,0x0);
       
                SCB->VTOR = FLASH_BASE | 0x10000;//设置偏移量
       
#endif
}                    [/mw_shl_code]

这样就解决了这个问题,这几天的不断找问题,对中断向量表有了一个比较清晰的认识。

一周热门 更多>