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

请教下,使用 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版