本帖最后由 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指针由原来的
变为
这是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]
在论坛找了好多方法,都没有解决问题。
//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]
这样就解决了这个问题,这几天的不断找问题,对中断向量表有了一个比较清晰的认识。
一周热门 更多>