OpenEdv-开源电子网

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

STM32F429 FreeRTOS使用IAP跳转

[复制链接]

1

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2012-7-19
在线时间
113 小时
发表于 2017-11-6 17:35:16 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 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\r\n",((vu32)appxaddr)&0xFF000000);
        if((((vu32)appxaddr)&0xFF000000)==0x08000000)        
        {
                printf("验证成功,开始跳转2\r\n");
                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]

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

最佳答案

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

找到原因了,原来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) ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2012-7-19
在线时间
113 小时
 楼主| 发表于 2017-11-6 17:35:17 | 显示全部楼层
找到原因了,原来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]

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

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-11-6 17:55:53 | 显示全部楼层
APP编译的时候中断没偏移?
回复

使用道具 举报

1

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2012-7-19
在线时间
113 小时
 楼主| 发表于 2017-11-6 21:26:12 | 显示全部楼层
八度空间 发表于 2017-11-6 17:55
APP编译的时候中断没偏移?

偏移了。APP的初始化都通过了,到创建第一个任务,开启任务调度,PC指针就跑偏了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-11-7 00:36:43 | 显示全部楼层
感觉像是中断向量偏移表没设置好
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-11-7 09:05:17 | 显示全部楼层
leoo 发表于 2017-11-6 21:26
偏移了。APP的初始化都通过了,到创建第一个任务,开启任务调度,PC指针就跑偏了

便宜好了还会偏?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

1

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2012-7-19
在线时间
113 小时
 楼主| 发表于 2017-11-7 09:52:17 | 显示全部楼层

        SCB->VTOR = FLASH_BASE | 0x10000;//设置偏移量
       
         HAL_Init();                     //初始化HAL库
        Stm32_Clock_Init(384,25,2,8);//设置时钟,192Mhz
        delay_init(192);                        //初始化延时函数

是呀,初始化前面的偏移量也是设置对的,
回复

使用道具 举报

1

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2012-7-19
在线时间
113 小时
 楼主| 发表于 2017-11-7 09:53:47 | 显示全部楼层
正点原子 发表于 2017-11-7 00:36
感觉像是中断向量偏移表没设置好

原子老大,应该从哪个地方入手检查呢,方法都试过来了,还是没有改善
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-11-7 11:01:59 | 显示全部楼层
leoo 发表于 2017-11-7 09:52
SCB->VTOR = FLASH_BASE | 0x10000;//设置偏移量
       
         HAL_Init();                     //初始化HAL库 ...

建议不要再main中偏移,直接修改hal库中的偏移量
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2018-6-8
在线时间
11 小时
发表于 2019-8-18 19:42:47 | 显示全部楼层
你好我也是在bootloader中使用freertos,但是在APP中发现不能使用HAL_Delay (使用会进Hardfault)只能使用osDelay .请问下你遇到这个情况么。望回复
回复

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2020-5-3
在线时间
33 小时
发表于 2020-8-9 13:13:04 | 显示全部楼层
我在调试407的板子也遇到了类似的问题,不过我的App使用的时RTX,这个问题同样困惑了很长时间,最终感觉也许是IAP下载带系统的App时,跳转到App前谨慎关闭全局中断,也许这个帖子过了很久,不过还是发出来了;
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-30 16:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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