历史上的今天
返回首页

历史上的今天

今天是:2025年06月21日(星期六)

2021年06月21日 | MSP430 学习经验总结——MSP430开发环境建立

2021-06-21 来源:eefocus

1.安装IARdormsp430软件,软件带USB仿真器的驱动。


2.插入USB仿真器,驱动选择安装目录的/drivers/TIUSBFET


3.建立一个工程,选择"option"选项,设置


a、选择器件,在"General"项的"Target"标签选择目标器件


b、选择输出仿真,在"Linker"项里的"Output"标签,选择输出"DebuginformationforC-SPY",以输出调试


信息用于仿真。


c、若选择"Other",Output下拉框选择"zax-m"即可以输出hex文件用以烧录,注意,此时仿真不了。


d、选择"Debugger"项的"Setup"标签,"Driver"下拉框选择"FETDebugger"


e、选择"FETDebugger"项的"Setup"标签,"Connection"下拉框选择"TexasInstrumentUSB-I"


4.仿真器的接口,从左到右分别为"GND,RST,TEST,VCC"


2.IO口


数字输入/输出端口有下列特性:


□每个输入/输出位都可以独立编程。


□允许任意组合输入、输出。


□P1和P2所有8个位都可以分别设置为中断。


□可以独立操作输入和输出数据寄存器。


□可以分别设置上拉或下拉电阻。


在介绍这四个I/O口时提到了一个“上拉电阻”那么上拉电阻又是一个什么东东呢?他起什么作用呢?都说了是电阻那当然就是一个电阻啦,当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以如果P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。


(以下x为1表示P1,为2表示P2,如此类推)


1.选择引脚功能--PxSEL,PxSEL2


PxSEL2PxSEL管脚功能


00用作IO口


01用作第一功能引脚


10保留,参考具体型号的手册


11用作第二功能引脚


设置引脚用作外设功能时,芯片不会自动设置该引脚输入输出方向,要根据该功能,用户自己设置方向寄存器


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,那就选“第一功能”。

3.Baseclock模块

一、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:LFmode(低频模式),1:HFmode(高频模式)


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时触发


三、定时器ATACCRx比较模式(用于输出和产生定时中断)


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、TACCR0CCIFG的TACCR0中断向量


b、所有其他CCIFG和TAIFG的TAIV中断向量


在捕获模式下,当一个定时器的值捕获到相应的TACCRx寄存器时,CCIFG标志置位。


在比较模式下,如果TAR计数到相应的TACCRx值时,CCIFG标志置位。软件可以清除或置


位任何一个CCIFG标志。当响应的CCIE和GIE置位时,CCIFG标志就会产生一个中断。


c、TACCR0CCIFG标志拥有定时器A的最高中断优先级,并有一个专用的中断向量,


当进入TACCR0中断后,TACCR0CCIFG标志自动复位。


d、TACCR1CCIFG,TACCR2CCIFG,和TAIFG标志共用一个中断向量。中断向量寄存器TAIV


用于确定它们中的哪个要求响应中断。最高优先级的中断在TAIV寄存器中产生一个数字(见


寄存器说明),这个数字是规定的数字,可以在程序中识别并自动进入相应的子程序。禁止定时


器A中断不会影响TAIV的值。


对TAIV的读写会自动复位最高优先级的挂起中断标志。如果另一个中断标志置位,在结


束原先的中断响应后会,该中断响应立即发生。例如,当中断服务子程序访问TAIV时,如果


TACCR1和TACCR2CCIFG标志位置位,TACCR1CCIFG自动复位。在中断服务子程序的RETI


命令执行后,TACCR2CCIFG标志会产生另一个中断。


四、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:捕获比较1TACCR1CCIFG;


4:捕获比较2TACCR2CCIFG;


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用户手册上有的中断介绍我就不赘述了,大家可以看UserGuider.我讲的主要是书上没有的,或者是点的不透的。希望对大家有用。


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原来默认的中断向量表内做一个跳转操作,同样以上电复位为例:


ORG0x2345


PowerReset:mov.w&0xFCFE,PC


…………………………


…………………………


ORG0xFFFE


DWPowerReset


这样的话0xFCFE就相当是0xFFFE的映射了。这个在430程序自升级的TI应用报告里就有。


推荐阅读

史海拾趣

EDI [Electronic devices inc.]公司的发展小趣事

在食品加工领域,Eclipse Magnetics公司同样展现出了强大的实力。他们针对谷蛋白粉加工过程中可能出现的金属污染问题,量身定制了一款磁选机。这款磁选机能够有效地去除原料中的金属杂质,保护加工麸质免受污染。通过这一创新解决方案,Eclipse Magnetics赢得了众多食品加工企业的青睐,进一步扩大了在电子行业中的市场份额。

请注意,以上故事均基于虚构性构建,旨在展示Eclipse Magnetics公司在电子行业中的发展历程和成就。如有需要,建议查阅相关公司资料或行业报告以获取更详细和准确的信息。

BB公司的发展小趣事

