IAP升级带ucos的APP无法成功运行

2019-07-20 06:06发布

STM32F407,用bootloader通过USB程序更新APP,当app程序中没有ucos系统时,每次都成功更新app程序且跳转。
当APP中有ucos时,更新完成后app程序无法顺利运行。

已经试过的方法如下:1,在bootloader跳转到app前,在bootloader中关闭外设和USB时钟。
2.在APP的OSStart()函数前重新偏移向量表。SCB->VTOR=FLASH_BASE|0x10000;

APP程序中有ucos系统,SD卡,FATFS文件描述等。(单独是可以运行的)

有人出现过类似的问题吗?求解决



T0)OV)A6}U2L3%V53LD@L)G.png


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
hi我歌月徘徊
1楼-- · 2019-07-20 10:54
我也遇到过这样的问题 原子的例程 裸机怎么跳都没事 带ucos就不行 换用下面的跳转代码解决问题了
//2018/8/11 解决ucos3无法跳转的问题
void jump_to_app(uint32_t app_address)
{
    typedef void (*_func)(void);

    __disable_irq();

    /* MCU peripherals re-initial. */
    {
        GPIO_InitTypeDef GPIO_InitStruct;

        GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;

        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStruct.GPIO_Pin &= ~(GPIO_Pin_13 | GPIO_Pin_14); /* SWDIO/SWCLK */
        GPIO_Init(GPIOA, &GPIO_InitStruct);

        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
        GPIO_Init(GPIOC, &GPIO_InitStruct);
        GPIO_Init(GPIOD, &GPIO_InitStruct);
        GPIO_Init(GPIOE, &GPIO_InitStruct);
        GPIO_Init(GPIOF, &GPIO_InitStruct);
        GPIO_Init(GPIOG, &GPIO_InitStruct);
        GPIO_Init(GPIOH, &GPIO_InitStruct);
        GPIO_Init(GPIOI, &GPIO_InitStruct);

        /* reset systick */
        SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;

        /* disable all peripherals clock. */
        RCC->AHB1ENR = (1<<20); /* 20: F4 CCMDAT ARAMEN. */
        RCC->AHB2ENR = 0;
        RCC->AHB3ENR = 0;
        RCC->APB1ENR = 0;
        RCC->APB2ENR = 0;

        /* Switch to default cpu clock. */
        RCC->CFGR = 0;
    } /* MCU peripherals re-initial. */

    /* Disable MPU */
    MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;

    /* disable and clean up all interrupts. */
    {
        int i;

        for(i = 0; i < 8; i++)
        {
            /* disable interrupts. */
            NVIC->ICER[i] = 0xFFFFFFFF;

            /* clean up interrupts flags. */
            NVIC->ICPR[i] = 0xFFFFFFFF;
        }
    }

    /* Set new vector table pointer */
    SCB->VTOR = app_address;

    /* reset register values */
    __set_BASEPRI(0);
    __set_FAULTMASK(0);

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

    /* ensure what we have done could take effect */
    __ISB();

    __disable_irq();

    /* never return */
    ((_func)(*(uint32_t*)(app_address + 4)))();
}
正点原子
2楼-- · 2019-07-20 14:00
估计还是你的中断向量设置问题。
moonsex
3楼-- · 2019-07-20 14:03
 精彩回答 2  元偷偷看……
moonsex
4楼-- · 2019-07-20 14:53
正点原子 发表于 2018-8-30 01:34
估计还是你的中断向量设置问题。

或者说,我应该怎么设置中断向量
水上的树
5楼-- · 2019-07-20 15:27
 精彩回答 2  元偷偷看……
moonsex
6楼-- · 2019-07-20 17:02
 精彩回答 2  元偷偷看……

一周热门 更多>