致和我一样的初学者--我在入门途中遇到的问题及解决办法
--------------------------------------------------------------------------------
买44B0的开发板已一年多了,但平时也没多少时间,况且中间有近一年没动它。今年才拿出来,因为我之前只会51单片机,这是好事也是坏事,好在有微控基础,坏在在51开发工具上思路的根深蒂固,在ADS等等软件以及存储器结构上走了些弯路,昨晚刚把中断调试成功,作个总结,有和我相同“遭遇”的朋友可以借鉴一下!
第一次是我写了一个最简单的C按键点灯程序,用软件仿真(ARMUL)正常,但烧到板上不能运行,灯闪一下就灭了。这个问题是我当时对存储器及启动代码的执行了解不够,将ADS里的RO和RW都设为0的缘故,应为0和0X0C00_0000(如果SDRAM是接在BANK6的话)。
第二次问题就在几天前做中断试验的时候,用ARMUL仿真正常(但不能仿真中断,这个问题我发了若干帖子都没人回,个人认为ADS开发环境真的还有不少欠缺,有些难懂),但若接上目标板用JTAG代理仿真就不会跳到MAIN处执行,而是跳到初始化端口中的一行,感觉在乱跳。这个问题试了好多天,因为用的是简易JTAG,稳定性上我也不敢百分百的相信,虽然也曾用过Banyan,但我感觉也不稳定,且不能超过2个断点。后来把中断初始化的pISR_EINT4567 = (int)Eint4567Isr;这行给去掉后就正常了。仔细想,这段只是个“地址链接”(不知道专业属语叫什么了)的作用,把中断服务函数的地址放到_ISR_STARTADDRESS+0x74这个地址来(后面说),而我的板是我自己买元件自己焊接的,当时就像配电脑一样,有些贪,板上本来是8MB的SDRAM,而我用的是16MB的SDRAM,这样当然影响_ISR_STARTADDRESS,但我在Option.s及Option.h里都改了呀!又找了两天(在深圳,业余时间少得可怜),实在找不着原因,于是不甘心就看44B0的存储器配置的资料,一个寄存器一个位的看,最后在BANKCON6的SCAN位找到了,00是8位SDRAN列地址,01是9位SDRAN列地址,而我2M*4B*16位的列地址应该是9位才对。改正以后,跳转到MAIN正常了。但用简易JTAG在目标板仿真在我按按键的时候还是不能跳到中断服务函数,软件(ARMUL)又不能模拟中断产生(这是我认为ADS做得不好的原因,也可能是用惯了KEIL吧)经查程序没问题,烧到板上运行一切正常!哎,不然又走弯路了!
第二个问题太啰嗦了,主要是怕和我一样的初学者看不懂,一个名詞就可能绕一个弯。我再说一下我对中断怎样链接到C程序的理解,虽然网上的解释很多,但我也觉得难理解(可能是我自己太笨吧,呵呵),它其实就是在Init.s和C程序跳到同一个地址实现的,如EINT4567就是_ISR_STARTADDRESS+0x74,在两个文件都有相关定义,因为硬件地址是固定不变的。
特此申明:本贴只适合没入门的朋友,已入门的看了我会脸红的!
阅读(2410) | 评论(0) | 转发(0) |