MSP430使用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微机原理实验报告4&5
程序与EW430 上测试通过
实验班号:周五下午第二节;座位号:43
目录
实验目的 (2)
实验任务 (2)
1. 了解MSP430F1xx实验板结构,掌握MSP430F1xx实验板检测方法 (2)
2. EW430开发工具的初步使用 (4)
3. 掌握查看和修改寄存器、存储器、外围模块端口寄存器的方法 (4)
4. 了解端口P1~P6的选择PxSEL、方向PxDIR、输入PxIN、输出PxOUT各寄存器功能 (4)
5. 了解程序计数器PC(即R0寄存器)的变化规律 (5)
6. 了解MSP430F149单片机结构 (6)
7. (选做)学习工程空间管理项目的方法 (7)
8. 学习寻址方式和指令系统 (7)
9. 指令格式学习 (8)
10. 调试程序练习 (9)
11. 比较step into和step over的不同 (10)
12. 掌握计算机中数的表示和编码 (10)
13. (选做)理解计算机取指令执行指令的工作原理、以及取非法指令的结果 (10)
14. (选做)理解CPU对存储器进行字操作遵循的“对准偶地址”原则 (11)
实验总结与思考 (11)
实验目的
1.了解MSP430F1xx实验板结构,掌握MSP430F1xx实验板检测方法;
2.了解MSP430单片机开发工具EW430的基本使用方法;
3.掌握EW430下常用的View和DEBUG命令;
4.了解MSP430F149单片机结构;
5.掌握P1~P6基本输入/输出有关寄存器功能;
6.学习MSP430的寻址方式和指令系统;
7.了解计算机取指令、执行指令的工作过程;
8.掌握DEBUG下的运行命令;
9.掌握在EW430下调试程序的方法;
10.掌握计算机中数的表示和编码。

实验任务
1.了解MSP430F1xx实验板结构,掌握MSP430F1xx实验板检测
方法
电源电路:对于+3V和+5V电源,采用万用表测量,发现电压稳定,测试通过。

发光二极管:由于发光二极管是共阳极接法,所以低电平点亮。

那么用引线将二极管出线端接地(GND)。

观察是否点亮,实验证明发光二极管工作正常。

按键:由于按键按下后为低电平,故将按键引脚与MCU引脚之间滑块去掉,并将按键引脚接至编号对应发光二极管引脚处。

按下按键,相应的发光二极管发亮,证明按键功能正常。

蜂鸣器:蜂鸣器接低电平鸣叫,故将其引脚端接地,若鸣叫,再接至高电平,停止鸣叫,证明功能正常。

附:各个模块电路示意图
图1 LED以及Key的电路
图2蜂鸣器及数码管电路
2.EW430开发工具的初步使用
1)用短线块(也称跳线块)将单片机的引脚P2.7~P2.0与发光二极管的控制端LED8~LED1短接;将单片机的引脚P1.7~P1.0与按键Key8~Key1短接。

2)参看“附录E EW430的使用方法”中的一至六,在自己建立的工程空间下建立项目Lab_4,汇编语言源程序参看test_asm.s43,了解汇编语言程序项目建立、程序下载运行方法。

3)在Lab_4项目中,将test_asm.s43中的MOV #10h, R15,改为MOV #2, R15, 重新编译、连接和下载,观看执行的结果有什么不同。

变化:灯的闪烁变快。

变化倍数约为10h/2=8倍。

4)退出EW430
3.掌握查看和修改寄存器、存储器、外围模块端口寄存器的方法
(1)寄存器的值采用View/Register/CPU Registers进行修改
(2)端口的值采用View/Register/Port1/2进行修改
(3)存储器的值采用View/Memory,利用Go to搜索修改
(4)直接改为ASCII码,在相应地址右侧直接录入
4.了解端口P1~P6的选择PxSEL、方向PxDIR、输入PxIN、输出
PxOUT各寄存器功能
在Lab_4项目的DEBUG功能下,打开Register窗口,查看P1/P2端口,修改I/O寄存器,结合实验板原理图P1和P2端口的连接,解释观察到的现象。

