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。看两者一不一致。
评分
查看全部评分
我以前使用 sd 卡更新固件是没有问题的,
感觉这个才是问题关键,楼主的现象应该是在跑APP的时候产生了中断,而此时的中断向量还是IAP的,所以导致执行IAP的中断例程,从而导致APP挂掉,目前这个只是猜测,楼主试下就知道结果了。
评分
查看全部评分
你好,现在最新进展情况,
貌似执行了第 52 行的代码后就出现 什么 The stack pointer for stack 'CSTACK' (currently 0x20022CD8) is outside the stack range (0x200003B0 to 0x200043B0)
这个是怎么回事啊 ???????????
是不是我 的 iap 程序分的太大了啊 ? 我目前分配的是 256KB/512KB 结果也得是一样的不行
程序擦除函数如下:
int8_t FLASH_If_Erase(uint32_t StartSector)
{
uint32_t FlashAddress;
FlashAddress = StartSector;
/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
be done by word */
if (FlashAddress <= (uint32_t) USER_FLASH_LAST_PAGE_ADDRESS)
{
FLASH_EraseInitTypeDef FLASH_EraseInitStruct;
uint32_t sectornb = 0;
FLASH_EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
FLASH_EraseInitStruct.Sector = FLASH_SECTOR_5; // 单片机是2MBflash大小
//前面的256KB留给bootloader使用,所以
//此处是扇区5开始
FLASH_EraseInitStruct.NbSectors = FLASH_SECTOR_11 - FLASH_SECTOR_5 + 1;
FLASH_EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
if (HAL_FLASHEx_Erase(&FLASH_EraseInitStruct, §ornb) != HAL_OK)
return (1);
}
else
{
return (1);
}
return (0);
}
扇区分配如下:
你好,现在最新进展情况,
貌似执行了第 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。看两者一不一致。
评分
查看全部评分