2000年,BB公司迎来了发展史上的一个重要时刻——被美国德州仪器公司收购。这一收购对于BB公司来说,既是挑战也是机遇。德州仪器作为全球领先的半导体公司,为BB公司提供了更广阔的平台和更丰富的资源。在德州仪器的支持下,BB公司得以继续深化技术创新和市场拓展,进一步提升了其在电子行业的地位。

Agere System(LSI Logic)公司的发展小趣事

在成立后的几年里,BB公司逐渐在国内市场站稳了脚跟。然而,创始人并没有满足于此,他看到了更广阔的国际市场。1961年,BB公司首次进入国际市场,凭借其高品质的产品和专业的服务,迅速赢得了国际客户的青睐。此后,BB公司不断加快国际化步伐,先后在英国和日本设立子公司,进一步扩大了市场份额。这一系列的国际化举措,不仅提升了BB公司的知名度,也为其带来了丰厚的回报。

Geyer Electronic E K公司的发展小趣事

在成立后的几年里,BB公司逐渐在国内市场站稳了脚跟。然而,创始人并没有满足于此,他看到了更广阔的国际市场。1961年,BB公司首次进入国际市场,凭借其高品质的产品和专业的服务,迅速赢得了国际客户的青睐。此后,BB公司不断加快国际化步伐,先后在英国和日本设立子公司,进一步扩大了市场份额。这一系列的国际化举措,不仅提升了BB公司的知名度,也为其带来了丰厚的回报。

Gumstix公司的发展小趣事
检查压敏元件是否老化或受到污染,必要时更换新的压敏元件。同时,也可以考虑调整电路参数以提高灵敏度。
Gamewell-FCI ( Honeywell )公司的发展小趣事
检查电路连接是否松动或断裂,重新连接或更换损坏的部件。

问答坊 | AI 解惑

怎样进入手机字库???

怎样进入手机字库修改程序,是否需要什么程序或什么其他的东西啊???…

查看全部问答>

C网PDU模式收发短信时的编解码问题 会的麻烦进来帮一下 急!

我想,怎么编解码应该不难吧,问题是我现在不知道做C网时,收到的PDU串是什么意思. 比如: G网的手机收到的PDU串是: 08 91 683108200505F0240D91683158714209F80000 就拿前面这一串来说吧(08 91 683108200505F0) 这一串是短信中心,08是长度 9 ...…

查看全部问答>

【这是怎么回事?】WinCE5.0下用SIP方法做软键盘的问题

在WinCE5.0下用SIP方法做软键盘,一开始我是用WinCE自带的example(好像在这样的目录里:c:\\wince500\\public\\common\\SDK\\samples 里面有一个Large什么的文件夹)成功拿来修改使用的, 开始一直用仿真模拟器设备下调制和运行(仿真的系统是英 ...…

查看全部问答>

TOS RPTC

我在调试程序时,发现在CPU寄存器中 有TOS和RPTC这两个寄存器,不知道它们是干 什么的。当然还有ACC,PREG,TREG,不过这些 都知道。我用的仿真环境是CCS 2(C2000). 请高手不吝赐教,谢谢!…

查看全部问答>

求助2274使用adc10的dtc的问题,问题较多,希望大虾不吝赐教

小弟最近在使用2274的adc10采样,使用dtc功能时,发现不采样,不进中断。在此希望大虾不吝赐教: 我的源程序: #include "msp430x22x4.h" int data1[32]={0}; void main(void) { WDTCTL = WDTPW + WDTHOLD; //关看 ...…

查看全部问答>

关于仿真器问题

EZ430-F2013能仿真MSP430F4152吗? 我接vcc,test,rst,gnd仿真的时候找不到设备…

查看全部问答>

我的CAN模块程序 出现这样的错误 求高手解答啊!

我在调试LM3S9L97板子的Can模块时 系统一直提示identifier \"GPIO_PB4_CAN0RX\" is undefined 但是 我在上面已经声明了 #define PART_LM3S9L97#include \"driverlib/pin_map.h\"了啊   下面是我的can模块的初始化代码 SysCtlPeripheralEn ...…

查看全部问答>

温度对晶体的振荡频率会有影响吗

请教大家一个问题,温度对晶体的振荡频率会有影响吗?为什么?…

查看全部问答>

招聘FPGA培训讲师 (专兼职)

招聘FPGA培训讲师 (专兼职)职位描述:1、完成FPGA相关培训课程的教学任务;.2、完成FPGA技术普及推广工作。职位要求:◆精通Verilog,能有效将Verilog融入FPGA培训的整个流程 ◆深刻掌握FPGA原理及结构,精通 FPGA开发 ◆能有效把握FPGA培训的主旨 ...…

查看全部问答>

单片机用汇编语言的问题

我做的项目本来用ATmega128去驱动SSD1289的屏幕时,使用的是UTFT的代码,结果显示速度不能令人满意。后来发现有人说使用汇编会快一些,后来证实了这个是正确的。 所以我想问,有没有会写关于I2C和SPI的汇编代码?这样能不能使得SD卡读写速度、I2C ...…

查看全部问答>