MSP430开发环境建立

最近学习msp430,把自己的一些经验分享下,这是我在网上发现的一篇很不错的文章,归纳得很好,简洁明了。
一、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”
二、io口
数字输入/输出端口有下列特性:
每个输入/输出位都可以独立编程。
允许任意组合输入、输出。
p1 和 p2 所有 8 个位都可以分别设置为中断。
可以独立操作输入和输出数据寄存器。
可以分别设置上拉或下拉电阻。
在介绍这四个i/o口时提到了一个“上拉电阻”那么上拉电阻又是一个什么东东呢?他起什么作用呢?都说了是电阻那当然就是一个电阻啦,当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以如果p0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。
(以下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: 管脚当前为高
你说的“第二功能”应该是指外围模块功能吧,用模块就选“第二功能”,不用模块就选“第一功能”。 可通过设置pxsel寄存器进行选择,某位写“0”为i/o;写“1”为“第二功能”。 用到比较器(片内外围模块)时要设置为第二功能。 当然你如果是用片外的比较器,将其输出的高低电平(1或0)送给msp430,那就选“第一功能”。
http://zhidao.baidu.com/question/172451580.html?an=0&si=3
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时触发
三、定时器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应用报告里就有。
本文转自网络,版权归原作者,如果您觉得不好,请联系我们删除!


废气净化处理塔 活性炭处理塔 酸性处理塔 碱性处理塔 昆山晟华
韩国成为全球首个5G商用国家,在商用化进程中占据先机
阿里云发布了新一代云计算操作系统“飞天2.0”
贴片电阻与贴片电感有什么区别
荣耀Note9什么时候上市?华为荣耀Note9最新消息:荣耀Note9麒麟965+超窄边框+全面屏,价格2799
MSP430开发环境建立
越疆科技与清华大学人工智能研究院智能机器人中心签署全面战略合作协议
浅析车载以太网测试内容和测试方法
PHP中怎么使用HTTP代理
折叠手机引爆产业链 天马将引领行业发展
海洋智能型盐度传感器(海水)
爱特梅尔宣布带有LCD控制器的AVR XMEGA微控制器系列
解析专业电容话筒
目前Micro LED所面临的的技术瓶颈共分成六个面向
品牌蓝牙耳机有哪些,六款配置超高平价蓝牙耳机推荐
MOS管的三个极怎么判定?
合肥清溢光电有限公司高精度掩膜版项目奠基仪式在合肥市隆重举行
5G带来便利的同时,我更关心5G套餐产生的费用!
新型氢动力垂直起飞降无人机,采用氢燃料电池作为动力
区块链与币圈都是骗子与传销吗?