首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

blog-0127-STM32在RAM调试

blog-0127-STM32在RAM调试

之前写过一篇在LPC2132上使用RAM来调试程序的文章。其实LPC2132才16K的RAM,用来片上调试确实意义不大,随便写点代码就超过这个体积了。这次是要在STM32的RAM中来调试,我用的是大容量的型号,片内有64K的RAM还算不错了,板子上还外扩了一片128K的静态RAM。起初我还打算自己做板子的时候做个1M的,后来一查价格,1M的要70多,晕死~~。而且还没8位的。这里要再次感谢杨总给我提供这个板子,给了我这个免费学习的机会。言归正传,在片上RAM调试和我之前写的在LPC上调试是一样的,这次专门讲在外部RAM上调试。其实最后看官会发现就只是多了一步,加了一个文件而已….。
即使没有稿费,我也想为了从视觉上看上去美观一点,我还是多废话两句凑点篇幅吧。在读书的时候因为没有下功夫研究单片机运行的原理和编译过程。一直把程序执行的过程看得很神秘,以为代码空间和内存空间有着本质的不同。现在看来觉得是一样的,程序要跑就必须得有个规则吧,这个规则的集合就是我们编译出来的bin文件。一般来说它会被烧写到内存中,不管是片外还是片内。单片机跑的时候就从头开始获取指令,这个过程叫做取指,然后用运算单元和相关的内部寄存器来执行这条指令。运算过程中会需要临时变量,这时候就需要RAM来存储了。那么FLASH和RAM有什么本质的区别呢?从程序的角度来看,没有任何程序执行或者操作过程上的区别,除开属性一个是只读(RO)一个是可读可写(RW)。他们都是被映射在一个固定空间的连续的内存地址,只要能够用STR和LDR访问到的空间,那就是我们通常意义上所说的RAM。如果只能用LDR访问,也就是说只能读,那么就是我们通常意义上说的ROM。既然都是连续的内存地址,既然RAM也可以LDR,那么RAM是否能够当存放可执行镜像的容器的呢??
回答是肯定的,这就是程序在RAM中跑的原理。我想,如果编译器提供指令替换的功能,那我认为把一个串行的FLASH当RAM也是可以实现的,不过仅仅只有理论验证的意义而已。

好,凑篇幅完毕。接着说怎么在外部RAM中调试:

内部RAM的调试设置如上图所示,将空间分裂成两部分即可。然后点调试按钮,程序就自动下载进去了,再点运行,发现程序跑得很H。但是,当使用外部RAM的时候也这么弄就发现不好使了。为什么呢?让我们首先来想一个问题:程序是怎么下载进去的?多半的时候这个问题不需要用户考虑,这个应该是英蓓特他们干的活。在我个人理解看来,片上RAM是直接挂在内部总线上的,并且映射好了地址。我们用仿真器的时候,不是可以通过memory窗口来改写内存的数据吗?那么就证明了,JTAG边界扫描链有能力访问任何空间,如果访问的是片上内存这段区域的话那也能够改写数据。那程序怎么下载的不就是一件很简单的事了吗?直接将编译好的可执行镜像拷贝到一段连续的内存中去不就OK了。既然RAM都是可读可写的,那为上面的设置对片外内存又不行呢? 原因是硬件厂商为了使芯片更加具有兼容性而在内部总线和对外提供的总线之间加了一个硬件的总线控制器(通常叫EMIF External memory interface controller),好处是这样一来可以兼容更多类型的外设,SRAM SDRAMNAND/NOR FLASH  等等。坏处是给我这样的菜鸟造成了麻烦,使我写下了这篇文章。既然有选择,那么应该选择谁呢?能够用软件来设置是肯定的,很多硬件厂商同时会设计几个IO口用来配置启动模式。遗憾的是杨总告诉我STM32不能从外部FLASH中启动。现在我的主题是移植TCPIP协议栈,片内FLASH足够我用了,就先不管了。 发现又扯远了,看到这里大家应该看出来了,之所以不能直接访问外部RAM是因为没有对外部总线控制器进行初始化(当时傻傻的我还在想,在程序的一开始就初始化控制器不就好了吗,呵呵)。既然问题找到了,那接下来自然是对症下药。药的名字叫ExRam.ini:
继承事业,薪火相传
返回列表