枫天2015 发表于 2017-12-12 09:33:11

我用const数组的方式刚刚是OK的(KEIL),嗯接下来用SD升级下试试(Dfuse驱动装不上郁闷)。:lol

hpdell 发表于 2017-12-12 10:30:51

枫天2015 发表于 2017-12-12 09:33
我用const数组的方式刚刚是OK的(KEIL),嗯接下来用SD升级下试试(Dfuse驱动装不上郁闷)。 ...

我以前使用 sd 卡更新固件是没有问题的,

wofei1314 发表于 2017-12-12 14:29:15

M7的不需要这么操作,设定程序执行地址就行了吧

任风吹吹 发表于 2017-12-12 15:12:24

本帖最后由 任风吹吹 于 2017-12-12 15:17 编辑

安 发表于 2017-12-12 08:32
上电的时候先跑了一段延时,应该先进行向量的配置,再跑延时。
感觉这个才是问题关键,楼主的现象应该是在跑APP的时候产生了中断,而此时的中断向量还是IAP的,所以导致执行IAP的中断例程,从而导致APP挂掉,目前这个只是猜测,楼主试下就知道结果了。

hpdell 发表于 2017-12-12 19:52:41

本帖最后由 hpdell 于 2017-12-12 22:32 编辑

wofei1314 发表于 2017-12-12 14:29
M7的不需要这么操作,设定程序执行地址就行了吧
你好,现在最新进展情况,



貌似执行了第 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 , 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);
}


扇区分配如下:









hpdell 发表于 2017-12-12 19:53:46

本帖最后由 hpdell 于 2017-12-12 19:57 编辑

任风吹吹 发表于 2017-12-12 15:12
感觉这个才是问题关键,楼主的现象应该是在跑APP的时候产生了中断,而此时的中断向量还是IAP的,所以导致 ...
你好,现在最新进展情况,



貌似执行了第 52 行的代码后就出现 什么The stack pointer for stack 'CSTACK' (currently 0x20022CD8) is outside the stack range (0x200003B0 to 0x200043B0)

这个是怎么回事啊 ???????????

是不是我 的 iap 程序分的太大了啊 ? 我目前分配的是 512KB。

hpdell 发表于 2017-12-12 22:05:36

wofei1314 发表于 2017-12-12 14:29
M7的不需要这么操作,设定程序执行地址就行了吧

M7 官网也是这么操作的

maxtch 发表于 2017-12-12 22:15:51

执行完 IAP 之后,直接复位单片机不行吗?要不然 bootloader 的内存不会释放掉。

hpdell 发表于 2017-12-12 22:30:31

maxtch 发表于 2017-12-12 22:15
执行完 IAP 之后,直接复位单片机不行吗?要不然 bootloader 的内存不会释放掉。 ...

重新复位后,程序会执行 跳转函数,但是执行到 15 楼图片里面的 52行就会出现同样的问题,现在估计问题就在这个地方出错了,无法进行准确的跳转了 ????

我现在把 iap 的代码 改成了 256KB 以内,结果也还是一样的,

正常来说应该会有下面的这个判断,但是我使用下面的进行判断时会提示错误 ,也不知道是为何,
这个也是我按照官网的历程来改的,现在也确定我 的 单片机的 内存扇区分配有没有搞对啊 ???
单片机型号是 stm32F777BIT6 的, 你有时间的话,帮我看,

if (((*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS ) & 0x2FFE0000 ) == 0x20000000)// 判断会出错??

eagle0754 发表于 2017-12-13 08:35:57

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。看两者一不一致。
页: 1 [2] 3 4
查看完整版本: 请教下,使用 iap 程序跳转 运行失败 ?