打印

STM32F101xx IAP能下进去程序但程序不能运行的原因

[复制链接]
5698|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xijing0508|  楼主 | 2009-7-8 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32F101XX的Flash中用先用内部引导程序写入IAP程序没有问题,再用IAP写入APP程序,程序能写入但却运行不了是什么原因?
     同样的做法用在STM32103xx上就没有问题APP程序能下载进去也能运行.
     两个IAP不一样的地方就只是flash的大小和flash中page的大小.
沙发
香水城| | 2009-7-8 22:07 | 只看该作者
你能确定你的程序正确地烧写下去了吗?

STM32的Flash中Page的大小,在相同容量的STM32F101xx和STM32F103xx中是一样的,程序也应该是一样的。

使用特权

评论回复
板凳
xijing0508|  楼主 | 2009-7-9 13:37 | 只看该作者
我在STM32F103VET6上做的IAP程序可以,
STM32F103VET6   Flash:512K   ram:64K
Flash的每个page个2k(高密度)
但在STM32F101C8T6上做的IAP程序能下载进去但运行不了
STM32F101C8T6   Flash:64K   ram:10K
Flash的每个page个1k(中密度)


在STM32F101C8T6上的IAP、APP文件的连接文件摘取主要部分如下:

//IAP程序的连接文件stm32f10x_flash.icf   (IAR5.20版本)

define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__   = 0x08000000 ;
define symbol __ICFEDIT_region_ROM_end__     = 0x0800FFFF;
define symbol __ICFEDIT_region_RAM_start__   = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__     = 0x20002800;


//APP程序的连接文件Inkarm_flash.xcl   (IAR4.42版本)
// Code memory in FLASH
-DROMSTART=0x8002000
-DROMEND=0x800FFFF    //0x801FFFF

// Data in RAM
-DRAMSTART=0x20000000
-DRAMEND=0x20002800  //0x20004FFF


//APP程序的main函数让应用程序从0x08002000处开始写
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0X2000);

APP程序不变(flash偏移0x2000),用Flash Loader Demo下载运行正常,用IAP程序下载就运行不了。

使用特权

评论回复
地板
香水城| | 2009-7-9 17:36 | 只看该作者
既然用Flash Loader Demo下载运行正常,那么你就用Flash Loader Demo分别读出2种下载方式烧写的代码,然后比较一下哪里不一样。

另外,我不明白你用Flash Loader Demo下载到偏移0x2000,那么你的中断向量表在哪里?

使用特权

评论回复
5
xijing0508|  楼主 | 2009-7-10 09:59 | 只看该作者
用Flash Loader Demo下载到偏移0x2000
中断向量表从0x08002000处开始

使用特权

评论回复
6
香水城| | 2009-7-10 10:07 | 只看该作者
如果Boot0/Boot1设置为从用户Flash启动,系统复位后默认中断向量表从0x0800 0000开始,你是如何保证向量表的映射?

使用特权

评论回复
7
xijing0508|  楼主 | 2009-7-10 17:35 | 只看该作者
刚才试了一下,是中断向量表有问题,但不知道是哪里的问题.
写了一个点灯程序用IAP下载进去就可以运行

使用特权

评论回复
8
xijing0508|  楼主 | 2009-7-10 17:44 | 只看该作者
补充:     
如果Boot0/Boot1设置为从用户Flash启动,系统复位后默认中断向量表从0x0800 0000开始.
     用NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0X2000);不就是把中断向量表映射到0x08002000么?
    我用Flash Loader Demo读出flash区域里的数据,发现flash区域从0x08002000向后的数据没有错(根用Flash Loader Demo下载APP程序再读出的一样)

使用特权

评论回复
9
香水城| | 2009-7-10 18:24 | 只看该作者
系统复位后CPU做的第一个件事情是要从0x0800 0004(0x0800 0000是复位时堆栈的指针)的地方读出复位向量,并转去复位向量指向的地址执行指令,所有其它的操作,包括你的中断向量表的映射操作都在后面,读取复位向量是不受映射影响的,映射操作智能影响其它中断。

使用特权

评论回复
10
xijing0508|  楼主 | 2009-7-10 19:21 | 只看该作者
系统复位后从0x0800 0004的地方读出复位向量并转去执行了IAP程序是对的,从IAP也跳转到了APP,但到APP程序有中断的地方就不行了(用点灯程序作为调试信息测试的).
应该就是中断向量表的问题,我用的是stm32官方的固件库
请香水大哥指点下要修改哪里?

使用特权

评论回复
11
香水城| | 2009-7-10 21:21 | 只看该作者
请在STM32资料网站参考ST的应用笔记:

AN2557STM32F10** in-application programming using the USART 4Jun-2008 " src="http://www.st.com/mcu/stonline/icons/zipicon.gif" border=0>

使用特权

评论回复
12
xijing0508|  楼主 | 2009-7-20 17:29 | 只看该作者
问题找到了,原来是犯了个极愚蠢的错误,羞愧中... ...

使用特权

评论回复
13
tiger8155| | 2013-9-30 15:28 | 只看该作者
我也遇到了,答案在哪里呢? LZ 能发个么 54410161@qq.com

使用特权

评论回复
14
kmcfly| | 2013-9-30 15:59 | 只看该作者
我也遇到了,找不到问题所在,LZ慷慨分享下 如何?

使用特权

评论回复
15
kmcfly| | 2013-9-30 16:07 | 只看该作者
xijing0508 发表于 2009-7-20 17:29
问题找到了,原来是犯了个极愚蠢的错误,羞愧中... ...

又来这。。。。

使用特权

评论回复
16
校长yxh| | 2014-8-27 18:13 | 只看该作者
哎,我也遇到了,纠结了好几天,能给我分享下吗?  email]1121907013@qq.com

使用特权

评论回复
17
yuanxinfei| | 2015-3-20 14:01 | 只看该作者
同样遇到这个问题了  同求QQ邮箱792452536@qq.com

使用特权

评论回复
18
再生鬼厉| | 2017-12-14 11:23 | 只看该作者
同样遇到这个问题了,楼主你是怎么解决的,能说说你谁怎么解决的么???同求QQ邮箱297121993@qq.com

使用特权

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

本版积分规则

1

主题

13

帖子

1

粉丝