打印

stm32f系列芯片BootLoader的一个缺陷,令人郁闷:

[复制链接]
11120|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pheavecn|  楼主 | 2008-8-28 11:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用isp的执行功能从0x8000000执行程序后,提示Ok。
但是为什么没有程序执行的反应呢,郁闷。


答案是:
stm32f的BootLoader程序没有根据你的vector_table初始化MSP,而是用0x20000000~0x20000200的512字节大的堆栈,如果你使用了大堆栈,或使用的变量位于0x20000000~0x20000200区间,则整个乱套

解决方法:

1、用嵌入汇编在__low_level_init中初始化MSP。

#pragma language=extended
__interwork int __low_level_init(void);
#pragma location="ICODE"
__interwork int __low_level_init(void)
{
  asm("MOVW R1,#0x0000");//根据vector_table不同,需修改此处地址
  asm("MOVT R1,#0x0800");
  asm("LDR R0,[R1,#0]");
  asm("MSR MSP,R0");
  asm("MSR PSP,R0");
  return 1;
}

2、对于IAR EWARM 442,修改启动文件,在cmain_ctx.s79加入如下代码:
    ldr   r1,=__vector_table
    ldr   r0,[r1,#0]
    msr   msp,r0
   并将cmain_ctx.s79加入工程
   修改好的cmain_ctx.s79见附件。
   此法比较好。
   在IAR EWARM 520,还未找到相应方法。
http://www.mcuisp.com/ispiap_note_stm32GoStackIssue.htm


相关链接:https://bbs.21ic.com/upfiles/img/200710/20071013112735121.rar
沙发
香水城| | 2008-8-28 11:37 | 只看该作者

哈哈,这不能算是一个缺陷吧

Bootloader不可能知道你下载的程序是否有vector_table,所以也无法根据你的需要初始化MSP;当然如果手册中能够说明下载进去的程序,需要自己初始化MSP即可。

使用特权

评论回复
板凳
xwj| | 2008-8-28 11:45 | 只看该作者

这个颜色也太刺眼了吧?

建议改成白色;-)

使用特权

评论回复
地板
john_light| | 2008-8-28 12:25 | 只看该作者

老徐,公开一下你的HTML着色UltraEdit模板吧

不过,不用UE很久了……

使用特权

评论回复
5
xwj| | 2008-8-28 12:41 | 只看该作者

*美化论坛,发彩色代码的简单方法(完整功能版)*

*美化论坛,发彩色代码的简单方法(完整功能版)*  
呵呵


使用方法:

在下面链接上点右键另存,文件保存成RAR(扩展名),解压到任意目录

然后打开UltraEdit,选择菜单的“宏”--“设置自动加载宏”,加载解压的"ABC语法加亮宏.MAC"文件,运行次数选择0

(以上只需一次)

以后只要按Ctrl+F12键把C语言源程序自动转换21IC上的彩色代码

按Ctrl+F11可以把汇编(ASM)语言源程序自动转换21IC上的彩色代码
 
 

相关链接:https://bbs.21ic.com/upfiles/img/200710/2007101312582444.rar

使用特权

评论回复
6
pheavecn|  楼主 | 2008-8-28 14:00 | 只看该作者

呵呵,这个香版就不清楚了。

给BootLoader下达从0x8000000运行程序的Go命令后,BootLoader会到0x8000004取真正的入口地址。
你说“Bootloader知不知道你下载的程序是否有vector_table”?

使用特权

评论回复
7
香水城| | 2008-8-28 18:38 | 只看该作者

这个入口地址是由GO命令带进去的参数

这样可以允许下载任何程序,不一定需要有vector_table也可以的。

还可以下载程序到RAM的任何区域不执行。

这个GO命令的目的是实现一些测试(比如在RAM中运行),而不仅仅是烧写完Flash后跳到Flash运行;如果仅仅是跳到Flash运行,这个功能就没有太大意思了。

使用特权

评论回复
8
pheavecn|  楼主 | 2008-8-28 20:14 | 只看该作者

Go命令带的参数就是vector_table的基址。

这个功能在用ISP调试程序时很方便。不用重新去跳Boot0跳线,和复位。

使用特权

评论回复
9
香水城| | 2008-8-28 22:28 | 只看该作者

没有规定GO命令带的参数一定是Vector_table的基址

这个参数可以使任意合法的地址

使用特权

评论回复
10
pheavecn|  楼主 | 2008-8-28 23:46 | 只看该作者

呵呵,香版敢下点赌注么。

提示:下面是BootLoader最终开始跳转的语句。R4内容就是Go命令的参数。
  1FFFF57C  6860      LDR          R0, [R4, #4]
  1FFFF57E  4780      BLX          R0


我要N片stm32f芯片,呵呵。

使用特权

评论回复
11
simon21ic| | 2008-8-29 01:27 | 只看该作者

谢谢提醒

偶d STM32USBBoot也会越来越完善,现在也可以支持GO命令,ISP更新完,可以直接跳转到Application,对应STM32Boot的-x参数

u32 BL_Address;
......
__MSR_MSP(*(vu32 *)BL_Address);
((void (*)(void))(*(u32 *)(BL_Address + 4)))();

这样就没有问题了吧

使用特权

评论回复
12
winloop| | 2008-8-29 15:48 | 只看该作者

太高端了

这个到底影响什么?

使用特权

评论回复
13
pheavecn|  楼主 | 2008-8-30 00:41 | 只看该作者

呵呵,影响ISP盲调。

即直接用ISP下载程序到目标系统,运行看结果的调试方法。

stm32f ISP盲调,目前最方便的是我的程序,呵呵。
www.mcuisp.com可下载最新版本。

使用特权

评论回复
14
香水城| | 2008-9-1 10:56 | 只看该作者

请教楼主你用的芯片中的Bootloader版本号是多少?

你说的这个问题存在于V2.0中,但已经在V2.1中解决。

使用特权

评论回复
15
pheavecn|  楼主 | 2008-9-1 11:27 | 只看该作者

呵呵,是2.0的。

我目前碰到的片子都是2.0的。
包括N块万利板。N片购买的芯片。

芯片上版本号印的是"Z"
STM32F103
VBT6  Z

不过ISP程序要支持所有的版本的BootLoader才对。

能否申请片包含V2.1 BootLoader的样片,VBT6?

使用特权

评论回复
16
McuPlayer| | 2008-9-1 17:42 | 只看该作者

最不喜欢看人用ISP盲调了

一下子就显得我这用仿真器的,水平比人家低一大截

使用特权

评论回复
17
pheavecn|  楼主 | 2008-9-1 18:07 | 只看该作者

呵呵,各有各的好处。

用OTP片盲调,那才真锻炼编程水平。

stm32f有串口,isp盲调还蛮舒服的。

使用特权

评论回复
18
mohanwei| | 2008-9-1 18:08 | 只看该作者

楼主说:最不喜欢看到有人动不动就用仿真器了,一点技术

都没有……

使用特权

评论回复
19
pheavecn|  楼主 | 2008-9-1 20:12 | 只看该作者

呵呵,LS,我有仿真器时也优先用呀。

不过挺享受那种编出来的程序就基本跑通的感觉。

使用特权

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

本版积分规则

88

主题

918

帖子

0

粉丝