arm9处理器at91rm9200调试心得
文章来源:http://gliethttp.cublog.cn
硬件环境:1>自制at91rm9200开发板 2>Multi ICE仿真器 软件环境:1>集成开发环境ADS1.2 2>仿真工具AXD
首先将BMS下拉,让CPU执行flash中的程序;如果BMS上拉执行跳'C'xmodem内部程序,那么程序中在ice仿真时PLL设置第一次将无效,重装axd之后才能正常 不过如果flash中的程序不能让cpu正常工作,那么BMS下拉情况下的仿真axd始终提示[gliethttp]: 1."Target processor would not enter debug state when requested.Do you want to try asserting System Reset with a breakpoint on address 0?This will affect the other processor in a multi-processer system." 2."Fatal AXD Error::RDI Severe Error 00259:Unable to stop target processeor.Check the server configureation matches the target system,the target is powered up,not inreset and can operate at the TCK setting used." 在flash中有错误的程序或者flash空无程序的时候,AXD调试最好使用[BMS上拉执行跳'C'xmodem内部程序]方式,但是该方式下at91rm9200的PLL时钟始终为48054857Hz,如果startup启动程序试图改变PLL,那么at91rm9200内部整个PLL系统都会出现混乱,DBGU因为PLL时钟不准而不能正常输出数据,所以使用[BMS上拉执行跳'C'xmodem内部程序]方式时,不需要axd调试程序初始化PLL,PLL默认就已经被跳C内部代码初始化为48054857Hz了,这种内部跳C初始化的PLL并不会因为jtag复位或硬复位之类的复位而改变,就像9527是你的终身代号一样,48054857Hz就是跳C情况下调试程序PLL的终身代号.
正常的axd调试现象: 将能够正常运行的程序烧写到flash中[不要让cpu出现异常的程序],之后BMS下拉,这样正确的硬件仿真环境已经搭建完毕. 1.不论startup配置为什么PLL,即使和烧写到flash中的程序一样,当运行到while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) && (tmp++ < DELAY_MAIN_FREQ) ); 这句时axd就会停止,当axd停止后,将axd关闭,重新再启动一次axd,或者"Reload current Image" [在没有Command Line for non-ARM debugger jtag控cpu文件时{gliethttp}]那句就可以顺利通过,调试就ok了,这个现象对于at91rm9200来说是正常现象. 2.只有上面的这个现象才是正常的调试现象,否则可能是硬件存在问题. 3.如果运行axd全速运行之后,不能停下来,那么可能因为PC6脚作为IO口使用了,不知什么原因只要PC6和一个固定电平连接之后,程序读取flash时 就会永远退不出来,从文档上来看PC6的ASR外设为NWAIT总线等待信号,linux下s1d13xxxfb.c驱动中使用该nwait信号与外部控制芯片的总线进行 信号同步,但是有明确的ASR外设功能指配语句,nnd老子没有把PC6指定为ASR外设,也没有在其他地方找到对PC6赋值成ASR外设的语句,并且再n多 地方将PC6显式的指定为input-io类型,它就仍然死活不能操作flash,也不是完全不能操作flash,对于4字节数据的flash读取还是可以通过的 就是1字节flash数据读取操作,只要ldrb r2,[r0],#1读取外部flash语句一执行,cpu就永远回不来了,down掉了.用PC15代替PC6,把PC6悬空,flash操作ok.
小结:[gliethttp2007-07-12不过可能是因为我的板子jtag复位脚和cpu的nrst连接到了一起导致的上边的现象]一般在调试期间jtag的复位引脚应该和cpu的硬复位引脚 独立分开,当调试阶段结束出厂生产时,再将jtag复位脚和cpu的复位脚连接在一起.
|