The stack pointer for stack 'CSTACK' (currently 0x20022CD8) is outside the stack range (0x200003B0 to 0x200043B0)
这是栈指针指向了非法地址了(溢出),
if (((*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS ) & 0x2FFE0000 ) == 0x20000000)
出错,说明你APP的栈顶地址不合法。
以上错误都表明你USER_FLASH_FIRST_PAGE_ADDRESS这个地址的值不对。
你说你直接下APP可以正常,我感觉你可以下载后用JLINK把程序读回,看下USER_FLASH_FIRST_PAGE_ADDRESS这个地址的值是多少,假设为A
然后把IAP和APP都下载后(不能正常工作的),也用JLINK把程序读回,看下USER_FLASH_FIRST_PAGE_ADDRESS这个地址的值是多少,假设为B。看两者一不一致。
你好,现在最新进展情况,
貌似执行了第 52 行的代码后就出现 什么 The stack pointer for stack 'CSTACK' (currently 0x20022CD8) is outside the stack range (0x200003B0 to 0x200043B0)
这个是怎么回事啊 ???????????
是不是我 的 iap 程序分的太大了啊 ? 我目前分配的是 512KB。
M7 官网也是这么操作的
评分
查看全部评分
重新复位后,程序会执行 跳转函数,但是执行到 15 楼图片里面的 52行就会出现同样的问题,现在估计问题就在这个地方出错了,无法进行准确的跳转了 ????
我现在把 iap 的代码 改成了 256KB 以内,结果也还是一样的,
正常来说应该会有下面的这个判断,但是我使用下面的进行判断时会提示错误 ,也不知道是为何,
这个也是我按照官网的历程来改的,现在也确定我 的 单片机的 内存扇区分配有没有搞对啊 ???
单片机型号是 stm32F777BIT6 的, 你有时间的话,帮我看,
if (((*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS ) & 0x2FFE0000 ) == 0x20000000) // 判断会出错??
这是栈指针指向了非法地址了(溢出),
if (((*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS ) & 0x2FFE0000 ) == 0x20000000)
出错,说明你APP的栈顶地址不合法。
以上错误都表明你USER_FLASH_FIRST_PAGE_ADDRESS这个地址的值不对。
你说你直接下APP可以正常,我感觉你可以下载后用JLINK把程序读回,看下USER_FLASH_FIRST_PAGE_ADDRESS这个地址的值是多少,假设为A
然后把IAP和APP都下载后(不能正常工作的),也用JLINK把程序读回,看下USER_FLASH_FIRST_PAGE_ADDRESS这个地址的值是多少,假设为B。看两者一不一致。
评分
查看全部评分
好的,多谢多谢啊
你好,我放在 app 地址 的值如下:
0x08020000 - 0x08080000 表示 app的起始地址
// 根据不同的 用户 app 的地址,仿真得到的结果值
JumpAddress = ((*(__IO uint32_t*) 0x08080000 ) & 0x2FFE0000 ); // = 0x20020000 仿真后得到的结果值
JumpAddress = ((*(__IO uint32_t*) 0x08060000 ) & 0x2FFE0000 ); // = 0x2FFE0000 仿真后得到的结果值
JumpAddress = ((*(__IO uint32_t*) 0x08040000 ) & 0x2FFE0000 ); // = 0x2D700000 仿真后得到的结果值
JumpAddress = ((*(__IO uint32_t*) 0x08020000 ) & 0x2FFE0000 ); // = 0x2F3E0000 仿真后得到的结果值
这个又说明什么情况啊 ??
评分
查看全部评分
我现在app 的运行地址是 0x08040000 这个,我现在 吧 iAp 程序大小减小到 < 256KB了
现在操作 擦除 扇区的 起始扇区号为 FLASH_SECTOR_5 ,结束
FLASH_SECTOR_11 - FLASH_SECTOR_5 + 1
好的,我参考一下,多些多谢啊
现在可以实现 app 无系统的程序跳转了,带系统的程序跳转貌似还是不行,
在 iap 程序跳转前,需要关闭
void Jump_To_APP(void)
{
//检测APP地址是否合法
printf("\r\n_______ *** *** Jump to the new program run please ... *** ***_______\r\n\r\n");
// 判断栈顶地址是否在0x2000 0000 - 0x2000 2000之间,这个判断也可以使用,完全木有任何问题的
if (((*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS ) & 0x2FFE0000 ) == 0x20000000)
{
// 通过判断栈顶地址值是否正确来判断是否已经下载用户应用程序。因为用户程序的启动文件开始会初始化栈空间,如果栈顶地址正确,说明用户程序已经下载
// __ASM("CPSID I");
// Jump to user application
JumpAddress = *(__IO uint32_t*) (USER_FLASH_FIRST_PAGE_ADDRESS + 4);// 前4字节为中断向量表
Jump_To_Application = (pFunction) JumpAddress;// 指向用户程序复位函数所在的地址
// 关闭所有外设中断
HAL_NVIC_DisableIRQ(ETH_IRQn);
HAL_NVIC_DisableIRQ(USART1_IRQn); //关闭串口中断
HAL_NVIC_DisableIRQ(SD_IRQn);
HAL_NVIC_DisableIRQ(SD_DMAx_Rx_IRQn);
HAL_NVIC_DisableIRQ(SD_DMAx_Tx_IRQn);
PWM_Stop();
HAL_FLASH_Lock();
__disable_irq(); //关闭总中断
{
/*
Reset of all peripherals
这些外设关闭非常重要,否则不能够正常实现程序跳转功能,切记切记
*/
__APB1_FORCE_RESET();
__APB1_RELEASE_RESET();
__APB2_FORCE_RESET();
__APB2_RELEASE_RESET();
__AHB1_FORCE_RESET();
__AHB1_RELEASE_RESET();
__AHB2_FORCE_RESET();
__AHB2_RELEASE_RESET();
__AHB3_FORCE_RESET();
__AHB3_RELEASE_RESET();
HAL_RCC_DeInit();
}
__set_PSP(*(volatile uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);
__set_CONTROL(0);
//设置APP程序堆栈指针
__set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS); // 设置用户程序的栈指针
__set_CONTROL(0);
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; // 关闭滴答定时器中断
SysTick->VAL = 0;
SysTick->LOAD = 0;
Jump_To_Application(); // 执行用户程序
}
else
{
printf("jump uaer app run error ??\r\n");
for(;;)
{}
}
}
现在 app 程序带 系统的,跳转会失败,还需要关闭哪些 功能啊 ????????
这个和我贴的原理不一样啊,这种是原始方式的...
F7的可以通过向Flash写入boot地址数据,重启之后直接从新的Boot启动,无需关中断啥的...理论上和APP有没有系统无关
你好,你贴的这段代码我貌似没有看懂啊 ?