打印
[应用相关]

关于 STM32 IAP问题!!!!!

[复制链接]
5250|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
天灵灵|  楼主 | 2009-2-11 17:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是按照的官方的AN2557 例子改写的程序

我希望在程序下载完成后能直接运行 我的新程序,就是直接跳到0X8002000处运行,我直接将他的 JUMP APP 的代码考过去,为什么程序跳不过去?

除非我复位下才能正确运行(也就是从程序开始就执行了JUMP APP部分的代码)。

还有个问题就是 在STM32中如何 实现 软件复位?能否提供相应代码,是不是
类似JUMP APP 代码将地址改成 0x8000000?有没有其他方法?

沙发
香水城| | 2009-2-12 08:58 | 只看该作者

看看生成的代码是否正确

使用特权

评论回复
板凳
ST_ARM| | 2009-2-12 09:21 | 只看该作者

你在哪个个板子上应用的?

使用特权

评论回复
地板
天灵灵|  楼主 | 2009-2-12 09:37 | 只看该作者

我在EK-STM32F 的开发板上用的

我在EK-STM32F 的开发板上用的

就改了按键,其他没变!

使用特权

评论回复
5
天灵灵|  楼主 | 2009-2-12 10:00 | 只看该作者

香版主,帮帮忙啊!

香版主,帮帮忙啊!
为什么我的跳转不好用?

使用特权

评论回复
6
天灵灵|  楼主 | 2009-2-12 10:30 | 只看该作者

继续提问!

我理解的IAP 有两种办法

1)在应用程序里置标志(存在IAP代码控制固定FLASH地址)然后复位,程序开始就判断这个标志 来确定要不要IAP更新
2)在 我的 应用程序里直接跳到 IAP 代码部分 来执行IAP 。
你看这两种办法那个可行?

不知道那种办法可行,那种不可行为什么?

使用特权

评论回复
7
McuIsp| | 2009-2-12 11:24 | 只看该作者

怎么进IAP,要根据应用的实际情况来定。

使用特权

评论回复
8
天灵灵|  楼主 | 2009-2-12 14:32 | 只看该作者

谁能具体说说我的办法是否可行

使用特权

评论回复
9
McuIsp| | 2009-2-12 14:46 | 只看该作者

是通过串口IAP还是?

使用特权

评论回复
10
天灵灵|  楼主 | 2009-2-12 15:33 | 只看该作者

是通过串口的

我的应用其实很简单,就是通过串口下载程序然后自动运行!

使用特权

评论回复
11
ST_ARM| | 2009-2-12 16:41 | 只看该作者

参考附件

这是我移植到EK-STM32F 的开发板的例程。你对比一下。
相关链接:https://bbs.21ic.com/upfiles/img/20092/2009212163614476.zip

使用特权

评论回复
12
computer00| | 2009-2-12 16:57 | 只看该作者

应该是跟某些寄存器没有复位到初始值有关。

最好是让系统复位,然后在对相关外设初始化之前判断复位源,再运行应用程序。
直接从IAP程序中跳转到应用程序,往往会导致某些意想不到的错误,主要是漏掉了某些寄存器没有复位。

现在的处理器通常都有软件复位的寄存器,写一下就行了。没有的话,可以考虑让狗动作。

使用特权

评论回复
13
myworkmail| | 2009-2-13 00:12 | 只看该作者

要侃侃

要侃侃

使用特权

评论回复
14
pheavecn| | 2009-2-13 00:19 | 只看该作者

可以参考我的IAP做法,用特殊的串口序列进入IAP.

应用程序检测到这个序列,复位.
而我的IAP Boot程序复位会检测这个序列,判断是否开始IAP,还是进入应用程序.

Jump App的代码,我用的嵌入汇编,共享出来: 
  asm("MOVW R1,#0x2000");//根据vector_table不同,需修改此处地址
  asm("MOVT R1,#0x0800");
  asm("LDR R0,[R1,#0]");
  asm("MSR MSP,R0");
  asm("MSR PSP,R0");
  asm("MOVW R1,#0x2004");//根据vector_table不同,需修改此处地址
  asm("MOVT R1,#0x0800");
  asm("LDR R0,[R1,#0]");
  asm("BX R0");

楼主可先试用一下我的Free STM32 IAP看看.

__McuIsp

使用特权

评论回复
15
McuIsp| | 2009-2-13 00:36 | 只看该作者

软件复位用固件库的NVIC_GenerateSystemReset()

或者
(*((vu32*)0xe000ed0c)) = ((u32)0x05FA0000) | (u32)0x04;
这两个是同一个道理.

使用特权

评论回复
16
McuPlayer| | 2009-2-13 01:06 | 只看该作者

我的IAP用的是“NVIC_GenerateSystemReset”

使用特权

评论回复
17
天灵灵|  楼主 | 2009-2-13 10:52 | 只看该作者

谢谢大家!!!

谢谢大家

1)看来直接从应用运行IAP程序不是个好办法,采用复位后直接进入会好一些。
2)关于系统复位我查了好半天才写了这么一段汇编代码嵌到了我的C程序里。
刚刚看到 McuIsp 及 McuPlayer 我才知道 原来有写好的函数给调用,呵呵
白忙活了,我细看库函数是一回事,他是调用的cortexm3_macro.s里的汇编。
同事感谢 pheavecn 我的跳转是参考的官方的那段C的代码呵呵。
3)ST_ARM 我有时间看看你的IAP实现方法,参考下。

再次谢谢大家!!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

31

帖子

0

粉丝