1)修改P2DIR=0xFF,设置端口P2为输出方向,修改P2OUT的值,记录看到发光二极管L8~L1的现象,并分析原因
表格1 I/O寄存器P2OUT和引脚P2.7~P2.0的关系
可以看到,由于设置P2为输出方向,引脚P2.7~P2.0已经通过滑线块连接到发光二极管I/O寄存器的输出,所以改变端口某一位为低(高)电平时,就可以控制发光二极管的亮(灭)。

2)修改P1DIR=0x00,设置端口P1为输入方向,按下相应的按键,打开Register窗口查看P1IN的值,可用按位查看的方式查看P1IN各位的值。

注意:每次按下实验板按键,需在Register下退出P1/P2,否则P1IN的值没有更新。

表格2 P1IN和管脚P1.7~P1.0的关系
因为P1端口设置为输入方向,按下相应按键则输入一个低电平,不按键则持续输入高电平,因此P1IN的值会有所变化。

值得注意的是,软件中读取寄存器的值并不能实时刷新,需要退出再进入才可以改变。

5.了解程序计数器PC(即R0寄存器)的变化规律
1)已知复位后,MSP430F1xx的PC寄存器从储存器0xFFFE~0xFFFF单元获取一个字内
容作为CPU执行的第一条指令地址,请问该地址是多少?在实验中,程序执行的第一条指令是一条什么指令?
由于Memory中地址0xFFFE~0xFFFF(即最后两位)存储的数据位0x11(0xFFFF)和0x00(0xFFFE),所以PC第一条指令的地址就是0x1100。

对应到程序中,第一条指令是init: MOV #SFE(CSTACK),SP
2)在调试器是FET DEBUG 下,如果将FFFE~FFFFh内存的内容改为1200h,可否?为
什么?
在调试器是FET DEBUG的时候,不能进行上述更改,如果改,则输入1200h后就会报错。

3)选择调试器simulator,再更改0xFFFE ~ 0xFFFF的值为1200h。

观察结果。

如果更改调试器,在DEBUG下reset之后Go执行时,会出现如下错误,可见1200h 的初始值是错误的。

图3更改Memory值后的错误提示
6.了解MSP430F149单片机结构
用MSP430F149实验板,激活项目Lab_4,在option 中设置调试器为simulator,直接对自带的模板文件asm.s43进行编译、连接,然后进入debug,利用view/register查看CPU 寄存器当前的PC值。

发现PC值为1100,外围模块有watchdog timer、Multiplier、Special function、Port1/2、Port3/4等等。

地址分配如下:
表格3 MSP430地址分配
如果引脚分布一致,那么不同型号的MCU可以兼容。

根据引脚的对比,可以知道实验板的硬件系统对MSP430F13x、MSP430F14x和MSP430F16x是兼容的。

但是对于MSP430F15x,由于只有基本引脚一致,引脚的复用功能并不完全相同,所以并不完全兼容。

附图如下:
图4 MSP43015x引脚(左图)与MSP43014x引脚(右)的对比
7.(选做)学习工程空间管理项目的方法
在自己的电脑上,需要在一个工作空间内为每一个实验建立一个Lab_xx项目文件。

每次实验则激活(set as Active)相应项目并在相应的项目下编写程序代码。

这样利于对自己程序的管理,也便于在EW430中对不同的程序进行执行,规范和简化了对试验程序的管理工作。

8.学习寻址方式和指令系统
汇编程序及每句注释如下:
#include "msp430.h"
ORG 0FFFEh
DC16 main
ORG 1100H
main: MOV #0A00h, SP ;immediate,register初始化SP,此句不能删除
MOV.W #5A80h,&WDTCTL ;immediate,absolute关闭看门狗,避免定
时自动复位,此句不能删除MOV #300h, R14 ;immediate,register R14=300h
MOV #0, R15 ;immediate,register R15=0
MOV #6, R13 ;immediate,register R13=6
next: ADD.B @R14, R15 ;Indirected,register,R15+=(R14)
INC R14 ;register,R14++
DEC R13 ;register,R13--
JNZ next
MOV.B R15, 0(R14) ;register,Indexed,(R14+0)=R15
exit: JMP exit
END
1)通过view中的memory进行对相应地址值的更改。

