你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教下,使用 iap 程序跳转 运行失败 ?

[复制链接]
hpdell 提问时间:2017-12-11 12:14 /
阅读主题, 点击返回1楼
收藏 评论38 发布时间:2017-12-11 12:14
38个回答
枫天2015 回答时间:2017-12-12 09:33:11
我用const数组的方式刚刚是OK的(KEIL),嗯接下来用SD升级下试试(Dfuse驱动装不上郁闷)。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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挂掉,目前这个只是猜测,楼主试下就知道结果了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

hpdell 回答时间:2017-12-12 19:52:41
本帖最后由 hpdell 于 2017-12-12 22:32 编辑
wofei1314 发表于 2017-12-12 14:29
M7的不需要这么操作,设定程序执行地址就行了吧

你好,现在最新进展情况,

jmp.png

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


扇区分配如下:
flash-sector.png








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 的内存不会释放掉。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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。看两者一不一致。

评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版