先说下我所使用的IDE及硬件,IDE为IAR集成开发环境,本人从学习单片机时就使用的IAR,CCS也用过,但觉得没IAR使用的顺手,如果是CCS爱好者请自己去研究下CCS中应该怎么设置才能在RAM中调试MSP430的程序,理论上也是很简单的。硬件为MSP-EXP430F5529LP,也就那块红色的MSP430F5529 LaunchPad 。至于为什么要在RAM中调试程序,自己去百度这样做的好处吧,我也懒得说了。
首先简单分析下MSP430F5529的启动过程,根据其官方数据手册所述,中断向量表如下:
可以看到中断向量表在0xFF80-0xFFFF,其中复位向量在0xFFFE-0xFFFF,一共两个字节,16位,系统上电或复位后从这里取出16数据作为PC的值,然后MCU开始执行“main”函数,其实并不是最先执行的main函数,而是执行IAR编译器定义的程序入口点__program_start函数,其又被编译器定义为cstart_begin函数,后面紧跟着的是cstart_call_main函数,此函数才会去调用main函数。口说无凭,实验为证。
使用IAR创建一个工程,在main.c中随便写几句代码,然后在工程选项的Debugger子选项卡中取消勾选Run to main,取消此勾选的原因是此选项会在调试中直接让单片机运行到main函数的第一行代码然后暂停。这样一来main函数之前的代码就无法看到了,我这里使用的是软件仿真,硬件仿真也会是一样的结果。
设置完后点击调试按钮出现反汇编窗口,如下图,可以看到,程序并没有停在左边的源代码窗口,而是停在了右边的反汇编窗口,并且当前程序的地址为0x4400,其具有两个标号,分别为cstart_begin和__program_start,此函数只有一句代码"MOV.W #0x4400,SP",不难看出这是在设置堆栈指针SP为0x4400(注意和当前的PC值不要搞混,虽然值是一样的),下面紧跟标号为cstart_call_main的函数,此函数第一句代码是调用的main函数,第二句调用exit函数,exit函数是编译器自动为我们定义的函数,这里不做说明。
然后再在Go to那里输入中断向量表的地址0xFFFE,结果如下图,红框处即为复位向量,其值为0x4400,后面是5529的参考手册中所说的仿真器指令中的一条,不做分析。于是验证了上面所说的MSP430F5529的启动过程。
既然已经知道了MSP430F5529的启动过程,那么接下来就是找链接器脚本了,不过IAR将其叫做XLINK configuration file(XLINK配置文件),其后缀名为.xcl,在工程选项的Linker子选项卡中有和链接器有关的选项,如下图
可以看到Linker configuration file选项一栏有Override default选项,将其勾选,然后就可以找到IAR默认使用的链接器脚本文件,其路径为X:\
Program Files (