2)对寄存器赋初值后,通过执行语句,从memory中取数据进行相应运算并存至
寄存器R15中,反复执行数次,将最终结果存至memory(R14+0)中。

3)程序执行到断点处会停止,不执行本语句。

4)进行相应更改后,采用Indirect autoincrement寻址方式,功能不变化。

5)进行相应更改后,一次操作将面向16位二进制地址(即word),而之前是8
位地址(即Byte)。

改变后,每次对R15的操作调用memory的16位,存储到
memory时也存储16位的数据。

6)不相同。

INC R14在第一次执行时即为R14++,而INC.B第一次执行时会将R14
清零。

9.指令格式学习
汇编程序代码如下:
#include "msp430.h"
ORG 0FFFEh
DC16 main
ORG 1100H
main: ;MOV.B #256,R4 ;256超过1Byte,不能用MOV.B
MOV.W #256,R4
;ADD 5,@R5
ADD #5,0(R5) ;(R5)+=5
;MOV R1,@R6+ ;R6不能作为dst
MOV R1,R6 ;R6=R1
INC R6 ;R6++
;SUB R7,#9
SUB #9,R7 ;R7=R7-9
;MOV &R9,R10 ;&R9只能作为dst
MOV 0(R9),R10 ;R10=(R9+0)
MOV #main,R8 ;R8=0x1100
MOV main,R8 ;R8=(1100)
;JMP #main ;PC=(1100)
;JMP main ;PC=0x1100
;BR #main ;PC=0x1100
;BR main ;PC=(1100)
END
值得说明的是,MOV指令中,#main指的是main的指针地址,main指的是指针地址对应的值。

JMP与MOV情况相同,而BR与它们相反。

所以可以说,BR指令与JMP 指令的功能相反。

JMP main等价于BR #main。

10.调试程序练习
程序L5_task3.s43功能是反复向端口2(地址为&029h)传送0值,延时一段时间,再传送0FFh。

由于端口2与发光二级管相连,看到的现象应该是8个发光二级管全亮,延时,全灭,如此反复。

但程序编写有误,不能实现上述现象,请查找其中的问题,并修改。

程序如下所示。

#include "msp430.h" ;此句不能删除
ORG 0FFFEh ;此句不能删除
DW main ;此句不能删除
ORG 1100H ;此句不能删除
main: MOV #0A00h, SP ;此句不能删除,初始化SP
MOV.W #5A80h, &0120h ;此句不能删除,关闭看门狗
MOV.B #0FFh,&02AH ;设置端口2为输出端口
MOV 0,R12 ;赋R12初值为0
next: MOV.B R12,&029h ;将R12的数据通过端口2输出
CALL delay ;调用延时子程
XOR #0xFF,R12 ;对R12取反,改变R12的值
JMP next
delay: MOV #3,R14 ;延时子程
ww: DEC R14
JNZ ww
RET
END ;此句不能删除
实际运行时,灯的亮灭无法正常控制。

在DEBUG下调试发现,CALL语句执行有误,由于call后面的参数应该是命令行地址,#delay是delay所在行的地址数值,而delay 表示该行的命令。

