搜索
bottom↓
回复: 10

请教下 STM32F105 IAP的问题

[复制链接]

出0入14汤圆

发表于 2018-4-27 19:55:15 | 显示全部楼层 |阅读模式

如下图所示,为main()函数里面内容,省略了前面的初始化,


我从BOOT可以跳转到APP,在BOOT中也可以升级,

但是发现从APP跳转到BOOT后,可以初始化,0x58数据能发送,但是 while(1)程序无法运行,现象类似死机;

单独运行BOOT程序是没有问题的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入14汤圆

 楼主| 发表于 2018-4-27 22:44:03 | 显示全部楼层
请高手指点下,大概是哪里问题?

出0入0汤圆

发表于 2018-4-27 22:46:17 | 显示全部楼层
全局中断开了吗?

出0入14汤圆

 楼主| 发表于 2018-4-27 23:03:30 | 显示全部楼层

还真有可能是这个问题,

查找了下,只在跳转的时候  __set_FAULTMASK(1);  关闭了

跳到BOOT后没找到打开的地方;

出100入113汤圆

发表于 2018-4-27 19:55:16 | 显示全部楼层
app 进去 boot ,最好直接触发复位,这样相当于boot全新运行。跳转过去,要注意很多细节,比如可能全局变量没有初始化,或者中断没关等,都可能会导致问题。

出0入14汤圆

 楼主| 发表于 2018-4-27 23:36:01 | 显示全部楼层
saccapanna 发表于 2018-4-27 23:22
app 进去 boot ,最好直接触发复位,这样相当于boot全新运行。跳转过去,要注意很多细节,比如可能全局变量 ...

我也刚想问这个问题

比如,在APP中开了其他的定时器 及 SPI 等,然后 关中断,跳到 BOOT,开中断

在BOOT中, NVIC_Configuration()  又 没设置那些话,那么 会造成 错误导致 跑飞 那些 吗

===============

还有,如果 APP 跳到 BOOT中再复位的话,那么可不可以   不跳转,直接在 APP 中复位呢 (我用flash保存了一个状态值,可以判断是 升级APP 还是直接 运行APP)

哪种方式更好?

出0入14汤圆

 楼主| 发表于 2018-4-27 23:42:38 | 显示全部楼层
saccapanna 发表于 2018-4-27 23:22
app 进去 boot ,最好直接触发复位,这样相当于boot全新运行。跳转过去,要注意很多细节,比如可能全局变量 ...


就是直接将 以下 程序

if (((*(vu32*)IAP_StartAddress) & 0x2FFE0000 ) == 0x20000000)
         {
              // Jump to user application
              JumpAddress = *(vu32*) (IAP_StartAddress + 4);
              Jump_To_Application = (pFunction) JumpAddress;
              //Initialize user application's Stack Pointer
              __set_MSP(*(vu32*) ApplicationAddress);
              Jump_To_Application();
         }

换成 复位的程序

        __set_FAULTMASK(1);//- 关闭所有中断
        NVIC_SystemReset();//复位-升级完成- 系统复位
        __DSB();

出100入113汤圆

发表于 2018-4-27 23:46:14 | 显示全部楼层
isakura 发表于 2018-4-27 23:36
我也刚想问这个问题

比如,在APP中开了其他的定时器 及 SPI 等,然后 关中断,跳到 BOOT,开中断

通用做法,都是直接在app中复位进入boot,boot中用过的东西要全部恢复,关键是外设和中断!然后读取应用区MSP值和入口地址,跳转到入口地址启动app。

出0入14汤圆

 楼主| 发表于 2018-4-28 00:04:07 | 显示全部楼层
saccapanna 发表于 2018-4-27 23:46
通用做法,都是直接在app中复位进入boot,boot中用过的东西要全部恢复,关键是外设和中断!然后读取应用 ...


boot中用过的东西要全部恢复
======
这个没问题,复位可以解决,而且也不一定要复位,BOOT中用到的东西,一般在APP中也有用到

MSP值
===
这个具体是指什么,我看网上的跳转程序一般都是这样,没看到保存MSP值的地方;
void _JumptoUserApp(void)
{
          /* Test if user code is programmed starting from address "ApplicationAddress" */
          if (((*(vu32*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
         {
              /* Jump to user application */
              JumpAddress = *(vu32*) (ApplicationAddress + 4);
              Jump_To_Application = (pFunction) JumpAddress;
              /* Initialize user application's Stack Pointer */
              __set_MSP(*(vu32*) ApplicationAddress);
              Jump_To_Application();
         }
}

app中复位进入boot
=====
有点疑惑,关于复位时,状态保持的问题,尽管目前没碰到,但是很容易假设一个现象,

假设有个IO口要控制 POWER,一直要高电平或者 低电平(一般是高电平)保持显示之类的
但是在复位的时候会不会对IO造成影响?

如果会有影响,这类极端情况要怎么处理?

出100入113汤圆

发表于 2018-4-28 08:22:31 | 显示全部楼层
isakura 发表于 2018-4-28 00:04
boot中用过的东西要全部恢复
======
这个没问题,复位可以解决,而且也不一定要复位,BOOT中用到的东西 ...

了解了内核是怎么启动的,就没什么难的了。STM32三个文档一定要看:
1. 内核编程手册,例如cortex-m3的手册,相同内核芯片通用的。
2. 芯片的参考手册,系列通用。
3. 数据手册,详细描述某个型号存储,引脚,电气参数等方面的细节。

芯片启动是先从起始地址加载4个直接到MSP也就是栈指针,接下来四个细节就是程序入口地址。

出100入113汤圆

发表于 2018-4-28 08:35:39 | 显示全部楼层
这个在内核编程手册中有。如果要保持某个IO状态,这个要硬件电路设计时保证,例如加上下拉电阻。芯片复位后IO是高阻状态。

复位后的启动基本是固定的,你只能选择复位进去 boot 或 app,一般是进去 boot,boot中用的资源少,现场容易恢复。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 09:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表