打印

STM32外部RAM存储数据 JLINK无法调试

[复制链接]
5614|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
koy917|  楼主 | 2010-3-20 19:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我讲外部RAM存储数据,内部RAM放堆栈,程序很简单,就是将外部ram复制,同时读取,读取后用串口发出来,我用JLINK调试,程序始终停在串口等待处,查看赋值也不对。我手动复位板子,不用JLINK带,STM32能够对外部RAM赋值,并且能够从串口输出来,结果很正确。      这时我讲ICF文件换成只用内部RAM时,可以用JLINK全速运行,工作正常。
      这里就想问问各位,为什么用到外部RAM时,JLINK全速运行就不正确了呢?不要说ICF文件不对,不用JLINK带,自己运行的时候是正确的。
开发环境如下:
IAR5.40
JLINK V7  驱动4.12(4.0x的不行才更新的)
沙发
koy917|  楼主 | 2010-3-21 08:30 | 只看该作者
ICF文件写法:
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__       = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__         = 0x0807FFFF;
define symbol __ICFEDIT_region_RAM_start__       = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__         = 0x2000FFFF;
define symbol __ICFEDIT_region_EXTSRAM_start__   = 0x68000000;
define symbol __ICFEDIT_region_EXTSRAM_end__     = 0x687FFFFF;

/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__   = 0x400;
define symbol __ICFEDIT_size_heap__     = 0x200;
/**** End of ICF editor section. ###ICF###*/


define memory mem with size = 4G;
define region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
define region EXTSRAM_region   = mem:[from __ICFEDIT_region_EXTSRAM_start__   to __ICFEDIT_region_EXTSRAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };
do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region   { readonly };
place in RAM_region   { block CSTACK, block HEAP };
place in EXTSRAM_region   { readwrite };

麻烦大家帮帮忙解决一下,不然调试起来就麻烦了

使用特权

评论回复
板凳
koy917|  楼主 | 2010-3-21 08:36 | 只看该作者
到现在为止,发现只要readwrite 放在内部就没有问题,只要放在外部,JLINK全速运行也会出错

使用特权

评论回复
地板
koy917|  楼主 | 2010-3-21 09:04 | 只看该作者
怎么感觉问题出在STM32上啊?
如果这样写
place in RAM_region   { block CSTACK, readwrite  };
place in EXTSRAM_region   {  block HEAP }
怎么弄都可以,但是如果这样写
place in RAM_region   { block CSTACK, block HEAP };
place in EXTSRAM_region   { readwrite    }
怎么弄都不行,最后发现,直接复位,STM32都不运行,只能断电后重新上电才能运行,不知道是不是STM32的问题啊,请有碰到过类似问题的朋友帮帮忙啊

使用特权

评论回复
5
ShakaLeo| | 2010-3-21 10:10 | 只看该作者
编译器的启动代码一般会在main函数之前把readwrite区的变量初始化,把readwrite区放在外部RAM中,外部总线控制器貌似在main之前还没有初始化吧? 所以可能是初始化变量的过程出现了问题。

使用特权

评论回复
6
koy917|  楼主 | 2010-3-21 10:14 | 只看该作者
启动的时候先初始化了FSMC的,在启动代码中很明显可以看到,程序不是死在初始化中,而是死在main里面的函数里面,这个才比较奇怪

使用特权

评论回复
7
koy917|  楼主 | 2010-3-21 10:18 | 只看该作者
在启动代码中一开始就有对FSMC的初始化,只要对预编译进行行定义 #define DATA_IN_ExtSRAM,初始化就没有问题,所以不是初始化的问题。
LDR  R0, = SystemInit_ExtMemCtl ; initialize external memory controller
                MOV  R11, LR
                BLX  R0

使用特权

评论回复
8
ShakaLeo| | 2010-3-21 10:20 | 只看该作者
呵呵,没有这么用过,所以也是乱猜的。
程序死在main里了,怎么个死法?进fault了?

使用特权

评论回复
9
koy917|  楼主 | 2010-3-21 14:10 | 只看该作者
死在串口发送那里,看看外部的ram也不正确,很奇怪

使用特权

评论回复
10
txcy| | 2010-3-21 19:33 | 只看该作者
串口发送的问题,把那个WHILE屏蔽掉试试

使用特权

评论回复
11
koy917|  楼主 | 2010-3-28 10:29 | 只看该作者
屏蔽掉后读出和写入的数据部正确

使用特权

评论回复
12
pkat| | 2010-3-28 20:52 | 只看该作者
如果有数据,再看看你的波特率设置

使用特权

评论回复
13
koy917|  楼主 | 2010-3-29 08:24 | 只看该作者
波特率没问题,不用jlink带,自己跑,出来的数据都是正确的

使用特权

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

本版积分规则

3

主题

19

帖子

1

粉丝