CALL delay相当于将命令(MOV #3,R14)看做地址,而将PC指向这一地址(403E),自然是错误的。

需要注意的是,下载到硬件上执行时,需要将#3的值改大,否则因为扫描频率很高,肉眼无法分辨灯的闪烁。

11.比较step into和step over的不同
在DEBUG中测试后,得到结果如下:
用step over执行程序时,SP从被赋值后一直是0A00;而用step into执行程序中的call指令后,SP减2,变为了09FE。

这说明step over(F10)不会进入函数,而step into (F11)会进入函数。

这样,二者在执行时,PC、SP等变化情况都有所不同。

进入函数后SP(堆栈指针)会自动减2,而在跳出函数后再加2。

对于本段代码的执行而言,如果使用step over逐步执行,会使得发光二极管的亮灭频率约为用step into逐步执行时的三倍。

这是因为取消了延时模块。

12.掌握计算机中数的表示和编码
假设某内存单元的字内容为FF0AH,那么该内容看做无符号数是65290;看做带符号数是-262;如果看做一条指令的机器码,那么只需要在DEBUG下利用memory窗口将RAM区的内容改为FF0AH,然后利用反汇编窗口反汇编该RAM存储单元内容,可以得到该机器码代表指令:AND.W R15,R10。

同理,内存单元为5436H时,看做无符号数是21558;看做带符号数是-43978;如果看做一条指令的机器码,则该指令为ADD.W @R4+,R6。

看做ASCII码,表示的是字符6$。

存放在内存中的内容可以被以各种方式调用,例如5436H这样的十六位二进制数,可以被取值赋给寄存器,也可以对其本身进行相应的操作。

13.(选做)理解计算机取指令执行指令的工作原理、以及取非法指
令的结果
将RAM区300H内存单元的内容改为0000H,用disassembly 功能从300h开始反汇编查看,发现对应指令为“????”,不表示任何指令。

再修改PC寄存器的值为300h,如采用simulator调试器,单步执行指令,程序报错“Ill egal opcode found on address 0x300”。

但是在实际的实验中,死机现象并不是每次都会出现。

刚开始按照上面的要求设定好之后,执行,发现没有任何反应,没有死机。

然后经过多次试验,发现有时候会出现死机,有时不出现。

14.(选做)理解CPU对存储器进行字操作遵循的“对准偶地址”原

在MSP430单片机中,当向存储器进行一个字节的读/写操作时,对存储器单元的地址没有奇、偶的限制;但当向存储器进行一个字的读/写操作时,要求从偶地址开始,存放的规则采用“小端模式”(little Endian),低字节存放在低地址,高字节存放在高地址。

如果从奇地址读写,往往会给编程者带来非意想的数据结果。

(源代码略)
表格4“对准偶原则”的测试
可以看到,写入或读出奇地址时,会自动跳转到比它小1的偶地址进行写或读。

这样而言,&203h等同于&202h;&205h相当于204h。

CPU对存储器读写的这种特性,让我们注意到,今后编写汇编程序时,应尽量确保对字的操作均从偶地址开始,并要注意相应存储单元指针的操作,应使指针值为偶数。

实验总结与思考
1.强大的仿真功能
在EW430中,仿真是调试程序的重要手段,可以凭借此十分清晰的看到包括Register,Port以及Memory等的变化,更可以在没有硬件的前提下对程序进行模拟调试,甚至可以发现一些隐藏的问题。

但是即便如此,实验板的硬件特性(包括端口的连接,时钟信号的配合等等)依旧不可完全由仿真代替。

所以需要在实验过程中逐步了解哪些问题是可以仿真解决的,实验板上的问题出现的原因又有哪些。

2.关于寻址方式
本次实验让我深刻体会到微机原理理论课上所讲的寻址方式的实现方式,对其有了直观的认识。

并且通过一些调试功能和观察,了解了每种寻址方式的使用条件以及所要注意的问题。

同时,这次试验也让我了解了MSP430所特有的一些寻址特点,为以后利用它进行实验奠定了基础。

3.关于指令长度:
MSP430的每条指令长度都是相等的,都是16位指令。

但反汇编后的机器码可能会有32位,48位的指令。

这是因为寻址方式不同,导致一条指令需要分多步完成,所以从整体上看指令的位数变多了。

这也契合了我们上一个实验搭建的CPU平台处理复杂寻址方式的思路。

相关文档
最新文档