1.MSP430开发环境建立
1.安装IAR
dor
msp430
软件,软件带USB仿真器的驱动。
2.插入USB仿真器,驱动选择安装目录的/drivers/TIUSBFET
3.建立一个工程,选择"option"选项,设置
a、选择器件,在"General"项的"Target"标签选择目标器件
b、选择输出仿真,在"Linker"项里的"Output"标签,选择输出"Debug
information
for
C-SPY",以输出调试
信息用于仿真。
c、若选择"Other",Output下拉框选择"zax-m"即可以输出hex文件用以烧录,注意,此时仿真不了。
d、选择"Debugger"项的"Setup"标签,"Driver"下拉框选择"FET
Debugger"
e、选择"FET
Debugger"项的"Setup"标签,"Connection"下拉框选择"Texas
Instrument
USB-I"
4.仿真器的接口,从左到右分别为
"
GND,RST,TEST,VCC"
2.IO口
数字输入/输出端口有下列特性:
□
每个输入/输出位都可以独立编程。
□
允许任意组合输入、输出。
□
P1
和
P2
所有
8
个位都可以分别设置为中断。
□
可以独立操作输入和输出数据寄存器。
□
可以分别设置上拉或下拉电阻。
(以下x为1表示P1,为2表示P2,如此类推)
1.选择引脚功能
--
PxSEL,PxSEL2
PxSEL2
PxSEL
管脚功能
0
0
用作IO口
0
1
用作第一功能引脚
1
0
保留,参考具体型号的手册
1
1
用作第二功能引脚
设置引脚用作外设功能时,芯片不会自动设置该引脚输入输出方向,要根据该功能,用户自己设置方向寄存器
PxDIR。
2.选择引脚输入/输出方向
--
PxDIR
Bit
=
0:
输入
Bit
=
1:
输出
3.选择引脚是否使能上下拉电阻
--
PxREN
Bit
=
0:
不使能
Bit
=
1:
使能
4.输出寄存器
--
PxOUT
Bit
=
0:
输出低电平或者下拉
Bit
=
1:
输出高电平或者上拉
5.管脚状态寄存器
--
PxIN
Bit
=
0:
管脚当前为低
Bit
=
1:
管脚当前为高
3.Base clock 模块
一、4个时钟振荡源
1、LFXT1CLK:
外部晶振或时钟1
低频时钟源
低频模式:32768Hz
高频模式:(400KHz-16MHz)
2、XT2CLK:
外部晶振或时钟2
高频时钟源(400KHz-16MHz)
3、DCOCLK:
内部数字RC振荡器,复位值1.1MHz
4、VLOCLK:
内部低功耗振荡器
12KHz
注:MSP430x20xx:
LFXT1
不支持
HF
模式,
XT2
不支持,
ROSC
不支持.
二、3个系统时钟
1、ACLK:
辅助时钟
复位:
LFXT1CLK的LF模式,内部电容6pF
分频:
1/2/4/8
时钟源:LFXT1CLK/VLOCLK.
用途:
独立外设,一般用于低速外设
2、MCLK:
主时钟
复位:
DCOCLK,1.1MHz
分频:
1/2/4/8
时钟源:LFXT1CLK/VLOCLK/XT2CLK/DCOCLK
用途:
CPU,系统
3、SMCLK:
子系统时钟
复位:
DCOCLK,1.1MHz
分频:
1/2/4/8
时钟源:LFXT1CLK/VLOCLK/XT2CLK/DCOCLK
用途:
独立外设,一般用于高速外设
三、寄存器
1、DCOCTL:DCO控制寄存器(读写)
DCOx:定义8种频率之一,可分段调节DCOCLK的频率,相邻两种频率相差10%。而频率又注入直流发生器
的电流定义。
MODx:
位调节器选择。这几位决定在
32
个
DCOCLK
周期内插入高1段频率
fDCO+1的次数。当
DCOX=7,已为最高段频率,此时不能用MODx作为频率调整。
2、BCSCTL1:基础时钟系统控制寄存器1
XT2OFF:是否关闭XT2
0:打开XT2
,1:关闭XT2
XTS:
XT2模式选择
0:LF
mode
(低频模式)
,1:HF
mode
(高频模式)
DIVA:
ACLK的分频选择
0-3
对应
1/2/4/8
分频
RSELx:
选择DCO中16种标称的频率,实际对应16个内部电阻
0-15
对应的频率
从
低到高,当
DCOR=1
时,表示选用外接电阻,所以RSELx无效
3、BCSCTL2:基础时钟系统控制寄存器2
SELMx:选择MCLK的时钟源
0:DCOCLK
1:DCOCLK
2:当
XT2
振荡器在片内时采用
XT2CLK。当
XT2
振荡器不在片内时采用
LFXT1CLK
或
VLOCLK
3:LFXT1CLK
或
VLOCLK
DIVMx:
MCLK的分频选择
0-3
对应
1/2/4/8
分频
SELS:
选择SMCLK的时钟源
0:DCOCLK
1:当
XT2
振荡器存在时选用
XT2CLK,当
XT2
振荡器不存在时采用
LFXT1CLK
或
VLOCLK
DIVSx:
SMCLK的分频选择
0-3
对应
1/2/4/8
分频
DCOR:
0:DCOCLK使用内部电阻、
1:DCOCLK使用外接电阻
4、BCSCTL3:基础时钟系统控制寄存器3
XT2Sx:XT2范围选择
0:0.4-1MHz
晶体或振荡器
1:1-3MHz
晶体或振荡器
2:3-16MHz
晶体或振荡器
3:0.4-16MHz外部数字时钟源
LFXT1Sx:
低频时钟选择和
LFXT1
范围选择。当
XTS=0
时在
LFXT1
和
VLO之间选择。当
XTS=1
时选
择
LFXT1
的频率范围。
0:LFXT1上的
32768Hz
晶体
1:保留
2:VLOCLK(MSP430X21X1
器件上保留)
3:外部数字时钟信源
XCAPx:振荡器电容选择。这些位选择当
XTS=0
时用于
LFXT1
的有效电容。
0:1pF
1:6pF
2:10pF
3:12.5pF
XT2OF:XT2振荡器是否失效
0:有效,正在工作
1:无效,未正常工作
LFXT1OF:LFXT1振荡器是否失效
0:有效,正在工作
1:无效,未正常工作
5、IE1:中断使能寄存器
1
OFIE:振荡器失效中断使能。该位使
OFIFG
中断使能。由于
IE1
的其它位
用于其它模块,因此采用
BIS.B
或
BIC.B
指令来设置或清零该位比
用
MOV.B
或
CLR.B
更合适。
6、IFG1:中断标志寄存器
1
OFIFG:振荡器失效中断标志。由于
IFG1
的其它位用于其它模块,因此
采用
BIS.B
或
BIC.B
指令来设置或清零该位比用
MOV.B
或
CLR.B
更合适。
0:没有未被响应的中断
1:有未被响应的中断
四、DCO频率
4种频率经校准精度为±1%
4. 定时器TA
一、时钟源
1、时钟源:ACLK/SMCLK
外部TACLK/INCLK
2、分频:1/2/4/8
当
(注:TACLR
置位时,分频器复位)
二、计数模式
通过设置MCx可以设置定时器的计数模式
1、停止模式:停止计数
2、单调增模式:定时器循环地从0增加到TACCR0值
周期
:TACCR0
CCIFG
:Timer计到TACCR0值时触发
TAIFG
:Timer计到0时触发
3、连续模式
:定时器循环从0连续增加到0xFFFF
周期
:0x10000
TAIFG
:Timer计到0时触发
4、增减模式
:定时器增计数到TACCR0
再从
TACCR0
减计数到
0
周期
:TACCR0值的2倍
CCIFG
:Timer计到TACCR0值时触发
TAIFG
:Timer计到0时触发[page]
三、定时器A
TACCRx
比较模式
(用于输出和产生定时中断)
1、设置:CAP=0选择比较
2、输出信号:比较模式用于选择
PWM
输出信号或在特定的时间间隔中断。当
TAR
计数
到
TACCRx
的值时:
a、中断标志
CCIFG=1;
b、内部信号
EQUx=1;
c、EQUx
根据输出模式来影响输出信号
d、输入信号
CCI
锁存到
SCCI
每个捕获比较模块包含一个输出单元。输出单元用于产生如
PWM
这样的信号。每个输出单元可以根据
EQU0
和
EQUx
产生
8
种模式的信号。
3、中断
TimerA
有
2
个中断向量:
a、TACCR0
CCIFG
的
TACCR0
中断向量
b、所有其他
CCIFG
和
TAIFG
的
TAIV
中断向量
在捕获模式下,当一个定时器的值捕获到相应的
TACCRx
寄存器时,
CCIFG
标志置位。
在比较模式下,如果
TAR
计数到相应的
TACCRx
值时,CCIFG
标志置位。软件可以清除或置
位任何一个
CCIFG
标志。当响应的
CCIE
和
GIE
置位时,
CCIFG
标志就会产生一个中断。
c、TACCR0
CCIFG
标志拥有定时器
A
的最高中断优先级,并有一个专用的中断向量,
当进入
TACCR0
中断后,TACCR0
CCIFG
标志自动复位。
d、TACCR1
CCIFG,
TACCR2
CCIFG,
和
TAIFG
标志共用一个中断向量。中断向量寄存器
TAIV
用于确定它们中的哪个要求响应中断。最高优先级的中断在
TAIV
寄存器中产生一个数字(见
寄存器说明),这个数字是规定的数字,可以在程序中识别并自动进入相应的子程序。禁止定时
器
A
中断不会影响
TAIV
的值。
对
TAIV
的读写会自动复位最高优先级的挂起中断标志。如果另一个中断标志置位,在结
束原先的中断响应后会,该中断响应立即发生。例如,当中断服务子程序访问
TAIV
时,如果
TACCR1
和
TACCR2
CCIFG
标志位置位,TACCR1
CCIFG
自动复位。在中断服务子程序的
RETI
命令执行后,TACCR2
CCIFG
标志会产生另一个中断。
四、TimerA的捕获模式
1、设置:CAP=1选择捕获,
CCISx位设置捕获的信号源,CMx位选择捕获的沿,上升,下降,或上升下降都
捕获。
2、如果一个第二次捕获在第一次捕获的值被读取之前发生,捕获比较寄存器就会产生一个溢出逻辑,COV
位在此时置位,如图
8-11,COV
位必须软件清除。
五、寄存器
1、TACTL:TimerA控制寄存器
TASSELx:TA时钟源选择
0:TACLK;1:ACLK;2:SMCLK;3:INCLK
IDx:
输入分频,分时钟源分频再输入TimerA
0/1/2/3:1/2/4/8
分频
MCx:
模式控制
0:停止定时器;1:增模式,定时器计数到TACCR0;
2:连续模式,定时器计数到0xFFFF;3:增减模式,0->TACCR0->0
TACLR:
定时器清零位。该位置位会复位
TAR,时钟分频和计数方向。TACLR位会自动复位并读出值为0
TAIE:
TA
中断允许。该位允许
TAIFG
中断请求
0:中断禁止;1:中断允许
TAIFG:
TA中断标记
0:无中断挂起;1:中断挂起
2、TAR:TimerA计数寄存器
3、TACCTLx:捕获比较控制寄存器
CMx:捕获模式
0:不捕获
;1:上升沿捕获;2:下降沿捕获
;3:上升和下降沿都捕获
CCISx:捕获比较选择,该位选择
TACCRx
的输入信号
0:CCIxA;1:CCIxB;2:GND;3:VCC
SCS:同步捕获源,该位用于将捕获通信和时钟同步
0:异步捕获;1:同步捕获
SCCI:同步的捕获/比较输入,所选择的
CCI
输入信号由
EQUx
信号锁存,并可通过该位读取
CAP:捕获模式
0:比较模式;1:捕获模式
OUTMODx:输出模式位。由于在模式
2,3,6
和
7
下
EQUx=
EQU0,因此这些模式对
TACCR0
无效
0:OUT
位的值;1:置位;2:翻转/复位;3:置位/复位
4:翻转;5:复位;6:翻转/置位;7:复位/置位
CCIE:捕获比较中断允许位,该位允许相应的
CCIFG
标志中断请求
0:中断禁止;1:中断允许
CCI:捕获比较输入。所选择的输入信号可以通过该位读取
OUT:对于输出模式
0,该位直接控制输出状态
0:输出低电平;1:输出高电平
COV:捕获溢出位。该位表示一个捕获溢出发生。COV
必须由软件复位。
0:没有捕获溢出发生;1:有捕获溢出发生
CCIFG:捕获比较中断标志位
0:没有中断挂起;1:有中断挂起
4、TAIV:TimerA中断向量寄存器
寄存器的值:
0:无中断挂起;
2:捕获比较1
TACCR1
CCIFG;
4:捕获比较2
TACCR2
CCIFG;
0xA:定时器溢出
TAIFG
5.MSP430中断嵌套机制
(1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT。
(2)当进入中断程序时,只要不在中断中再次开中断,刚总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行。
(3)若在中断A中开了总中断,刚可以响应后来的中断B(不管B的优先级比A高还是低),B执行完现继续执行。注意:进入中断B生总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后中跳出中断程序进入A程序时,总中断会自动打开。
(4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来才起做用!中断服务不执行抢先原则。
(5)对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用“EINT();”开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断必须先清标志现打开中断开关。
6.关于MSP430中断机制--我的理解
因DC的邀请写一个有关中断的东东,我也接触430不久只能以自己的心得体会更大家分享,若有纰漏恳请见谅。MSP430用户手册上有的中断介绍我就不赘述了,大家可以看User
Guider.我讲的主要是书上没有的,或者是点的不透的。希望对大家有用。
1.中断嵌套,优先级
430总中断的控制位是状态寄存器内的GIE位(该位在SR寄存器内),该位在复位状态下,所有的可屏蔽中断都不会发生响应。可屏蔽中断又分为单中断源和多中断源的。单中断源的一般响应了中断服务程序中断标志位就自动清零,而多中断源的则要求查询某个寄存器后中断标志位才会清零。由于大多数人接触的第一款单片机通常是51,51单片机CPU在响应低优先级的中断程序过程中若有更高优先级的中断发生,单片机就会去执行高优先级,这个过程已经产生了中断嵌套。而430单片机则不同,如果在响应低优先级中断服务程序的时候,即使来了更高优先级的中断服务请求,430也会置之不理,直至低优先级中断服务程序执行完毕,才会去响应高优先级中断。这是因为430在响应中断程序的时候,总中断GIE是复位状态的,如果要产生类似51的中断嵌套,只能在中断函数内再次置位GIE位。
2.定时器TA
TimerA有2个中断向量。TIMERA0,TIMERA1
TIMERA0只针对CCR0的计数溢出
TIMERA1再查询TAIV后可知道是CCR1,还是CCR2,亦或TAIFG引起的,至于TAIFG是什么情况下置位的,则要看TA工作的模式
具体看用户手册。还有一点TA本身有PWM输出功能,无须借用中断功能。在这个问题上经常出现应用弯路的是如何结合TA和AD实行定时采样的问题,很多人都是在TA中断里打开AD这样来做。这是不适宜的,因为430
的ADC10,ADC12(SD16不熟悉,没发言权)模块均有脉冲采样模式和扩展采样模式。只要选择AD是由TA触发采样,然后把TA设置成PWM输出模式,当然输出PWM波的都是特殊功能脚,但是在这里它是不需要输出的,所以引脚设置不必理会。值得关心的就是PWM的频率,也就是你AD的采样率。
3.看门狗复位
看门狗有2种工作模式:定时器
,看门狗
定时器工作模式下WDTIFG在响应中断服务程序有标志位自动复位,而在看门狗模式下,该标志位只能软件清零。但是怎么判断复位是由于WDT工作在看门狗模式下的定时溢出引起的,还是看门狗写密钥错误引起的呢?………………………………
答案是没有方法,至少我没见过有什么方法,也没见过周边的人有什么方法。若有人知道方法谢谢分享。
4.经常有人会问这个语句的MOV.B
#LPM0,0(SP)的作用。假如你在进入中断函数之前,430是在LPM0下待机,若要求执行完中断函数之后进入LPM3待机,在中断函数里写MOV.B
#LPM3,SR是无效的。因为在进入中断时430会把PC,SR压栈,(
SR内保存着低功耗模式的设置)即使你写了MOV.B
#LPM3,SR,在退出中断出栈时SR会被重新设置成低功耗0,要达到这样的目的,只能更改堆栈内SR的设置:MOV.B
#LPM0,0(SP)。
5中断向量:
430的中断向量是FFE0H—FFFFH,一共32个字节也就是FLASH的最后一段,430的FLASH有大有小,但是最后地址肯定是FFFFH(大FLASH超过64K的除外)所以它们的起始地址是不一样的,而一般IAR默认编译都是把程序放在FLASH开始的位置(不包括信息段)。
有个值得弄清楚的问题是:什么是中断向量?中断向量实际就是保存中断函数入口地址的存储单元空间。就像FFFEH+FFFFH这2个字节是复位中断向量,那么它存储的就是主函数在FLASH内的起始地址,假如主函数保存在以0x1100为起始地址的FLASH块内,那么你会发现FFFFH
内保存的是0x11,
FFFE内保存的是0x00.其他什么TimerA,ADC12,所有的都一样。只是你每次写的程序长短不一,中断函数放的位置不一样。IAR编译器都会给你定好,然后在你用JTAG烧写程序的时候,把这个地址,烧写到相应的中断向量。因为中断函数所处地址可以由用户自定义,也可以让IAR自动编译,所以这个地址除了源代码开发人员知道,其他人是不知道的,BSL就是应用这32个字节的中断向量内的内容的特殊性设置的密码。但是有几个东西在430是不变的,就是触发中断的条件满足后,它到哪个地方去寻址中断服务函数的入口地址,是TI
在做430时就固化好,定死的。比方说上电复位的时候,它知道去FFFE,FFFF单元找地址,而不去FFE0,FFE2找地址,这个映射关系是430固化不变的。可有的时候你就是需要改变“中断向量”,这怎么办?430FLASH程序自升级里有时就会碰到这个问题,方法是在430原来默认的中断向量表内做一个跳转操作,同样以上电复位为例:
ORG
0x2345
PowerReset:
mov.w
&0xFCFE,PC
…………………………
…………………………
ORG
0xFFFE
DW
PowerReset
这样的话0xFCFE就相当是0xFFFE的映射了。这个在430程序自升级的TI应用报告里就有。