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

flg1986   2009-7-8 14:54 楼主
在STM32F101XX的Flash中用先用内部引导程序写入IAP程序没有问题,再用IAP写入APP程序,程序能写入但却运行不了是什么原因?
     同样的做法用在STM32103xx上就没有问题APP程序能下载进去也能运行.
     两个IAP不一样的地方就只是flash的大小和flash中page的大小.

回复评论 (13)

你能确定你的程序正确地烧写下去了吗?

STM32的Flash中Page的大小,在相同容量的STM32F101xx和STM32F103xx中是一样的,程序也应该是一样的。
点赞  2009-7-8 22:07
我在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 13:37
                                 小妹认为程序是正确地烧写进去了,但不知道为什么运行不了,请香水大哥指点下.
点赞  2009-7-9 13:51
既然用Flash Loader Demo下载运行正常,那么你就用Flash Loader Demo分别读出2种下载方式烧写的代码,然后比较一下哪里不一样。

另外,我不明白你用Flash Loader Demo下载到偏移0x2000,那么你的中断向量表在哪里?
点赞  2009-7-9 17:36
用Flash Loader Demo下载到偏移0x2000
中断向量表从0x08002000处开始
点赞  2009-7-10 09:59
                                 如果Boot0/Boot1设置为从用户Flash启动,系统复位后默认中断向量表从0x0800 0000开始,你是如何保证向量表的映射?
点赞  2009-7-10 10:07
刚才试了一下,是中断向量表有问题,但不知道是哪里的问题.
写了一个点灯程序用IAP下载进去就可以运行
点赞  2009-7-10 17:35
补充:     
如果Boot0/Boot1设置为从用户Flash启动,系统复位后默认中断向量表从0x0800 0000开始.
     用NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0X2000);不就是把中断向量表映射到0x08002000么?
    我用Flash Loader Demo读出flash区域里的数据,发现flash区域从0x08002000向后的数据没有错(根用Flash Loader Demo下载APP程序再读出的一样)
点赞  2009-7-10 17:44
                                 系统复位后CPU做的第一个件事情是要从0x0800 0004(0x0800 0000是复位时堆栈的指针)的地方读出复位向量,并转去复位向量指向的地址执行指令,所有其它的操作,包括你的中断向量表的映射操作都在后面,读取复位向量是不受映射影响的,映射操作智能影响其它中断。
点赞  2009-7-10 18:24
系统复位后从0x0800 0004的地方读出复位向量并转去执行了IAP程序是对的,从IAP也跳转到了APP,但到APP程序有中断的地方就不行了(用点灯程序作为调试信息测试的).
应该就是中断向量表的问题,我用的是stm32官方的固件库
请香水大哥指点下要修改哪里?
点赞  2009-7-10 19:21
请在STM32资料网站参考ST的应用笔记:

AN2557
点赞  2009-7-10 21:21
                                 问题找到了,原来是犯了个极愚蠢的错误,羞愧中... ...
点赞  2009-7-20 17:29
                                 xijing0508你好 ,我的情况和你的类似,请问你的是怎么解决的 啊!看到请加我qq好吗?33159389谢谢了啊
点赞  2009-8-1 23:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复