|

楼主 |
发表于 2023-5-10 15:42:10
|
显示全部楼层
刚刚又全部验证了一遍,情况和上面说的没有变化,附上代码如下:
bootloader的主函数(直接跳就不注释最后一行,平常是注释的):
int main(void)
{
/* USER CODE BEGIN 1 */
if(g_JumpInit==0xaa553344){
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}
}
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
IAP更新的代码(在这里写入Flash完成后,设置标志位然后软件复位):
//IAP更新代码
if(((*(vu32*)(0x24010000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_write_appbin(FLASH_APP1_ADDR,UPDATE_BUF,appsize);//更新FLASH代码
}
appsize=0;
is_CGI_getdata=0;
g_JumpInit=0xaa553344;
HAL_NVIC_SystemReset(); // 复位
跳转函数:
//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(uint32_t appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FF00000)==0x24000000) //检查栈顶地址是否合法.
{
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
/* 设置主堆栈指针 */
MSR_MSP(*(vu32*)appxaddr);
__set_CONTROL(0);
jump2app(); //跳转到APP.
}
}
app死在了这里:
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
再具体一点是HAL_RCC_ClockConfig这个函数里面的
tickstart = HAL_GetTick();
while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos))
{
if((HAL_GetTick() - tickstart ) > CLOCKSWITCH_TIMEOUT_VALUE)
{
return HAL_TIMEOUT;
}
}
在这一段跑飞了。 |
|