LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第1页共68页利尔达科技有限公司技术一部LSDSCIENCE&TECHNOLOGYCO.
,LTD.
MSP430相关Q&AQuestion&answer版本号:V1.
0提交人:MSP430项目组整理时间:2009年02月LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第2页共68页目录第一章:开发工具类第二章:指令系统第三章:代码编程类第四章:工作模式及功耗类第五章:复位系统类第六章:看门狗及定时器类第七章:系统时钟类第八章:LCD显示驱动类第九章:通信类第十章:IO端口类第十一章:FLASH存储类第十二章:AD转换类第十三章:电源类声明:所有问题均来自网络,部分答案也同样来自网路,答案仅供参考,并不能完全解决在使用中碰到的问题.
所以客户在使用MSP430单片机时还是以实际情况来决定.
如有任何疑问欢迎与我们联系:haoqiang@lierda.
com、gufeng@lierda.
com、chenbing@lierda.
comLSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第3页共68页第一章:开发工具类Q1:我自己做了一块MSP430F149的试验板,以前用下载线进行调试没有出现过问题,但是,最近我每次make后用下载线调试时,总是弹出一个窗口,给我提示:Couldnotfindtargetstatus.
然后就死到那儿了,请问这是什么问题呢A1:检查Jtag口线是否连接正常,如果JTAG口线连接正常,可能是供电不足,目标板加电再测试.
Q2:我用的430f22x学习套件,请问在IAREmbeddedWorkbench中仿真时如何看程序运行时间.
A2:只有软件模拟下可以看,VIEW-REGISTER-CYCLECOUNTQ3:请问各位msp430仿真器和编程器有什么区别啊是不是我开发的时候这两个东西都得有我目前用的是msp430cg461x系列或msp430fg461x系列,是不是很多仿真器和编程器都不支持A3:一般来讲,仿真器是在先期调试程序时使用的,他不会烧断单片机熔丝,能把程序下载到单片机中,能够单步,跟踪,快速调试.
编程器就没有这些调试功能,就是单纯把你做好的程序的编译后文件写到单片机中去,就和51的编程器一样,有加密熔丝烧断等功能,是在你产品成型后,生产时使用的MSP430的仿真器是使用JTAG接口的,分别有四线制的JTAG、带TEST脚的四线JTAG和两线制的SBWJTAG三种接口,UIF上三种都支持,并支持烧熔丝,UIF就是USB接口的仿真;PIF不能支持SBWJTAG接口,也不能烧熔丝,PIF是并口的仿真器.
任何一种JTAG接口的仿真器在烧断熔丝后都不能再仿真和写入,而BSL可以通过密码访问FLASH空间,读出写入均可,BSL是串口实现的,但BSL不能仿真,注意部分器件不支持BSL,如F20XX系列就不能用BSL,烧掉了熔丝就变板砖.
MSP430任何系列的仿真器只要接口方式一致都是兼容的,比如FG461X,可以使用标准的带TEST的四线JTAG,而F22X4也可以使用带TEST的四线JTAG,当然F22X4还可以选择使用SBWJTAG,它支持两种JTAG接口.
如果不是TI标准的430系列用JTAG仿真器那就不行了,应该是不兼容的,不是什么"很多仿真器和编程器都不支持",而是专用.
Q4:初次使用430单片机,F149.
高速晶振8M,低速32K,下载程序时出现securityfuse**own字样,无法烧录.
请各位高人指点,应该是哪里有问题.
A4:手工复下位应该基本可以解决,除非芯片熔丝真被烧掉了.
如果熔丝断了,可以用BSL方式写入程序.
Q5:运行到断点时程序不能自动结束,必须自己按break.
我这是程序跑飞了么A5:是你断点设置的多了吧.
你在程序中,只设置这一个断点试试Q6:当在RAM中对其中一变量开辟的尺寸是512字节时,程序总占用3.
5KRAM空间,可以正常烧到芯片中,也可以正常运行;当对同一变量开辟的尺寸是1024字节,而其它均未改变时,程序总占用4.
0K左右RAM空间,可以正常烧到芯片中,却无法运行!
!
!
!
A6:方法一将一些变量定义成noinit类型方法二修改IAR的cstartup.
s43程序,具体方法如下:(iar310a为例)1将cstartup.
s43程序加载到用户自己的项目中,cstartup.
s43在iar310a的路径如下$TOOLKIT_DIR$\src\LIB\2修改cstartup.
s43中的__program_start子程序,加入关闭看门狗的命令MOV#0x5A80,&0x01203在Project->Options->Linker->Config页中选择Overridedefaultprograme,并将Entrylib设置成__program_startLSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第4页共68页Q7:请问AR编译器的s43文件用什么编辑器打开A7:打开IAR编译器后就可以直接打开了;另外,记事本也可以打开Q8:怎么设置才能使2274内部dco产生稳定的16M的时钟信号,还有就是2274是不是提供FLL+功能!
A8:2XXX没有FLL+,但是TI在出厂芯片的时候已经做过出厂测试,你只要选择它头文件里的那个16M即可Q9:程序编译时提示:Warning[Pe001]:lastlineoffileendswithoutanewline,这是怎么回事啊,应该怎么改呢A9:敲个回车就可以了Q10:过去用435/436等因为仿真的几要线和端口都没有复用.
所以很轻松就搞定.
现在1232的仿真口和P1口是公用的,仿真时我把第一脚TEST接VCC,这样可以下载仿真了,可是发现这复用的几个P1口就不能执行其正确的动作了,请教A10:做仿真口的复用管脚在仿真时,被作为仿真功能管脚使.
Q11:USB仿真器下载汇编程序时没有问题,但是下载C语言程序时,出报警信息如下:Thestackplug-infailedtosetabreakpointon"main".
Thestackwindowwillnotbeabletodisplaystackcontents.
(YoucanchangethissettingintheTools>Optionsdialogbox.
在调试信息窗口出现operationerror.
A11:调试c程序时在Tools>Optionsdialogbox中stack要选中指向main函数处.
汇编和c要建不同的工程下调试.
Q12:装了MSP-FET430UIF仿真器,但是在AQ430的Options中,无法找到该仿真器,正常应该有LPT1/LPT2/LPT3/TIUSB四个选项,为什么看不到TIUSBA12:先看看硬件管理器中有没有那个硬件,有则先用IAR试试.
Q13:EZ430-RF2500中的USBdebugging可以调试msp430其他支持Spy-Bi-Wire系列的芯片吗A13:可以.
Q14:用TI的USB仿真器,采用的是二线法.
用SD_16采集数据,发现连接仿真器输出的数据正确,而把仿真器拔去,输出的数据就错了.
这是为什么A14:怎么理解这个数据正确和错误你怎么下的判断我认为是你接仿真器的时候目标板是从仿真器上取电的,拔掉仿真器是外部电源供电的,电源电压不同,将导致基准源改变,采样出来的值变化会很大.
Q15:sd-fet430uif仿真器不能外供电吗A15:可以,驱动电流较小,内部是光MOS管,要注意负载Q16:430FET下载出现问题时检查的一般思路A16:在完全确定无虚焊、短路的情况下,一般注意以下事项:LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第5页共68页1、仿真器的2、4脚电源2、复位脚的RC电路3、是否是SBW模式4、JTAG复用引脚时注意外部电路的影响5、外部有功率较大的器件,当下载时造成外部电路的功耗较大6、JTAG线不能太长,一般在20CM以内比较合适7、如果是USB的仿真器还要注意USB线不能太长,使用笔记本的还要注意USB上不能连接太多的负载Q17:LSD-FET430UIF仿真器,运用IAR410软件,器件是F1121A,无法下载程序也无法仿真,直接将接口线换在原来的FETP430IF上,把FET设置换成并口后就可以,请问下,是什么原因造成的A17:检查一下驱动安装对吧,另外再检查下USB提供的电源和USB线的信号,USB提供电源不足或USB线的信号受到了比较强的干扰都会影响下载.
Q18:430加密用的密码是中断向量的简单组合呢还是中断向量的加密组合还是用的中断服务程序入口地址的简单组合还是用的中断服务程序入口地址的加密组合A18:是入口地址的组合(存放在中断向量处的数据),以前是简单组合,新的5XX就有些复杂了,用户自己还可以定义密码.
Q19:我的程序编译后,DEBUG调试显示已成功DOWN到芯片里了,连着EZ430仿真器也能工作,但只要把EZ430脱开,PCB重新上电,芯片怎么也不工作.
不知是什么原因A19:2013的RST脚接1个上拉电阻就解决问题了.
Q20:通过标准的BSL方式是不需要编写单片机程序的如果是的话,那自定义串口下载的优点和缺点又是什么A20:用BSL不需要自己编写单片机程序,但需要另加入两根或4根编程线.
自己写升级程序直接使用串口,但需要自己写自编程程序,此方式使用方便,还可以在线大批量升级,缺点是要占用FLASH空间,如果通讯协议严谨,再加上密码保护之类的算法,消耗2K的FLASH资源还是比较正常的,所以小FLASH容量的就不推荐使用了.
Q21:在编译程序时,总是出现这样的错误信息,该怎么样解决呀Error[e46]:Undefinedexternal"main"referredincstart(D:\ProgramFiles\iar\430\LIB\CLIB\cl430f.
r43)程序没有错误,是不是编译器本身有什么问题A21:是汇编程序时,把OPTIONS里的ASSEM**ERONLY……选上.
Q22:UIF连接不到F2274,RST信号的电容已去掉,用并口能连接上,不稳定,这是为什么A22:F22X4支持两种JTAG接口,如果是UIF的话,个人建议使用SBW的,如果用4线制的话,会占用数个复用端口,你说连不上是不是就是因为复用端口上连有外围设备造成JTAG无法正常工作了呢.
检查一下.
Q23:故障现象:有时windows能识别,多数不能识别;提示"未知usb设备";挑机器-换台机器可能好使;升级失败;这是什么原因A23:1.
使用IAR自动更新功能,只能通过JTAG口重新写入f1612程序.
2.
EZ430板上TUSB3410的复位脚C9电容小,增加到2uF.
最好增加旁路滤波电容,以提高电源质量.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第6页共68页Q24:使用430内置的infoflash来存放一些配置信息.
在用fet硬件仿真的时候,希望直接手动修改memory窗口中的的infoflash的内容,但是老是弹出窗口说这些地址是不可访问等提示,请问有什么办法可以在硬件仿真的时候,直接修改info中的内容么A24:flash不能直接修改.
这个得用编程器,仿真器或者软件编程修改FLASH,你这样就能修改FLASH那也太……嘿嘿……Q25:IAR如何查看生成的代码的大小A25:编译后在信息窗口就是就可以提示,如果没有提示,请在Tool/Options/Meassages/showbuildmessage:选为All就行了.
Q26:程序下不进去,用的仿真器是一头并口,一头14脚的jtag,烧的时候总说找不到设备A26:RST连上,去掉上面的电容.
Q27:给MSP430F149仿真的JTAG能给MSP430F2002仿真吗我把腿都对应上了,但程序下不进去,说是找不到器件.
以前用同样的方法成功的给449仿真过!
!
!
难道2002用的是不同的JTAGA27:并口仿真器支持2002,不过只能使用四线JTAG方式,RST引脚必须连接,而且不要有复位电容.
Q28:430如何将程序成功烧入1.
烧片子的具体的顺序A28:首先option里得选择正确的芯片型号,还要在Debugger选项卡里的driver选择FET_Debugger,在按工具栏内的下载按钮(快捷键ctrl+D)Q29:MSP430F22X学习板SBW用访真器不能进行调试A29:原因可能两点两线制是不能用并口访真器进行调试的,必须USB访真器两线制RST并联的电容建议不接,否则造成程序无法正常下载Q30:在研制带处理器的电子产品时,如何提高抗干扰能力和电磁兼容性A30:一、下面的一些系统要特别注意抗电磁干扰:1、微控制器时钟频率特别高,总线周期特别快的系统.
2、系统含有大功率,大电流驱动电路,如产生火花的继电器,大电流开关等.
3、含微弱模拟信号电路以及高精度A/D变换电路的系统.
二、为增加系统的抗电磁干扰能力采取如下措施:1、选用频率低的微控制器:选用外时钟频率低的微控制器可以有效降低噪声和提高系统的抗干扰能力.
同样频率的方波和正弦波,方波中的高频成份比正弦波多得多.
虽然方波的高频成份的波的幅度,比基波小,但频率越高越容易发射出成为噪声源,微控制器产生的最有影响的高频噪声大约是时钟频率的3倍.
2、减小信号传输中的畸变a、微控制器主要采用高速CMOS技术制造.
信号输入端静态输入电流在1mA左右,输入电容10PF左右,输入阻抗相当高,高速CMOS电路的输出端都有相当的带载能力,即相当大的输出值,将一个门的输出端通LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第7页共68页过一段很长线引到输入阻抗相当高的输入端,反射问题就很严重,它会引起信号畸变,增加系统噪声.
当Tpd>Tr时,就成了一个传输线问题,必须考虑信号反射,阻抗匹配等问题.
b、信号在印制板上的延迟时间与引线的特性阻抗有关,即与印制线路板材料的介电常数有关.
可以粗略地认为,信号在印制板引线的传输速度,约为光速的1/3到1/2之间.
微控制器构成的系统中常用逻辑电话元件的Tr(标准延迟时间)为3到***s之间.
c、在印制线路板上,信号通过一个7W的电阻和一段25cm长的引线,线上延迟时间大致在4~20ns之间.
也就是说,信号在印刷线路上的引线越短越好,最长不宜超过25cm.
而且过孔数目也应尽量少,最好不多于2个.
d、当信号的上升时间快于信号延迟时间,就要按照快电子学处理.
此时要考虑传输线的阻抗匹配,对于一块印刷线路板上的集成块之间的信号传输,要避免出现Td>Trd的情况,印刷线路板越大系统的速度就越不能太快.
e、用以下结论归纳印刷线路板设计的一个规则:f、信号在印刷板上传输,其延迟时间不应大于所用器件的标称延迟时间.
3、减小信号线间的交叉干扰:a、A点一个上升时间为Tr的阶跃信号通过引线AB传向B端.
信号在AB线上的延迟时间是Td.
在D点,由于A点信号的向前传输,到达B点后的信号反射和AB线的延迟,Td时间以后会感应出一个宽度为Tr的页脉冲信号.
在C点,由于AB上信号的传输与反射,会感应出一个宽度为信号在AB线上的延迟时间的两倍,即2Td的正脉冲信号.
这就是信号间的交叉干扰.
干扰信号的强度与C点信号的di/at有关,与线间距离有关.
当两信号线不是很长时,AB上看到的实际是两个脉冲的迭加.
b、CMOS工艺制造的微控制由输入阻抗高,噪声高,噪声容限也很高,数字电路是迭加100~200mv噪声并不影响其工作.
若图中AB线是一模拟信号,这种干扰就变为不能容忍.
如印刷线路板为四层板,其中有一层是大面积的地,或双面板,信号线的反面是大面积的地时,这种信号间的交叉干扰就会变小.
原因是,大面积的地减小了信号线的特性阻抗,信号在D端的反射大为减小.
特性阻抗与信号线到地间的介质的介电常数的平方成反比,与介质厚度的自然对数成正比.
若AB线为一模拟信号,要避免数字电路信号线CD对AB的干扰,AB线下方要有大面积的地,AB线到CD线的距离要大于AB线与地距离的2~3倍.
可用局部屏蔽地,在有引结的一面引线左右两侧布以地线.
4、减小来自电源的噪声电源在向系统提供能源的同时,也将其噪声加到所供电的电源上.
电路中微控制器的复位线,中断线,以及其它一些控制线最容易受外界噪声的干扰.
电网上的强干扰通过电源进入电路,即使电池供电的系统,电池本身也有高频噪声.
模拟电路中的模拟信号更经受不住来自电源的干扰.
5、注意印刷线板与元器件的高频特性a、在高频情况下,印刷线路板上的引线,过孔,电阻、电容、接插件的分布电感与电容等不可忽略.
电容的分布电感不可忽略,电感的分布电容不可忽略.
电阻产生对高频信号的反射,引线的分布电容会起作用,当长度大于噪声频率相应波长的1/20时,就产生天线效应,噪声通过引线向外发射.
b、印刷线路板的过孔大约引起0.
6pf的电容.
c、一个集成电路本身的封装材料引入2~6pf电容.
d、一个线路板上的接插件,有520nH的分布电感.
一个双列直扦的24引脚集成电路扦座,引入4~***H的分布电感.
e、这些小的分布参数对于这行较低频率下的微控制器系统中是可以忽略不计的;而对于高速系统必须予以特别注意.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第8页共68页6、元件布置要合理分区元件在印刷线路板上排列的位置要充分考虑抗电磁干扰问题,原则之一是各部件之间的引线要尽量短.
在布局上,要把模拟信号部分,高速数字电路部分,噪声源部分(如继电器,大电流开关等)这三部分合理地分开,使相互间的信号耦合为最小.
7、处理好接地线a、印刷电路板上,电源线和地线最重要.
克服电磁干扰,最主要的手段就是接地.
b、对于双面板,地线布置特别讲究,通过采用单点接地法,电源和地是从电源的两端接到印刷线路板上来的,电源一个接点,地一个接点.
印刷线路板上,要有多个返回地线,这些都会聚到回电源的那个接点上,就是所谓单点接地.
所谓模拟地、数字地、大功率器件地开分,是指布线分开,而最后都汇集到这个接地点上来.
与印刷线路板以外的信号相连时,通常采用屏蔽电缆.
对于高频和数字信号,屏蔽电缆两端都接地.
低频模拟信号用的屏蔽电缆,一端接地为好.
c、对噪声和干扰非常敏感的电路或高频噪声特别严重的电路应该用金属罩屏蔽起来.
8、用好去耦电容.
a、好的高频去耦电容可以去除高到1GHZ的高频成份.
陶瓷片电容或多层陶瓷电容的高频特性较好.
设计印刷线路板时,每个集成电路的电源,地之间都要加一个去耦电容.
去耦电容有两个作用:一方面是本集成电路的蓄能电容,提供和吸收该集成电路开门关门瞬间的充放电能;另一方面旁路掉该器件的高频噪声.
数字电路中典型的去耦电容为0.
1uf的去耦电容有5nH分布电感,它的并行共振频率大约在7MHz左右,也就是说对于10MHz以下的噪声有较好的去耦作用,对40MHz以上的噪声几乎不起作用.
b、1uf,10uf电容,并行共振频率在20MHz以上,去除高频率噪声的效果要好一些.
在电源进入印刷板的地方和一个1uf或10uf的去高频电容往往是有利的,即使是用电池供电的系统也需要这种电容.
c、每10片左右的集成电路要加一片充放电电容,或称为蓄放电容,电容大小可选10uf.
最好不用电解电容,电解电容是两层溥膜卷起来的,这种卷起来的结构在高频时表现为电感,最好使用胆电容或聚碳酸酝电容.
d、去耦电容值的选取并不严格,可按C=1/f计算;即10MHz取0.
1uf,对微控制器构成的系统,取0.
1~0.
01uf之间都可以.
三、降低噪声与电磁干扰的一些经验.
1、能用低速芯片就不用高速的,高速芯片用在关键地方.
2、用串一个电阻的办法,降低控制电路上下沿跳变速率.
3、尽量为继电器等提供某种形式的阻尼.
4、使用满足系统要求的最低频率时钟.
5、时钟产生器尽量靠近到用该时钟的器件.
石英晶体振荡器外壳要接地.
6、用地线将时钟区圈起来,时钟线尽量短.
7、I/O驱动电路尽量靠近印刷板边,让其尽快离开印刷板.
对进入印制板的信号要加滤波,从高噪声区来的信号也要加滤波,同时用串终端电阻的办法,减小信号反射.
8、MCD无用端要接高,或接地,或定义成输出端,集成电路上该接电源地的端都要接,不要悬空.
9、闲置不用的门电路输入端不要悬空,闲置不用的运放正输入端接地,负输入端接输出端.
(10)印制板尽量使用45折线而不用90折线布线以减小高频信号对外的发射与耦合.
10、印制板按频率和电流开关特性分区,噪声元件与非噪声元件要距离再远一些.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第9页共68页11、单面板和双面板用单点接电源和单点接地、电源线、地线尽量粗,经济是能承受的话用多层板以减小电源,地的容生电感.
12、时钟、总线、片选信号要远离I/O线和接插件.
模拟电压输入线、参考电压端要尽量远离数字电路信号线,特别是时钟.
13、对A/D类器件,数字部分与模拟部分宁可统一下也不要交叉.
14、时钟线垂直于I/O线比平行I/O线干扰小,时钟元件引脚远离I/O电缆.
15、元件引脚尽量短,去耦电容引脚尽量短.
16、关键的线要尽量粗,并在两边加上保护地.
高速线要短要直.
17、对噪声敏感的线不要与大电流,高速开关线平行.
18、石英晶体下面以及对噪声敏感的器件下面不要走线.
19、弱信号电路,低频电路周围不要形成电流环路.
20、任何信号都不要形成环路,如不可避免,让环路区尽量小.
21、每个集成电路一个去耦电容.
每个电解电容边上都要加一个小的高频旁路电容.
22、用大容量的钽电容或聚酷电容而不用电解电容作电路充放电储能电容.
使用管状电容时,外壳要接地Q31:有关仿真器及编程器的问题:A31:对于51系统来说,很容易理解编程器与仿真器的区别.
通俗的说,仿真器是用来仿真调试的,编程器是用来批量生产时对MCU进行烧写目标代码的.
对于MSP430来说,无论仿真还是烧写程序一般可以通过:JTAG/SBW/BSL接口进行,这些概念仅是接口,并不代表哪个型号的编程器和仿真器,一般JTAG/SBW接口用于仿真接口,BSL不能用于仿真,只能用于编程.
编程器则三种接口都支持.
所以并不能说JTAG只支持仿真,不支持编程,这是概念错误,JTAG仅仅是一种接口协议而已.
下面简单描述一下三种接口的区别:1、JTAG是边界扫描技术,其在430内部有逻辑接口给JTAG使用,内部有若干个寄存器连接到430内部的总线上,所以JTAG可以访问到430的内部所有资源,包括对FLASH的读写操作.
可以用于编程和仿真接口.
主要连接线有TMS/TCK/TDI/TDO/RST/TEST等.
2、SBW是SPY-BI-WIRE的简称.
通常称为两线制JTAG,主要用SBWTCK与SBWTDIO,该接口主要用于小于28脚的430单片机及5系列的单片机.
因为28脚以内的单片机JTAG接口与通用IO口复用,为了给用户预留更多的IO,才推出SBW接口.
同样SBW接口可以用于仿真器与编程器.
3、BSL是TI在MSP430出厂时预先固化到MCU内部的一段代码,有点类似与DSP的bootloader,但与bootloader有明显的区别,BSL只能用于对MCU内部的FLASH访问,不能对访问其他资源.
所以只能用作编程器接口.
BSL通过UART协议与编程器连接通信.
编程器可以发送不同的通信命令来对MCU的存储器做不同的操作.
BLS的启动有些特殊,一般430复位启动时PC指针指向FFFE复位向量,但可以通过特殊的启动方式可以使PC指向BSL内部固化的程序.
启动方式一般由RST与TEST(或TCK)引脚做一个稍复杂的启动逻辑后产生.
4、一般的MCU都有加密功能,430如何实现加密的呢外部对430内部的代码读写只能通过上述的三种方式,所以引入熔丝位,熔丝位只存在与JTAG/SBW接口逻辑内.
BSL没有熔丝.
当熔丝烧断时(物理破坏,且不可恢复)JTAG/SBW的访问将被禁止,此时只有BSL可以访问.
而通过BSL对MCU的访问是需要32字节的密码,密码就是用户代码的中断向量表.
5、一般的仿真器型号有:UIF(USB接口,支持JTAG/SBW)、PIF(并口,只支持JTAG)、EZ430(USB接口,只支持SBW模式).
专业的编程器有GANG430(串口,一拖8个目标板,支持JTAG/SBW及烧断熔丝功能);多功能编程器(JTAG/SBW/BSL及烧断熔丝功能).
这些编程器都可以支持离线烧写,即脱离计算机来对目标板烧写.
当然也可以通过特殊的软件用仿真器来烧写,这类软件有MSPFET、FET-PRO430等.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第10页共68页Q32:最近调试程序,不知怎么老出现下面的问题,请问是怎么回事"erasecheckerrorataddress0x1100retryeraseoperation"知道是怎么回事A32:最可能的就是芯片电压太低,或者芯片有虚焊的.
Q33:请问MSP430F149程序下载时的电源要提供的电流为多大A33:这个电流主要用于flash的擦写.
擦和写的典型电流都是3mA.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第11页共68页第二章:指令系统Q1.
IAR中怎样描述P2OUT.
3脚,#defineLCD_cs1P2OUT.
3;对吗A1:430不能位寻址,所以一般的位操作,都通过"与"来作用.
#defineLCD_cs1(P2OUT&BIT3).
Q2.
__intrinsic是什么意思A2:本征函数,不是C语言标准库,而是和MSP430汇编直接对应的函数,比如:_NOP()_EINT()LPM0引用msp430xxxx.
h,默认引用的头文件Q3:430中使用C和汇编语言的区别,优缺点比较A3:严格来讲430的C是ANSIC的一个子集,与汇编的差别主要有:1、C有if、(do)while、switch等流程控制语句2、C有有限的数据格式,如char、int、float、dou**e等3、对430最有特色的R0--R15的使用,C不如汇编4、430的C不易进行RAM管理5、430各版本的C,互相之间存在差异,好象C在430上还不成熟6、C的优点是在PC或PDA上,也就是在有操作系统的平台上,C的优点才会表现出来,但那已经不是430的C了,而是C++,它有丰富的数据类型,如结构、对象等7、汇编的缺点,基本上就是C的优点,而汇编的优点基本上都是C的缺点8、C函数有类型限定的形参和返回值以及强制类型转换,还有格式化输出,发挥C的这些特长,再结合结构化程序设计技术,容易编出思路清晰、结构灵活、可移值性比较强的程序.
汇编也可以满足上述要求,但相对来讲要复杂些.
9、初学者建议先用汇编,由于对硬件的操作更加直观灵活,有利于对430内部结构的熟悉和熟悉编程思路.
等掌握了30的开发技能,又熟悉了系统的合理分配资源和组织资源时再学习用c,那将使你进步最快的时候,因为c对程序的结构和调度真得很理想!
10、源代码隐藏性比较好,比较安全.
Q4:MSP430指令系统中,符号寻址方式有点不太理解.
例如连续的两条指令是:MOV.
B#20H,0012HMOV.
B#34H,0200H在反汇编窗口看这两条指令是:mov.
b#0x20,0x1112mov.
b#0x34,0x1300不理解的是:1.
为什么反汇编后指令的第二个操作数地址变成了0x1112和0x13002.
上述反汇编指令似乎都在原有的地址基础上加上了0x1100,我知道保存程序的FLASH是从0x1100开始的.
但实际在执行上述两条指令时,PC的值早就>0x1100.
符号寻址操作数地址应该=(PC+0012H)、(PC+0200H).
而PC值在执行指令中应该是变化的A4:0012H和0200H是绝对地址.
问题中程序用的是立即寻址,实际上应该用绝对寻址LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第12页共68页MOV.
B#0030h,&0200h就是前面操作数前面有一个&;没有'&",MOV.
B#0030h,0200h那么地址就应该=PCaddrress+0200(偏移量).
反编译出来的代码应该是mov.
b#0x20,&0x1112mov.
b#0x34,&0x1300才对.
Q5:在程序里循环调用了sprintf函数,当循环了几次后程序就跑飞了,是堆栈大小不够吗还有sprintf到底需要多大的堆栈,单步走了下,发现它使用堆栈都不是连续的A5:有可能是的sprintf函数堆栈数据把跳转地址挤掉,可以调开堆栈看一下.
Q6:问MSP430MOV命令立即数寻址MOV@PC+,X(PC);偏移量可变址寻址MOVX(PC),Y(PC);怎么理解A6:MOV@PC+,X(PC);将PC所指单元的内容送给PC+X所在单元,然后PC本身加1,指向相邻的下一单元.
MOVX(PC),Y(PC);将PC+X所指单元的内容送给PC+Y所在单元问题7:数据类型Small,Medium,Large的区别,以及怎么访问大于0X10000的地址空间数据放在大于0X10000的地址空间中,怎么去访问同时Small,Medium,Large在何处可以体现它们的区别A7:可以访问.
值得注意的是option里的GeneralOption选项内的数据类型得选择Large,程序大小,RAM使用,运行速度都不一样.
1.
F5XX430X2.
选择Largesmallmedium产生效果是改变指针变量所占字节个数.
IAR中指针变量默认2个字节,选择large占用4个字节,那么指针就可以访问超过64K范围的地址.
3.
可以采用IAR内部函数,*/void__data20_write_char(unsignedlong__addr,unsignedchar__value);void__data20_write_short(unsignedlong__addr,unsignedshort__value);void__data20_write_long(unsignedlong__addr,unsignedlong__value);unsignedchar__data20_read_char(unsignedlong__addr);unsignedlong__data20_read_long(unsignedlong__addr);Q8:关于堆栈问题问题:Error[e16]:SegmentCSTACK(size:0x50align:0x1)istoolongforsegmentdefinition.
Atleast0x4morebytesneeded.
Thepro**emoccurredwhileprocessingtheLSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第13页共68页segmentplacementcommand"-Z(DATA)CSTACK+_STACK_SIZE#",whereatthemomentofplacementthe**aila**ememoryrangeswere"CODE:5B4-600"请问:这个错误是什么意思A8:将stack设置减小,可通过编译,这时stack是静态的.
而会不会出错不是stack设置问题,而是在程序运行时,动态中,RAM占用量大小所定.
减少程序中的变量个数,变量类型尽量小,够用就可以,能减少动态运行时RAM的占用量.
Q9:浮点数运算问题,既然2.
2A编译器能实现64浮点位运算,那么它的运算程序在哪个文档里.
A9:要使用64位的浮点运算需要设置编译器首先选择project->option->general->target->dou**efloatingpointsize选中"64"再选择project->option->XLINK->include->library->cl430d.
r43用c++的朋友要选择dl430d.
r43库建议用整型数进行运算,比如像开方,64位浮点数要用几十毫秒,而整型数随数据大小只要几微秒到几毫秒不等.
Q10:局部变量的问题,在中断服务程序中开中断响应其他中断,发现中断服务中定义的局部变量老被改动,换成全局变量没问题.
想问一下这是啥原因还想问一下c编程过程中应注意的细节A10:局部变量只是暂存变量,一般编译器会使用通用寄存器来保存这个变量值,汇编编程的话需要圧栈操作,C语言编程的话建议把变量申明为全局或者静态.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第14页共68页第三章:代码编程类Q1:我在一个子程序中定义了一个变量,是在其头文件中定义的,然后在主程序中包含了此头文件,当在主程序中引用此变量时,编译器没有报错,但是要DEBUG时出错了,告诉我是redefineinmain,请问这是怎么回事呢A1:肯定不能这样用了,相当于重复定义了.
用外部变量声明可以解决这个问题.
你可以在头文件中申明(加extern),在C文件中定义.
Q2:这是我的接收函数,但是当我发送ko时,收到两个o,发送ok时收到两个k,这是怎么回事呢.
#pragmavector=UART1RX_VECTOR__interruptvoidusart1_rx(void){unsignedj;//IFG2&=~URXIFG1;for(j=0;j>1);//左移一位}#pragmavector=TIMERA0_VECTOR//TA中断__interruptvoidTA_start(void){flag=1;//中断时间到,设置标志位}TA0的时钟选用0.
5M8分频,近似计数值63为1ms,使用连续计数方式.
A3:voiddata_send(unsignedcharsend){unsignedchari;for(i=0;i>1);//左移一位LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第16页共68页}}#pragmavector=TIMERA0_VECTOR//TA中断__interruptvoidTA_start(void){flag=1;//中断时间到,设置标志位}TACTL中的MC1、MC0为01值Q4:求msp43的pwm捕捉下降沿的程序.
A4:TACCTL2=CM1+CCIS_1+CAP;//同步捕获模式,下降沿捕获TACTL=TASSEL_2+MC_2+TACLR;//连续计数方式,时钟设置为SMCLKI/O口也需要设置为第二功能口,建议看usersguide和TI例程.
Q5:C文件LINKER后,报错Error[e46]:Udefinedexternal"send1_buff"referredinsys_evet(D:\sc1\Debug\Obj\sys_evet.
r43,请教如何可解决此问题,变量send1_buff在文件里已定义了extern.
A5:查看一下你的程序编译时先编译哪个文件,或在这个文件前先申明一下.
Q6::DINTMOV.
W#FWKEY+WRT,&FCTL1;Writebit=1MOV.
W#FWKEY+FSSEL0+FN0+FN1,&FCTL2MOV.
W#FWKEY,&FCTL3TESTBIT#BUSY,&FCTL3JNZTESTMOV.
WR14,0(R12)TEST1BIT#BUSY,&FCTL3JNZTEST1MOV.
W#FWKEY,&FCTL1MOV.
W#FWKEY+LOCK,&FCTL3;Lock=1EINTRET想保存信息,R12是地址,1080,R14是内容,但是通过按键改变参数后,INFO写入的确实0,而不是要保存的数据.
很奇怪.
为什么不管什么数据,到INFO里都是0A6:原因在于你只改变单个字,而FLASH是要整段擦除,然后在更改.
MOV.
W#FWKEY+FSSEL0+FN0+FN1,&FCTL2,flash擦写时钟也是很重要的,经分频后时钟应该在257-476KHz的频率范围,偏离值太大,容易引起擦写的失败.
Q7::为什么485程序只能单字节传输呢单片机经过232/485转换器接到电脑,用串口精灵调试的.
大家看看有什么问题啊#includevoidmain(void){WDTCTL=WDTPW+WDTHOLD;UCTL0&=~SWRST;UCTL0|=CHAR;LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第17页共68页UBR00=0X03;UBR10=0X00;UMCTL0=0X4A;UTCTL0|=SSEL0;ME1|=UTXE0+URXE0;IE1|=URXIE0;P3SEL|=0X30;P3DIR|=0x70;P3OUT&=~BIT6;_BIS_SR(LPM3_bits+GIE);//EnterLPM3w/interrupt}#pragmavector=UART0RX_VECTOR__interruptvoidusart0_rx(void){inti;P3OUT|=BIT6;while(!
(IFG1&UTXIFG0));//USART1TXbufferreadyTXBUF0=RXBUF0;//RXBUF1toTXBUF1for(i=0;i#includeLSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第20页共68页在msp430x14x.
h中已经对UART0RX_VECTOR进行审明了啊.
请问需要进行怎么修改A16:是IAR调试软件的问题,在IAR1.
26版和以下都是interrupt[UART0RX_VECTOR]voidUART0RX(void)的写法,以上都是#pragmavector=TIMERB0_VECTOR__interruptvoidTimer_B(void)的写法.
Q17:P1DIR=0x10;P1SEL=0x10;//p1.
4为SMCLKP2DIR=0x01;P2SEL=0x01;//P2.
0为ACLKP5DIR=0x10;P5SEL=0x10;//p5.
4为MCLK在设置好了时钟后,是不是能通过上面的语句在p1.
4,p2.
0,p5.
4口用示波器看到时钟信号呢但为什么没有看到而用示波器观察晶振是起振的.
A17:程序没有死循环,跑到最后就复位了.
原来的程序上加了语句:while(1);后当程序跑到这个空循环时,再用示波器测各个引脚时,就有aclk,mclk,sclk.
Q18:运用定时器A做定时,程序思想正确却无法执行,在tt==20的地方无法执行该怎么办#include#defineuintunsignedint#defineucharunsignedcharucharnum,tt;ucharta**e[]={0xc0,0xfc,0x24,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelay(uintz);voidmain(void){//WDTCTL=WDTPW+WDTHOLD;//StopwatchdogtimerWDTCTL=WDTPW+WDTHOLD;//StopWDTTACTL=TASSEL1+TACLR;//SMCLK,QINGCHUTARCCTL0=CCIE;//CCR0interruptena**edCCR0=40000;TACTL|=MC0;//P1DIR=0;P2DIR=0;//LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第21页共68页P1SEL=0;P2SEL=0;//P1DIR|=BIT0;P1DIR|=BIT1;P1DIR|=BIT2;P1DIR|=BIT3;P1DIR|=BIT4;P1DIR|=BIT5;P1DIR|=BIT6;P1DIR|=BIT7;//P2DIR|=BIT0;P2DIR|=BIT1;P2DIR|=BIT2;P2DIR|=BIT3;P2DIR|=BIT4;P2DIR|=BIT5;P2DIR|=BIT6;//P1OUT=0x00;while(1){就在此处不往下执行if(tt==20){tt=0;num++;P1OUT=ta**e[num];//dula=0;delay(1000);}}}voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}#pragmavector=TIMERA0_VECTOR__interruptvoidTimer_A(void)//interrupt[TIMERA0_VECTOR]viodTImerA_ISR(viod){CCR0=40000;LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第22页共68页tt++;//AddOffsettoCCR0}A18:1、你的定时器没有启动TimerA的初始化设置应该为:voidinit_TimerA(void){TACTL=MC_0+TACLR;//定时器暂停,定时器和输入分频器复位CCTL0=CCIE;//禁止捕获模式+选择比较模式+比较模式中断允许+OUT对应于输入状态CCR0=64000;//TACTL=TASSEL_2+ID_0+MC_1;//时钟源SMCLK,8M不分频,增记数模式,禁止定时器溢出中断,***启动定时器***}中断服务程序#pragmavector=TIMERA0_VECTOR//比较器/捕获器0中断服务程序__interruptvoidTimer_A(void){TACounter++;}2、注意在初始化你的TimerA之前,应该根据你的实际电路设置时.
3、注意开总中断允许_EINT();//这一句放在初始化完成后,while()语句前.
Q19:C语言写程序时候如何让单片机复位A19:对WDT或者是FLASH的口令写错都会导致单片机复位!
Q20:#includevoidmain(void){WDTCTL=WDTPW+WDTHOLD;//关狗P1DIR=0XFF;P1OUT=0X00;TACCR1=200;TACCTL1=CCIE;_EINT();//使能TACTL|=TASSEL_2+ID_2;//smclkTACTL|=MC_2;//连续LPM0;}#pragmavector=TIMERA1_VECTOR__interruptvoidtime(void){if(TAIV==0X02){LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第23页共68页P1OUT^=0X01;}}这样仿真时,进入中断,taiv=0;这是为什么按理说taiv=0x02A20:仿真的时因为jtag已经读过TAIV了,和你用程序是一样的效果.
读过就会复位.
Q21:问题:用430fg437开发,片内flash大小为32K,编译得到的d43文件有33K多,怎样优化程序尺寸的编程序时怎样估算占用flash的大小A21:用SIZE优化时,选MIDDLE比MAXIUM出错少.
只要C编程时变量分配时限定关键词用好,如用volatile限定变量,循环不会优化掉.
总之,对于程序大问题,先用middle,后用maxum,一定能省出几百或者1K以上的代码.
还有,优化时将inline前的勾去掉,别选它.
否则代码反而增大.
优化后如果某一模块的代码反而增加了,可选中该模块后单独对它选其他优化选项.
Q22:Error[e16]:SegmentCSTACK(size:0x50align:0x1)istoolongforsegmentdefinition.
Atleast0x4morebytesneeded.
Thepro**emoccurredwhileprocessingthesegmentplacementcommand"-Z(DATA)CSTACK+_STACK_SIZE#",whereatthemomentofplacementthe**aila**ememoryrangeswere"CODE:5B4-600"请问:这个错误是什么意思A22:stack设置太小,在option->generaloption->stack/heap设置stack/heap更大一点Q23:调试ADS1258,已经可以读寄存器了,SPI通信正常,可是现在遇到的问题是通过SPI对ADS1258的寄存器写数,读出来的数总是发的命令字,而不是我发的数据.
请高手指点一下.
程序如下:P5OUT&=~BIT0;IFG2&=~URXIFG1;//ClearflagU1TXBUF=0x65;//Sendaddresswhile(!
(IFG2&URXIFG1));//WaitforTXtofinishIFG2&=~URXIFG1;//ClearflagU1TXBUF=0x01;//LoaddataforTXafteraddrwhile(!
(IFG2&URXIFG1));//WaitforendofaddrTXi--);IFG2&=~URXIFG1;//ClearflagP5OUT|=BIT0希望寄存器能读出我写的数0x01可是现在读出来的数总是0x65,这是什么原因A23:这是SPI的特殊性,本次通讯输出到SL**E的数据,要到下一次SPI通讯时才能得到结果.
因此,在你的程序最后,再加三行语句进行一次SPI传输,就能得正确的ADS1258数据.
每传递一次数据发送一次时钟.
Q24:问题:高通滤波器的算法问题,要求实时性比较好,可是现在的方法之前有个系数是1/256,这样子用移位实现的话岂不是都为0了在滤波器程序中,系数的大小,对430的16位宽度来说,实在太小了.
A24:在滤波器程序中,系数的大小,对430的16位宽度来说,实在太小了.
解决办法是:对事先已算好的系数,扩大16,32,64,128.
.
.
.
.
.
.
.
等倍后,作为430计算用的常数,430计算出结果后,再缩小相应的倍数.
这种方法的优点是:只进行移位,甚至是取高8位或低8位,不用除法或乘法运算,结果的精度好.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第24页共68页Q25:C51中的XBYTE用430的C语言如何表达A25:430和51不一样,没有固定的数据线和地址线,都要自己用io去模拟.
Q26:三角函数用430单片机计算,有没有好的方法,有没有库函数可以直接用来计算的A26:TI提供过一个文件.
"FPP413.
exe",里面的.
S430文件的很全面的说明,包括程序内容,调用方法等.
用C语言,直接调用sin,cos,tan即可,只是代码量可能会迅速增大,速度也会明显收到影响如果是产生正弦波一类的应用,建议使用查表方式Q27:如何从430里读回hex文件A27:没有加密可以通过jtag可以读出,加密后就只能通过bsl读出了,bsl要密码的.
Q28:设计了一个15k的程序,在运行过程中偶尔会出现复位现象,开始以为是看门狗动作了,随后初始化时就关闭了看门狗,但是这种情况还是会发生,但是用USB仿真机全程仿真,就没有问题,不知道什么原因.
我的程序主要是实时测量,进行运算,数学计算的地方较多,程序中还有定时写flash、uart通信、两个外部中断处理、timeAtimeB定时器中断处理等,会不会是默认堆栈80过小,导致了复位(堆栈我一直没有更改过)最初我还以为晶振的干扰,对晶振的外壳做了接地处理,结果还是没有解决.
我用的是msp430F147A28:在程序中作循环,执行时间比较长.
若循环次数少,则改变的数组中个数少;若多加,两次循环改变的个数就多.
Q29:芯片为F149,用c写程序,复杂的公式怎么实现,比如:y=(a-0.
000012)^b,其中b=-0.
14778989013*10^(-4)Q29:指数运算是pow,不过整数次方,比如2、3、4,建议采用连乘,效率更高.
Q30:在用MSP430编程的过程中,想得到浮点数的整数和小数部分,不知道哪位有解决的办法A30:先将小数变成整数,在将其个位、十位、百位取出来!
Q31:子函数内调用了sprintf函数,定义了指针变量*s来访问格式化后的一整型变量的ASCII码:char*s;sprintf(s,"%-6u",a);但仿真后发现s指向了另一个全局变量,运行后全局变量的值就改变了,如何解决A31:指针S没初始化.
虽然你定义了一个指针,但是这个指针的地址是多少你没定义,编译过程中应该有警告的.
Q32:怎样用430编一个开4次方的程序A32:#include#include"math.
h"floatii,jj;voidmain(void){WDTCTL=WDTPW+WDTHOLD;jj=100;ii=sqrt(sqrt(jj));while(1);}Q33:IAR内嵌汇编是用asm("")语句,但我想请问如何在c和汇编直接传递函数,比如用寄存器做了一些运算,运算结果在R12,R13里,如何返回他们的值到c程序中呢LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第25页共68页A33:C语言与汇编语言混合使用有3中方式:1、内部函数;2、直接嵌入;3、调用汇编模块;调用内部函数:内部函数本身是由汇编语言实现的,所以调用内部函数本身就是在C语言中嵌入汇编语言,不过内部函数数量很少,只能实现特定的功能.
直接嵌入:使用_asm或asm扩展关键字,这种方法是用起来很简单,但是编译器只是简单的将汇编语句嵌入程序中,不考虑与前后语句是否匹配,因此有可能会造成不稳定,它有几条限制:编译器编译时使用不同的优化级别会忽略嵌入的汇编语句,或者不进行优化;一些汇编指令不能嵌入;不能访问局部变量;不能声明语句标号.
调用汇编模块:调用汇编模块时需注意以下3点:编写汇编模块时,必须严格遵从调用规则;必须在汇编模块中把函数声明为PU**IC;调用时,或者将汇编函数声明为extern,或者为汇编模块编写头文件,以便编译器可以找到函数的位置.
Q34:在做键盘程序时,遇到一个问题:4个按键K1---K4分别接到msp430的P1.
0---P1.
3,采用定时器每5mS中断扫描方式读取键值,K1要求按下弹起后执行相应的程序;K2要求长按2秒以上后每隔0.
5秒执行一次相应的操作.
这些如何实现A34:这样处理的:1、扫描到按键被按下后,在状态变量Keystate中设置所有被按下按键的状态标志"KEYDOWN";备份Keystate到Keystatemem;若所有按键的状态都是零,退出;若有按键被按下,则启动TA1两秒定时,并允许TA中断,退出.
2、下次扫描按键的时候,再次构建Keystate;比较Keystate和Keystatemem,判断哪些按键已经被放开;保持任然保持按下状态的所有按键的"KEYDOWN"标志并清除其"KEYUP"标志;清除已经被放开的且有"KEYDOWN"标志的按键的"KEYDOWN"标志,设置其"KEYUP"标志.
如果所有按键的状态都是"KEYUP"或零,则终止TA记时,禁止TA中断,退出.
3、一旦TA定时时间到,在TA中断服务程序中判定所有具有"KEYDOWN"标志的按键为"长按",清除其"KEYDOWN"标志并设置其"HOLDDOWN"标志;关闭TA计时器,并禁止TA中断,退出.
4、在主程序的键盘功能分析程序中,依照各按键的"KEYUP"、"HOLDDOWN"状态,分别进行相应的处理.
5、在所有循环处理的按键功能都被完成之后,清除以上所有标志和状态变量.
6、完毕.
Q35:用的是449的片子,要用定时器A产生200Hz的采样频率,定时器时钟才用SMCLK,为1M,下面是所有程序:#includevoidinit_TimerA(void);voidinit_ADC12(void);charadc_Flag=0;intnewValue;voidmain(void){LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第26页共68页intdatasign1=0,data_x1[500];WDTCTL=WDTHOLD+WDTPW;//停止看门狗_DINT();//关闭中断init_TimerA();init_ADC12();//初始化ADC12_EINT();//使能中断while(1){if(adc_Flag==1){adc_Flag=0;data_x1[datasign1]=newValue;datasign1++;}}}voidinit_ADC12(void){P6SEL|=0x01;//Ena**eA/DchannelA0ADC12CTL0&=~(ENC);//设置ENC为0,从而修改ADC12寄存器的值ADC12CTL0=ADC12ON+MSC;//TurnonADC12,setsamplingtimeADC12CTL1=SHP+CONSEQ_2+ADC12SSEL_1;//Usesamplingtimer,setmode,ADC12时钟源为MCLK.
ADC12IE=0x01;//Ena**eADC12IFG.
0ADC12MCTL0|=INCH_0+SREF_0;ADC12CTL0|=ENC;//Ena**econversions}voidinit_TimerA(void){FLL_CTL0|=XCAP14PF;//ConfigureloadcapsTACTL=TASSEL1+TACLR;//SMCLK,clearTARCCTL0=CCIE;//CCR0interruptena**edCCR0=5000;TACTL|=MC0;//StartTimer_ainupmode}#pragmavector=TIMERA0_VECTOR__interruptvoidTimer_A(void){ADC12CTL0&=~ENC;newValue=ADC12MEM0;adc_Flag=1;//指示有数据要显示ADC12CTL0|=ENC+ADC12SC;}LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第27页共68页问题是,程序进入到了中断程序后就跳不出来了,所以无法往下进行请问各位问题会出在哪呢A35:把ADCIE这句屏蔽掉,应该可以执行下句,此程序中断产生生不是TA中断,并且CCR0中断是自动清除的,产生中断的是ADC中断;由于配置ADC是多次采样单通道,并且把MSN打开,那么第一次J进入中断后将ADCSC打开ADC开始转换,完毕后自动又开始采样转换,反复,也就是说,在下一个TA中断来前其实ADC是一直反复采样转换也就是反复进入中断了.
根据你的意图,我建议你在ADC里面配置为单通道单次转换,并且触发源可以直接选择用TA不需要再ADCSC.
Q36:如何在IAR中建立C函数库文件A36:其实跟做普通C项目一样,没什么太多的差异.
只不过在option中选择Library即可.
一样可以分Group,在每个Group中可以包含多个文件.
Q37:#pragmavector=PORT1_VECTOR__interruptvoidPort1(){delay();//unsignedcharq0=0;if((KEYIFG&KEY0)==KEY0){KEYIFG&=~KEY0;//清除中断标志g+=1;if((KEYIFG&KEY1)==KEY1){//处理P1IN.
5中断//KEYIFG&=~KEY0;//清除中断标志KEYIFG&=~KEY1;//清除中断标志//KeyDown=KEY_P15;//记录按下的键值FLAG_KEY_3_5=1;//标识2个键同时按下.
次数为0标识没有同时按下2个键.
Num_KEY_3_5+=1;KeyZhi=5;//记录按下的键值//q0=1;}}elseif((KEYIFG&KEY1)==KEY1){//处理P1IN.
6中断KEYIFG&=~KEY1;//清除中断标志s+=1;//KeyDown=KEY_P16;//记录按下的键值//q0=1;}elseif((KEYIFG&KEY2)==KEY2){//处理P1IN.
7中断LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第28页共68页KEYIFG&=~KEY2;//清除中断标志z+=1;//KeyZhi=KEY_P17;//记录按下的键值//q0=1;}else{//其他干扰引起的中断,不进行处理,只清除中断标志KEYIFG=0;}//if(q0==1)//{//GoKey(0);//关闭键盘中断//KeyTime=0;//KeyCnt=0;//GotimeDfA(100);//打开定时器A//}//}voiddelay(){for(i=5000;i!
=0;i--);}请问各位,二键同时按下有时不响应,单键按下有时变量加2或3,不是加1,是不是延时有问题A37:最好不要在中断中有延时程序,这样会降低MCU的响应.
如果需要延时去抖动什么的,最好采用定时器,这样既提高了MCU的响应速度,又会降低供耗问题.
Q38:可不可以把常量地址赋给指针变量,如下:代码:constintabc;int*p=&abc;主要是想在abc的地址处通过擦写Flash写入东西.
我在IAR中报了个错,不知道是不是这个问题.
A38:Flash擦除肯定是段擦除的,但是在擦除的时候需要指定段地址.
代码:#pragmalocation="INFOA"constintxxx=0;constintabc=123;int*p=&abc;p++;如上面程序,常量abc存放在信息段A中,用来保存设置参数.
当在应用程序中改变此参数值时,需要整段擦除信息段A,然后在常量abc的地址处写入其它值.
现在的问题是如何把常量abc的地址放到指针变量里去像上面代码中做的话,会报一个错误,意思是constint*型的值不能用来初始化int*型的变量,可以看到,其中p是int*型的.
将代码改成以下就不报错了代码:LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第29页共68页#pragmalocation="INFOA"constintxxx=0;constintabc=123;constint*p=&abc;p++;其实这个问题是"常量指针"和"指针常量"的问题.
我开始担心用const修饰int*p后会是p变为常量,而不能修改,就是p++处会报错后来查了下书,指针常量(指针本身是常量)定义的方法如下:代码:constint*constp=&abc;上面第二个const才是是指针变为常量的因素.
第一个const表示常量指针(指向常量的指针)所以可以看出,第二段代码是正确的方法.
其实还有一种方法可以解决第一段代码中的报错问题代码:#pragmalocation="INFOA"constintxxx=0;constintabc=123;int*p=(int*)&abc;p++;如上,采用强制类型转换的方法也可以.
Q39:要把定义的常量放在代码区,该怎么定义啊!
A39:const比如:constucharNumber[]={/*--文字:0--*//*--宋体12;此字体下对应的点阵为:宽x高=8x16--*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0}一般液晶字模就这样,放到程序存储区,避免占内存Q40:1、在头文件msp430x44x.
h中,宏定义#defineTASSEL1(0x0200),后面的数字0x0200为干什么要加上括号();2.
汇编中,BIC#OscOff,SR为什么要加上#,OscOff应该理解为标号不是吗;3.
在头文件中#defineBASICTIMER_VECTOR(0*2u),括号中的"u"代表什么A40:()起保护作用2,OscOff因该有地方定义过3,u应该是无符号数Q41:请问IAR中CLIB和DLIB区别问题:请问IAR中CLIB和DLIB区别A11:DLIB是一个完整支持C标准的库文件,提供IEEE754浮点数计算库CLIB是一个相对精简的库文件,不完全支持C语言标准中队对库文件的要求,没有浮点库的支持,能够满足一般的需求.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第30页共68页Q42:这个提示是什么意思Libraryconfigurationfileisnotspecified.
Use--dlib_config,pleaseseethecompilerreferenceguidefordetails.
A42:没有指定库文件,这个提示已经告诉你使用DLIB库了,你就设置一下就可以了.
Q43:printf()函数是不是将需要打印的数据送到打印机啊如果是他又是怎样让外围的硬件与打印机联系起来的呢打印机的起始信号与应答信号他都能处理吗A43:单片机编程中,通常使用printf(.
.
.
)不是将数据写入打印机中,而是将数据进行格式化处理.
但是更多的是使用sprintf(.
.
.
.
),将格式化的数据写入函数指定的字符串中.
因为printf(.
.
.
)函数在运行时需要调用putchar(intvalue)函数,这是一个将字符写到"标准输出设备"的函数,若你想将数据写入特定的打印机,如微型打印机(在单片机中运行,而非windows中运行),那必须修改putchar(.
.
.
.
)函数的原程序putchar.
c以满足在单片机中对该打印机的起始信号、应答信号、字符点阵转换等工作进行处理.
不过一般微型打印机厂家都提供相应的驱动程序供用户使用,但对于特殊应用还是需要编程的.
sprintf(.
.
.
.
)的使用与printf(.
.
.
)完全相同,不同的是在sprintf(.
.
.
.
)中第一个形参是输出目标的字符串指针.
而printf(.
.
.
)函数没有这个形参,而是使用putchar(.
.
.
.
)函数指定的标准输出设备作为输出目标.
另外在运行时sprintf(.
.
.
.
)不调用putchar(.
.
.
.
)函数.
Q44:我用F2012的单片机typedefstruct{U32Band_Low;//BandlowlimitU32Band_High;//BandhighlimitU32Dem_Freq;//videoIFU32Snd_Carr;//soundcarrierfrequencyU32Hsync;//Hsync}st_TV_Region;#defineGHz1000000000#defineMHz1000000#defineKHz1000#defineHz1程序中初始化的时候constst_TV_Regionc_Tv_Region[]={/*LowLimit,HighLimit,DemFreq,SndCarrier,Hsync*//*PALB/G*/{44*MHz,862*MHz,9*MHz,5500*KHz,15625*Hz},/*PALD/K*/{44*MHz,862*MHz,9*MHz,6500*KHz,15625*Hz},/*NTSC-M*/{56*MHz,806*MHz,7*MHz,4500*KHz,15750*Hz},};5500*KHZ6500*KHZ4500*KHZ的地方提示警告Warning[Pe061]:integeroperationresultisoutofrange如果550065004500后分别加上u,就不会报错如果直接写成5500000,也不会出错.
请问是怎么会使A44:在IAR中#define的值是根据后面的值来确定长度的1000它就以int型来表示了5500*1000肯定就超过int范围了问题:关键我的数据类型是uisignedlong类型啊LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第31页共68页那请问如果我要保持个写法,应该怎么改.
谢谢如果5500后面加个u,会对程序有影响么回复:没有其它方法了,只能如下:constst_TV_Regionc_Tv_Region[]={/*LowLimit,HighLimit,DemFreq,SndCarrier,Hsync*//*PALB/G*/{(U32)44*MHz,(U32)862*MHz,(U32)9*MHz,(U32)5500*KHz,(U32)15625*Hz},/*PALD/K*/{(U32)44*MHz,(U32)862*MHz,(U32)9*MHz,(U32)6500*KHz,(U32)15625*Hz},/*NTSC-M*/{(U32)56*MHz,(U32)806*MHz,(U32)7*MHz,(U32)4500*KHz,(U32)15750*Hz}};Q45:问题:在430f149上运行uCOS-II操作系统刚开始的时候没什么问题,当需要做一个功能函数的时候编译没有错误但是在运行仿真的时候老是跳入DEBUG中提示:thestack'stack'isfilledto100%.
以为是堆栈益处调整堆栈大小以后编译出现错误.
Thepro**emoccurredwhileprocessingthesegmentplacementcommand"-Z(DATA)CSTACK+_STACK_SIZE#",whereatthemomentofplacementthe**aila**ememoryrangeswere"CODE:29a-2ff"Reservedrangesrelevanttothisplacement:29a-2ffCSTACK请问遇到过这个问题没有有什么办法能解决呢A45:可能是局部变量过大造成的,也可能是设置xcl文件造成的,总觉得程序不可能占用2k的RAM,看CODE:29a-2ff好象是你设置了xcl文件.
Q46:以前用的1612的DCO是由内部RC振荡器产生的频率.
4618的DCO频率是由低频振荡器的N+1倍决定的.
不知道这样理解对不对.
也就是说4618中,如果要使MCLK,SMCLK的频率来自DCO,那就必须在XIN.
XOUT处接表振.
如果XIN.
XOUT处不接.
是不是DCO就没有频率输出.
A46:DCO是内置振荡器,可以使用FLL模块对其进行标定,标定的基准就是外接的手表晶振,当没有外接手表晶振时,也可以使用DCO来做时钟.
Q47:如何在程序中定义位操作:如sbitpinINT=P3^2;在msp430中能否实现这种操作,或有无可替找的方法A47:不能像上面这样定义,可用如下:#defineLED_ONP3OUT|=BIT2#defineLED_OFFP3OUT&=~BIT2程序中就直接使用LED_ONLED_OFF就和位操作一样了Q48:有一段程序:constucharHELLO[]="HELLO\n";//因为这些字符是只读的,所以定义成constvoidfun1(uchar*str)//函数说明.
.
.
.
.
main(){.
.
.
.
.
.
fun1(HELLO);.
.
.
.
.
.
.
}voidfun1(uchar*str)LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第32页共68页}结果在编译时在调用fun1时出现functionargumentimcompati**ewithitsdeclaration,将const换成static就OK了,函数就能正常调用.
是const类型的数组名不能作为参数传递吗,字符串数据是不是存在程序存储器中了,可用const定义时,我在程序中写如str1=HELLO[3],编译和运行也没问题阿,是不是与MSP430的寻址方法有关,请大家赐教.
A48:用const类型的数组名是可以作为参数传递,但必须进行强制类型转换,如constucharHELLO[]="HELLO\n";//因为这些字符是只读的,所以定义成constvoidfun1(uchar*str)//函数说明.
.
.
.
.
main(){.
.
.
.
.
.
fun1((uchar*str)HELLO);.
.
.
.
.
.
.
}voidfun1(uchar*str)}Q49:问题:譬如在C程序中有如下一个子程序:voidFlash(void0{FlashBegin:FlashEnd:}在汇编程序中,想将FlashBegin与FlashEnd之间的那段程序拷贝到RAM中去.
目前我是这样实现的:先将整个程序编译,找出该段程序所在存储空间的起始地址,然后在汇编程序中用立即数的方式直接表示这两个地址.
这样做有个弊端,就是在程序进行修改之后,该段程序的起始地址会改变,因此,每次都需在汇编程序中修改这两个地址值,一不留神就会忘记,导致严重的错误.
现在我想用FlashBegin与FlashEnd这两个标号来直接表示地址,请问在汇编程序中该如何引用A49:试试看!
;在汇编中加入:;externcalled_by_asm;rsegcodecall#called_by_asmendLSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第33页共68页//C中可以是:voidcalled_by_asm(void){}Q50:想把一份表格存放在代码区,用的是C语言,不知道有什么方法A50:constunsignedcharTa**e[LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第34页共68页第四章:工作模式及功耗类Q1:采用MSP430F2012,用定时器A中断唤醒,定时器的时钟选择为ACLK,外部接32.
768KHZ晶振,LPM3模式可以正常被定时器中断唤醒.
因目前IO引脚不够用,想去掉外部的32.
768KHZ晶振,当用利尔达的USBJTAG仿真器仿真时LPM3模式也能被定时器中断唤醒,但感觉每次唤醒的时间不一致,但是若不连仿真器,转为电源供电就完全不能被唤醒,不知为什么关于ACLK时钟是否一定要接一个32.
768的外部晶振为了节省功耗必须用休眠模式,如果没有外部的32.
768KHZ晶振是不是就唤不醒单片机A1:ACLK时钟的来源可以是VLOCLK或者是LFXT1CLK所以不一定要接外部晶振而在LPM3模式下ACLK是活动的,MCLK和SMCLK被禁止所以不是没有外部的32.
768KHZ就唤不醒单片机.
需要你正确设置ACLK的来源.
Q2:1,MSP430进入LP模式后,CPU停止运行,那么,进入中断执行退出后,由于SR的恢复,导致还处于LP模式,是否意味着,CPU在退出中断后立即停止了呢2,也就是说,进入LP模式后,要让非中断流程运行的话,只能在中断退出前把保存在堆栈里面的SR修改了3,由于中断自动恢复保存的寄存器,要想在中断程序里面修改堆栈里面的保存的SR,只能用汇编了A2:1、是的.
2、是的.
3、是的.
_BIS_SR_IRQ()以及_BIC_SR_IRQ()函数可用.
Q3:您好,我现在有个程序进入LPM3后拿万用表测电流在40uA左右,不是的datasheet里说的小于2uA.
万用表2mA档串接在电池和VCC之间.
甚至于我写了最基本的初始化函数和main函数如下,测试电流值仍然在40多uA.
我想知道如何才能准确测得LPM3下的电流,或者说是否万用表本身有影响因为我们的程序要求有至少5年电池寿命,用的125mA的CR1632,需要耗电在2.
8uA下才行.
A3:我和你做的东西是差不多的,也用的是F201X或F21X1的片子,所以也测量过这个,对这个经验我有这几方面:1、万用表的问题:有些万用表最小是2mA档,根据测量仪器的特性,接近满量程时的测量数据较准确,所以2mA档测量2uA的电流时,相差1000倍,极不精确.
我测量时使用的是一块带有200uA档的DT830数字表,实测LPM3下只有0.
7uA,与F201X手册上标注一致.
2、湿度与PCB防潮问题:如果是实验板,因为上边没有阻焊膜,很容易受潮造成板上漏电,所以这种低功耗的东西一定要密封好,建议成品直接用树脂或是胶封起来,哪怕是热熔胶,也比暴露在空气中强.
我测试的时候,就因为对着板子喘了口气,就发现表上电流示数开始变大了——这个电流实在是太小了,小到不能忽视任何干扰了.
另外,要是手摸了板上子特别是电源两端的话,这个直接会造成几十到几百微安的电流,所以用手拿着板子测是极不科学的,要是不拿板子表笔不好扎的话,建议去电子商场买一对勾夹子,我买的1.
5一个,3块钱一对.
勾好以后把板子悬空放着最好.
3、电路内的损耗电流:尤其是RC方式的SLOPE,要想省电就必须严格控制电容的容量,越大越费电,或是说,如果你的电话容有余量的话,就要严格控制充电时间,否则充的时间长了,也一样会发生耗电增加的情况.
最注意的就是,不要充上电之后去睡,醒了再放电检测,那样因为漏电的关系,损耗最大,哪怕你的电容容量很小也不行.
4、初始化的选择:初始化的时候,一定要把不用的东西全关掉,包括IO口全置为输出,并输出为低电平,而且不要选择REN,或是像楼主的程序那样,REN置0.
建议的初始化就是所有的SEL=0,REN=0,DIR=0FFH,OUT=0.
像楼主现在的初始化把P1SEL置了三位,那样就把那些模块一直选通了,可能会增加耗电.
最好是模LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第35页共68页块在使用前就不打开.
当然如果为了利用模块的高阻性能而常开对应的比较器或ADC端口的话,建议置一下对应端口的CAPD,这样可以进一步的减少寄生电流的产生.
Q4:问CC2500系列和nRF2401比较,功耗哪个更低A4:CC2500和nRF2401的datasheet,上很明显有PowerDownmode模式下的一个功耗:900nA和1uA.
而且功耗这块的算法,是看平均的功耗才为准.
.
这就主要考虑到WOR模式.
.
.
.
.
Q5:#include#includeintmain(){//StopwatchdogtimertopreventtimeoutresetWDTCTL=WDTPW+WDTHOLD;//initclockinit_clk();init_io();LPM0;while(1);}Error[Pe020]:identifier"_BIS_SR"isundefined以上程序为什么会出错直接给SR赋值也不成,并且到头文件中也没找到SR的定义,这是出了什么问题呢TA0的时钟选用0.
5M8分频,近似计数值63为1ms,使用连续计数方式.
A5:将头文件改成#include#include#include即可正常运行.
Q6:芯片是msp430F413,外围部件什么都没有接,只有一个32768的晶振,和芯片上电复位的几个电阻和电容,四个给段式液晶模块分压的1M电阻,再就是JTAG接口了,再没有任何东西了,没用的IO口都是悬空的,软件上都配成输出状态了,软件如下:voidInit(void){P6DIR=0x00;P6DIR|=BIT7;//P6DIR|=BIT6;//P6DIR|=BIT4;//P6DIR|=BIT5;//P6DIR|=BIT3;//P6DIR|=BIT0;//P6DIR|=BIT1;//P6DIR|=BIT2;//P3DIR|=BIT0;//空闲引脚,置为输出状态P3DIR|=BIT1;//空闲引脚,置为输出状态P2DIR|=BIT2;//空闲引脚,置为输出状态LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第36页共68页P2DIR|=BIT3;//空闲引脚,置为输出状态P2DIR|=BIT4;//空闲引脚,置为输出状态P2DIR|=BIT5;//空闲引脚,置为输出状态P2DIR|=BIT6;//空闲引脚,置为输出状态P2DIR|=BIT7;//空闲引脚,置为输出状态P2DIR|=BIT0;//空闲引脚,置为输出状态P2DIR|=BIT1;//空闲引脚,置为输出状态P6SEL=0;P1DIR|=BIT0;P1DIR|=BIT1;P1DIR|=BIT2;}voidmain(void){WDTCTL=WDTPW+WDTHOLD;//禁止看门狗Init();//配置空闲管脚为输出状态_EINT();LPM4;//模式4_NOP();_EINT();//允许中断delay1ms(1000);while(1);}为啥低功耗电流怎么这么大,应该是1uA左右才对A6:1、CMOS电路的电流消耗主要发生在CMOS管状态翻转的时刻.
2、设置成输入后,处于高阻状态的输入开关会发生未知的状态翻转,从而消耗电流.
3、设置成输出后,无论是上拉还是下拉,都会消耗电流.
4、建议普通I/O口设置成输出,并且悬空;或者设置成输入,并且上拉或下拉.
Q7:_BIS_SR(LPM3_bits);__bic_SR_register_on_exit(LPM3_bits),我看一些资料这两个函数都能进入到低功耗,但是第二个只能在中断程序中使用,第一个使用后程序还是在运行,说明一下两个的区别A7:前面是进入低功耗,后面的是退出低功耗.
Q8:低功耗设计中430接CMOS器件要注意A8:在低功耗产品设计中,当430的i/o口与CMOS器件接口时,比如LCD之类的,为了省电,LCD间歇供电,当LCD关断时,与之相连的430的i/o口一定要设置为输入口或者设置为输出为1.
否则LCD内部cmos器件的I/O口通过二极管导到其VCC上,这样MCU的电流变大了,功耗变的更大了.
Q9:程序总是不正确执行,运行就出现下述错误:CPUisOFF(LowPowerMode)andinterruptsaredisa**ed!
cannotexcuteStep/go到底是怎么回事看了cpu寄存器中cpuoff=1的,但没有设置低功耗模式呀A9:查下晶振是否正常;程序不能正常运行是一步都不能走么如果只是某个位置,看看程序对外围控制是否会让时钟或者电源受到影响;再次确认是否真的没有设置低功耗,注意看低功耗的宏定义.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第37页共68页Q10:当CPU关闭后,在中断函数里面的计算,比如全局变量i的累加等计算是由谁来执行的呢为什么CPU关闭后还可以处理很多计算,赋值,判断等指令呢A10:在中断里CPU是处于ACTIVE模式的,进入中断后,DCO会自动起震,430退出低功耗模式.
Q11:这个设计,功耗如何才能降得很低用F437由于设计中有时钟功能,用ACLK产生所要的秒信号,所以系统不能断电,因此只能进入LPM3低功耗状态.
而且有些数据要保存在RAM里面的,又这个仪器是要测信号的,因此要一个8M的晶振,还有段码LCD.
想问如何设计才能达到最低功耗要求呢现在的思路是:一个专门的按键,按下关(进入睡眠),再按一次开(唤醒),但测得睡眠时的功耗有3MA左右.
,这个外围是两个MCP6002运放,一个232,一个红外芯片.
是不是进入LP3M的时候,要把所有的外围模块都关了的进入低功耗前把外部晶振关闭,是否会变成默认的内部晶振呢这样能降不少功耗吧定时器进入停止模式LCD关闭电压AD关闭还有什么可以降低功耗的还要问下:做手持产品,外围的芯片是否都把它断电的呢用MOSFT管吗可否直接用单片机IO口来供芯片VCC呢不需要时就把IO口改变就行了这里工作时有6MA,LP3M时有3MA,这样电池也用不了多久了.
A11:进入低功耗前把所有能关的电源全关掉.
IO口供电只能提供很小的电流,除非你供电很小,否则你还是采用MOS管或者其它开关进行控制.
Q12:很简单的一个问题.
430在低功耗的时候,闲置的口线应该是输入还是输出A12:不用的I/O口设置为输入时接地,或者设置为输出时悬空.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第38页共68页第五章:复位系统类Q1:用的msp430f437,用到了12路ad通道测量电压,利用flash信息段存储PT变比,id号,电压计算系数等装置参数,精度校准后参数写入flash信息段保存,可以比较准的测量工频电压,但是现在我在这个基础上加入了温度补偿程序,即增加一个ad通道利用430的温度传感器测温,结果平时运行正常,但是在校准精度时(利用uart通信校准,9600bps)有时候就会出现复位情况,不是每次都这样.
我用两个程序作比较,都含有flash写操作(校准后肯定要写入msp的flash信息段保存参数),区别在于:后面一个程序多了1个AD通道采集温度,于是也多了几个变量(static变量,全局变量),这个两个程序就一个不复位,一个复位,我怀疑是我的堆栈什么的设小了,不知道有没道理.
我用的IAR3.
41,编译后下面说:xxxxcode,xxxxdata,(80absolute),不明白什么意思然后我jtag调试时,设置断点后在断点处暂停后下面指出:thestackisfilledto100%(80bytesusedoutof80),thewarningthreshholdissetto90%,这个有什么影响吗另外,用flash保存参数感觉会影响中断执行(毕竟flash写操作要关闭中断的),导致我的led不是等间隔定时轮询显示(我的led显示靠1ms中断来进行段选),所以会有明暗变化.
请问有什么好方法改善吗A1:知道你问题所在了,你用的是默认80BITS堆栈,而你写FLASH时是不是有个大数组临时变量呀你在选项里把堆栈设大点就没事了!
LED你可用静态显示!
Q2:应用背景:仪表做老化试验,需要周期性的上电工作.
比如,加电源-〉工作10秒钟-〉断电-〉停止10秒钟-〉再上电,周期重复.
单片机使用看门狗,看门狗周期1000ms,保证正确清除看门狗.
现象:单片机上电后有时不能初始化,根本不能运行程序A2:1,请使用外部看门狗!
2,检查你的电路电源,是不是使用了大容量的电容,造成复位有问题.
这2种方法都不错,有些电路掉电10秒钟后,单片机仍然处在有效工作电压,Q3:请问msp430怎么手动复位啊是不是连到RST/NMI上但是这个脚不是和JTAG连吗我看到一些资料上说复位的话还要上拉电阻或者复位电路.
A3:JTAG功能只在下载程序时候使用,正常工作中RST可以连接一个按键,按下按键实现430手动复位.
上拉电阻是上电复位用的,手工复位一个BUTTON就行了.
MSP430单片机低电平复位.
Q4:一个产品在做瞬时通断电试验时,发现有部分样机有死机现象,试验是这样的:对40台样机,通电几秒钟,再断电几秒钟,反复的上下电,断电的时间分别设为1S--10S,发现有4台样机,在不同的断电时间,再上电后,不能启动,复位的看门狗(706),不断的有复位信号,但是样机不再工作了.
除非断电将149的电源电压降为0,再上电才能工作.
发现死机的149的电压降到为0.
X伏时,再上电,就死机了,可重复发生.
本产品不带电池.
该怎么办A4:由于外部电容的影响,几秒钟的断电,也许不可能让单片机完全停止工作.
建议使用复位芯片.
Q5:上电复位和硬件看门狗复位有什么区别吗,在程序里将两者分开,请问有办法将两者分开吗A5:上电复位时,内存被清零或为任意值,看门狗清零时并没有断电,内存里的原有信息被保留,同时上电复位无法通过标志位来判别,看门狗复位才可以通过WDTIFG来判别.
同时注意RESET之后:1、判断有无复位标志,若有,则为WDT复位;若无,则为上电复位,并且设置复位标志.
手动按键复位也同此理.
2、保证复位标志在复位程序中不被清除.
汇编好办,那是自己在控制RAM清除程序,C呢,就要注意了.
3、要注意快速断电/上电的问题.
处理不好的话,不但RAM中原先的内容有可能还存在,而且MCU复位很可能会失败LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第39页共68页Q6:用FG4618做了一个工程,本片子有8K的RAM,,定义的全局数组变量还不到4K,发现编译完成后下载程序,调试界面不能复位(IAR编译器),只要将全局数组变量减小定义,这个问题就没有了,这是为什么A6:RAM并不只是全局变量占用,包括进入中断及局部变量都需要分配ram空间,这会导致在某些时段RAM空间不够.
Q7:用msp430f2012需不需要复位电阻和复位电容因为我发现TI的EZ430开发工具上是没有复位电路的.
A7:查下晶振是否正常;程序不能正常运行是一步都不能走么如果只是某个位置,看看程序对外围控制是否会让时钟或者电源受到影响;再次确认是否真的没有设置低功耗,注意看低功耗的宏定义.
Q8:当CPU关闭后,在中断函数里面的计算,比如全局变量i的累加等计算是由谁来执行的呢为什么CPU关闭后还可以处理很多计算,赋值,判断等指令呢A8:在中断里CPU是处于ACTIVE模式的,进入中断后,DCO会自动起震,430退出低功耗模式.
Q9:软件可不可以自使MCUPOR(RST)A9:PoR是指poweronreset;只能由reset脚或者svs硬件产生.
PUC是指powerupclear,多种情况可以生成.
具体参考user'sguide.
Q10:用MSP430F149做项目,但ROM写满后换成2418的(116K)的片子,编译软件用的是IAR4.
11B版本的,写进去后,原来IIC通信的都不行了,用示波器看IIC的时钟和数据波形都有,从24C512里就是读不出数据(在149里正常的);还遇到另一个问题:因为我这产品有时间显示,用的是外部2S的信号输入,有时候4分钟自动复位一次(很有规律),有时候无规律的自动复位.
再者个人认为2系列的没有1系列的稳定抗干扰能力强.
请发表看法A10:首先纠正一个观点,2系列的稳定性要好与1系列.
再者,从149换到2418,时钟上要做出一些调整,具体请参照用户指南和数据手册.
很有规律的出现复位,建议用最小系统检测程序是否有误,或者外接电路的不正当操作.
无规律的自动复位,请检查供电是否稳定,因2系列多了BOR模块,多了复位的触发源.
小提示:430的I/O口单个供电能力最高可达到15mA,但是整个芯片的总供电能力只有100mA左右.
Q11:用IAR进行C语言编程,请问如果定义全局变量并赋给初始值,在main函数中不再赋值,在上电复位后是怎么被赋的值啊430在上电后进入main函数之前都做了些什么操作啊A11:应该是按全局变量那样定义,你单步调试一下,看看该变量的值有没有变.
可以看IAR中编译后的汇编代码是从CSTART_END开始的,可以在CSTART中设置断点,观察到如果设置了全局变量并且赋了初值,则IAR编译器会吧初值定义到FLASH空间中,在CSTART中在把FLASH中的初值复制到全局变量的RAM中的,所以对全局变量的赋值会占用FLASH空间,对于小容量的FLASH芯片,如2011等,要尽量的少用这种定义方法.
Q12:用msp430f149,用的是IAR,程序在用仿真器仿真的时候能正常运行,但是停止仿真,去掉仿真器,再重新上电的时候就不能正常运行了,请问这是怎么回事啊A12:1、你先确定,重新上电后单片机有没有复位运行.
可以加一个LED做为标志,如果单片机跑起来,让这个LED不停的闪;如果没有,就检查复位电路.
2、停止仿真是会出现程序停止的现象,手动将RST与地短接复位可以恢复.
但只有部分型号的芯片会有这个问题,比如149.
.
开始仿真也会出现程序烧不进的现象,大部分时候也可以通过手动复位解决;3、最终检查出是复位问题.
Q13:运行到断点,程序就复位,不能停在断点处,跟程序量比较大有关系吗请问是什么原因LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第40页共68页A13:1、因为430单片机看门狗复位时间默认为32ms,如果你的程序在断点前的执行时间大于32ms,当然不能运行到断点,还有如果你的程序自身编写有问题,比如通讯数据过多和AD采样时间太长,以及还有可能有死循环,都会导致程序断点不停.
2、如果看门狗是关的,那么你可以检查下,在程序运行到断点前是不是把某个中断打开了,在运行到这个断点前,该中断产生要进入中断;但是有可能你的中断向量是否写对,写错程序会跑飞,你可以看下.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第41页共68页第六章:看门狗及定时器类Q1.
定时器两个中断TAIE和CCIE,有什么区别两个中断的中断向量一样吗A1:TAIE和CCIE指的是不同事件.
TAIE指TAR计数器溢出,从65535到0的变化,由TAIFG引起的.
CCIE指捕获到相应信号(捕获模式下);定时时间到(比较模式下).
由CCIFG引起的.
两个中断的中断向量不一样,TAIFG一般进TIMERA1_VECTOR;CCIFG的话要看用的是哪个定时器如果是CCR0的话就进TIMERA0_VECTOR,如果是CCR1,CCR2……则进TIMERA1_VECTOR.
(中断向量的写法因器件不同而有所不同)Q2:用的msp430f1481,奇怪的是定时器TA能进中断,但中断标志一直存在,因此程序老在中断中跑,我用的是8M晶振,XT2ON.
A2:你最好说明是哪个标志位没有被清0.
没有设置相应的中断使能,是不会引起中断发生的;中断频率太快,在调试状态中,刚把中断标志清除,又有一个新的中断产生了,所以给人的错觉是清不掉Q3.
芯片用的是MSP430F447,从P1.
2口输入外部脉冲,我用TIMEB定时,Port1中断触发的,程序干不了别的,光中断了,程序好像也进不到定时中断里去.
A3:如上所述分析,可能是:1、MCLK可能过低,来不及处理指令2、TB的中断服务程序太长,所以光中断了,其实是中断服务程序运行时间太长了.
3、定时时间内的脉冲个数,如果脉冲频率很高,本来就是在不停的进入中断,如果频率高到一定程程度之后,都不用如不用中断,直接去判定标志位,因为进出中断也耗时间的.
Q4.
用F149的定时器B的捕捉功能,遇到问题,在等待捕捉时,读取TBR的值总是随机数.
A4:TBR是一直再跑的,看TBCCRx.
因为捕获事件发生时,硬件会自动把TBR的值保存到TBCCRx中.
Q5:想输出PWM,在中断响应后能改变PWM的频率吗A5:调整相应的定时器配置,PWM的频率和占空比都是可以改变的,不过周期频率一般都是由CCR0据顶的.
Q6:timeA定时器输出模块中EQUx和EQU0有什么区别它们有什么用A6:捕获/比较器在比较模式时设置EQUX信号有差别:当TAR的值大于或等于CCR0的中的数字时,EQUO=1当TAR的值等于相应的CCR1或CCR2的值时,EQU1=1或EQU2=1EQUx和EQU0它们是用来控制输出单元的,软件中可以不用设置,由硬件自动触发Q7.
关于F2274的I/O口中断的问题希望通过set或者clearP1IES可以设置P1口在上升沿时触发中断还LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第42页共68页是下降沿时中断,能不能搞成一个电平触发的如高电平中断或低电平中断A7::430的I/O口中断都是沿触发的,没有51的电平触发模式.
不过你可以在I/O口中断服务程序里查询电平状态,如果不是你期望的电平出现了,才清I/O口中断标志,让中断程序退出.
Q8.
在中断能使用全局变量问题:在用全局变量时,连接时提示错误:Error[e46]:Undefinedexternal"cstart_init_copy"referredinmain(C:\DocumentsandSettings\homex\桌面\comsp430\Debug\Obj\main.
r43)Error[e46]:Undefinedexternal"cstart_init_zero"referredinmain(C:\DocumentsandSettings\homex\桌面\comsp430\Debug\Obj\main.
r43)Error[e46]:Undefinedexternal"ShiftRight32u_4"referredinmain(C:\DocumentsandSettings\homex\桌面\comsp430\Debug\Obj\main.
r43)Error[e46]:Undefinedexternal"Mul32"referredinmain(C:\DocumentsandSettings\homex\桌面\comsp430\Debug\Obj\main.
r43)Error[e46]:Undefinedexternal"DivMod32s"referredinmain(C:\DocumentsandSettings\homex\桌面\comsp430\Debug\Obj\main.
r43)Error[e46]:Undefinedexternal"DivMod16s"referredinmain(C:\DocumentsandSettings\homex\桌面\comsp430\Debug\Obj\main.
r43)A8:这种情况一般是多个C文件都申明了同一变量名造成的,把所用的变量在中断所在的文件中做外部变量说明即可.
另外建议不要把项目文件夹放在桌面上.
Q9:timerA不能进入中断检查的一般思路A9:不能进入中断一般检查思路:1:是否开所属模块中断和总中断2:所属模块所用时钟是否有效3:触发条件成立没标志位是否置位.
Q10.
MSP430F149关于时钟的问题问题:时钟采用8MHz,那么执行for(i=0;iregister)该语句执行完毕之后记下这时的CYCLECOUNTER,2者相减,在乘以MCLK的周期.
若是采用ADC12自带的时钟,在RC振荡器在5MHz,且不分频:ADC12采样是12个ADC12CLK外加一个ADC12CLK用来把结果存到ADC12MEM.
所以时间t=13*1/5M秒.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第43页共68页Q11:430F149,中TACTL中SCCI是什么功能A11:Latchedcapturesignal(read)处于捕获模式时,接入的信号状态0/1.
Q12:怎么利用F155实现计数脉冲功能将一个矩形脉冲序列送入单片机计算其脉冲数并根据脉冲数调节其增益.
怎么实现呢主要是计算脉冲数.
用的高速晶振是8M的.
我先设置TA的CCR2=10000.
但是脉冲来之后每个高电平都要触发中断,还有有每次中断为什么都要1ms到1s啊.
小于这个不行吗A12:1)用定时器做的话,也可以将定时器设置在捕获状态下,如上升沿捕获,当定时器捕获到上升沿时会产生一次中断,此时定时器会记录当前计数器的值到CCRX,您可以把这个值放到指定的变量里,两次中断的记数差值就是你实际计数个数,这样你可以根据你计数个数调整增益,另外如果要计算时间的话只要将个数乘以定时器时钟就可以.
2)用捕获的方式就不用设置1mS~1S啦.
你可以把8MHZ当TIMERA时钟,最小可以到1/8uS,另外由于1MHZ捕获信号与8MHZ比较接近,如果采用两次捕获计算一个脉冲宽度精度不高,可以多采几次,如100次求得平均,这样精度会高很多.
Q13:MSP430F2101和MSP430F1101A同时用了定时器A中断,它们的头文件以及各引脚使用有什么不同各项是可兼容问题:产品(吸尘器控制器)本来用的是芯片MSP430F1101A,在使用过程中发现因电压不稳定会导致其死机.
于是打算换成具有BOR功能的MSP430F2101.
当更换了头文件后,把用于MSP430F1101A的代码烧录到MSP430F2101中,发现无法进入定时器A中断程序.
我怀疑MSP430F2101和MSP430F1101A的定时器A有所不同,但经过阅读手册,发现并没有什么不同,使用了相同的晶振,MSP430F2101和MSP4301101A的引脚是兼容的.
那问题是什么呢A13:MSP430F2101和MSP430F1101A的PIN5和PIN6引脚虽然是兼容的,但是不完全兼容:前者的引脚除了可外接晶振外,还可作为一般的I/O口和比较器输入端,而后者仅作为外接晶振.
在MSP430F1101A的代码中使用了语句P1SEL=P2SEL=0x0;把PIN5和PIN6的外围模块功能给禁止了,最终造成MCU的晶振无法正常工作.
而TIMER_A又是依赖于晶振工作的.
所以导致了无法进入TIMER_A的中断子程序.
Q14:timer用vlo做aclk源如何进入lpm3,定时1分钟,再退出lpm31分钟可以实现A14:硬件定时器结合软件计数器即可Q16:程序执行完成后,进入LPM3模式,大约过3秒钟之后,又再进入正常模式,即从LPM3退出,再一次从头开始执行程序,执行完成后,再一次进入LPM3模式.
如此往复循环下去.
请问这个能不能通过定时器A来实现A16:能.
1、在主程序中完成初始化后进入LPM3模式.
2、在LPM3模式下,ACLK必须工作,并且TA选择ACLK为时钟源.
3、当TA中断时,CPU在进入TA中断服务前,会自动唤醒.
4、在TA中断服务中调用要被周期性执行的程序.
5、从TA中断服务返回后,CPU又会自动恢复到中断发生前的LPM3模式(即,主程序会永远停留在进入LPM3模式的那条语句中程序).
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第44页共68页Q17:中断向量和中断标志寄存器的区别A18:IICIFG是中断标志,指示是否产生中断.
IICIV是中断向量,是中断代码的入口地址.
MCU首先查询是否有中断标志产生,如果有,再查询中断向量,转去执行中断服务程序.
Q18:单片机是8M的,脉冲是1M的.
请问单片机不能及时响应吧有什么好方法使它能及时响应A18:用高速信号计数:从TACLK、或者INCLK脚输入,从TAR中取数据.
读取TAR,如:intA;A=TAR;WhentheTACLKisasynchronoustotheCPUclock,anyreadfromTARshouldoccurwhilethetimerisnotoperatingortheresultsmaybeunpredicta**e.
Alternatively,thetimermaybereadmultipletimeswhileoperating,andamajorityvotetakeninsoftwaretodeterminethecorrectreading.
AnywritetoTARwilltakeeffectimmediately.
Q19:BTCTL=BTDIV+BTIP1+BTIP0;为什么中断了125毫秒A21:32768/256/16=8hz=125ms.
Q20:捕获时,上升沿捕获,第1次捕获的数据TAR放到CCR0!
BH0=CCR0;第2次捕获的数据TAR放到CCR0!
BH1=CCR0;一个脉冲周期=BH1-BH0;但是如果第一次捕获时CCR0很大,大到快要接近0xffff;TAR继续计数TAR溢出后!
是什么个情况是从0开始吗如果是从0开始,第2次捕获的数据如果小于第一次的数据!
那该怎么办!
A20:需要开捕获中断,记录溢出次数,当溢出次数只有一次时任然可以用T=BH1-BH0,这时刚好是补码.
当溢出次数超过一次,那待测脉冲周期T=65536*(溢出次数-1)+BH1-BH0.
Q21:设定CCR0作为PWM波形的周期、设定CCR1作为PWM波形的占空比改变CCR1来改变占空比我的问题是在什么情况下可以改变CCR1;任意时刻都可以吗还是想TAR那样!
必须在停止模式下才可以改变其值!
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第45页共68页如果是任意时刻!
那么当CCR1改变后!
如果改变后的CCR1>改变前的CCR1!
波形是怎么个情况如果改变后的CCR1resetafterexpiredtime*//*WDTisclockedbyf**CLK(assumed1MHz)*/#defineWDT_MRST_32(WDTPW+WDTCNTCL)/*32msinterval(default)*/#defineWDT_MRST_8(WDTPW+WDTCNTCL+WDTIS0)/*8ms"*/#defineWDT_MRST_0_5(WDTPW+WDTCNTCL+WDTIS1)/*0.
5ms"*/#defineWDT_MRST_0_064(WDTPW+WDTCNTCL+WDTIS1+WDTIS0)/*0.
064ms"*//*WDTisclockedbyfACLK(assumed32KHz)*/#defineWDT_ARST_1000(WDTPW+WDTCNTCL+WDTSSEL)/*1000ms"*/#defineWDT_ARST_250(WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)/*250ms"*/#defineWDT_ARST_16(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)/*16ms"*/#defineWDT_ARST_1_9(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)/*1.
9ms"*/Q33:系统复位后,如何判断是看门狗引起的复位呢,还是上电引起的复位呢能不能通过看门狗中断标记来判断是不是看门狗做定时器时才能使能看门狗中断控制位A33:看门狗引起复位会在标志寄存器中的WDTIFG为1,而上电复位为0.
Q34:我用的是F169的片子,看门狗时钟源用的是辅助时钟源(ACLK),XT1接的是32.
768的晶振,初始化看门狗程序:WDTCTL|=WDTPW+WDTCNTCL+WDTSSEL+WDTIS0;也就是250ms,主程序用的是DCO,大概频率是2.
5Mhz.
每次不打开看门狗工作正常,一旦打开看门狗了,程序初始化看门狗以后就不知道跑哪去了,请问是什么原因啊A34:WDTCTL|=WDTPW+WDTCNTCL+WDTSSEL+WDTIS0;写法并不能达到你预期的结果.
因为POR后,WDTCTL不等于0.
可以采用WDTCTL=XXXXX的写法,直接赋值.
Q35:语句WDTCTL=WDTPW+WDTHOLD;//停止看门狗LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第48页共68页WDTCTL是16位的寄存器,可是WDTPW+WDTHOLD是什么意思啊WDTCTL&=0X0010不也是停止(watchdogtimerisstopped)吗有什么区别A35:WDTCTL=WDTPW+WDTHOLD,是关看门狗,WDTPW是密钥,对WDT或flash寄存器访问是要密钥的,WDTPW就是写入密钥,否则产生复位.
WDTCTL&=0X0010,没有写密钥,WDTCTL根本不能设置成0X0010,而是系统直接复位了.
Q36:一般使用如下指令进行看门狗停止:WDTCTL=WDTPW+WDTHOLD;//关闭看门狗.
那么看门狗打开是否可以采用指令:WDTCTL&=~(WDTPW+WDTHOLD);//打开看门狗A36:需要理解WDTPW、WDTHOLD的具体意思.
这些都在头文件中的宏定义.
WDTPW为寄存器访问密钥,如果写入错误的密钥,会产生复位;WDTHOLD为看门狗时钟关闭;寄存器WDTTMSEL选择看门狗是工作在定时器模式还是在看门狗模式,所以要打开看门狗应该WDTCTL=WDTPW+WDTTMSEL;具体定时时间可以看头文件,头文件中都有注释.
Q37:在程序中间采用如下指令:WDTCTL=WDTPW+WDTCNTCL;//清开门狗,防止在程序正常运行中复位.
是否正确A37:错误,程序一样会复位.
WDTCNTL为清除计数器,WDTHOLD为关闭计数器,两个寄存器的概念不一样,使用时需要注意.
Q38:看门狗的时钟设置为:BCSCTL2=SELM_2+SELS+DIVS_3;//选择MCLK、SMLK为XT2分频因子8以上为我程序中的设置情况,可是感觉看门狗不能正常工作,不知道是何原因A38:相应的.
h头文件中有相应定义,时间长度、时钟源都定好了:#defineWDT_MRST_32(WDTPW+WDTCNTCL)/*32msinterval(default)*/#defineWDT_MRST_8(WDTPW+WDTCNTCL+WDTIS0)/*8ms"*/#defineWDT_MRST_0_5(WDTPW+WDTCNTCL+WDTIS1)/*0.
5ms"*/#defineWDT_MRST_0_064(WDTPW+WDTCNTCL+WDTIS1+WDTIS0)/*0.
064ms"*//*WDTisclockedbyfACLK(assumed32KHz)*/#defineWDT_ARST_1000(WDTPW+WDTCNTCL+WDTSSEL)/*1000ms"*/#defineWDT_ARST_250(WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)/*250ms"*/#defineWDT_ARST_16(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)/*16ms"*/#defineWDT_ARST_1_9(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)/*1.
9ms"Q39:定时器有两个中断TAIE和CCIE,有什么区别两个中断的中断向量一样吗A39:TAIE和CCIE指的是不同事件.
TAIE指TAR计数器溢出,从65535到0的变化.
产生的是溢出中断TAIFG.
CCIE指捕获到相应信号(捕获模式下);定时时间到(比较模式下).
产生CCIFG中断.
两个中断的中断向量不一样.
Q40:我用的msp430f1481,奇怪的是定时器TA能进中断,但中断标志一直存在,因此程序老在中断中跑,我用的是8M晶振,XT2ONA40:没有设置相应的中断使能,是不会引起中断发生的;中断频率太快,在调试状态中,刚把中断标志清除,又有一个新的中断产生了,所以给人的错觉是清不掉Q41:芯片用的是MSP430F447,从P1.
2口输入外部脉冲,我用TIMEB定时,Port1中断触发的,程序干不了别的,光中断了,程序好像也进不到定时中断里去.
A41:如上所述分析,可能是:LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第49页共68页1、MCLK可能过低,来不及处理指令2、TB的中断服务程序太长,所以光中断了,其实是中断运行时间太长了.
3、定时时间内的脉冲个数,如果脉冲频率很高,本来就是在不停的进入中断,如果频率高到一定程程度之后,都不用如不用中断,直接去判定标志位,因为进出中断也耗时间的.
Q42:用F149的定时器B的捕捉功能,遇到问题,在等待捕捉时,读取TBR的值总是随机数,我用软件在线调试观察的.
A42:别读TBR.
读TBCCRx就OK了,捕获到信号时TBR的值自动复制到TBCCRX的值.
Q43:我想输出PWM,在中断响应后能改变PWM的频率吗A43:调整相应的定时器配置,PWM的频率和占空比都是可以改变的.
CCR0的值改变周期,CCR1(和输出对应的寄存器)改变占空比.
Q44:timeA定时器输出模块中EQUx和EQU0有什么区别它们有什么用A44:捕获/比较器在比较模式时设置EQUX信号有差别:当TAR的值大于或等于CCR0的中的数字时,EQUO=1当TAR的值等于相应的CCR1或CCR2的值时,EQU1=1或EQU2=1EQUx和EQU0它们是用来控制输出单元的,软件中可以不用设置,由硬件自动触发.
综上所述,EQUX可以理解为一个信号,是为了描述方便加上的一个名字.
Q45:通过set或者clearP1IES可以设置P1口在上升沿时触发中断还是下降沿时中断,能不能搞成一个电平触发的如高电平中断或低电平中断A45:不可以的.
一定要是一个跳沿,并且这个跳沿的时间最小要大于20ns.
Q46:timerA不能进入中断检查的一般思路A46:不能进入中断一般检查思路:1:是否开所属模块中断和总中断.
2:所属模块所用时钟是否有效.
3:中断向量是不是写正确.
Q47:时钟采用8MHz,那么执行for(i=0;i改变前的CCR1!
波形是怎么个情况如果改变后的CCR1voidmain(void){WDTCTL=WDTPW+WDTHOLD;//关狗P1DIR=0XFF;P1OUT=0X00;LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第53页共68页TACCR1=200;TACCTL1=CCIE;_EINT();//使能TACTL|=TASSEL_2+ID_2;//smclkTACTL|=MC_2;//连续LPM0;}#pragmavector=TIMERA1_VECTOR__interruptvoidtime(void){if(TAIV==0X02){P1OUT^=0X01;}}这样仿真时,进入中断,taiv=0;这是为什么按理说taiv=0x02A67:TA有两个中断源:TA0_VECTOR这个中断源里面只包含有CC0IFG这一个中断向量,也就是说TACCR0的比较中断和捕获中断都在这个中断向量表中.
TA1_VECTOR这个中断源中包含有除CC0IFG后的其它中断向量,有CC1IFG、CC2IFG、TAIFG,由TAIV的值来确定进入那个中断向量中.
Q68:用430单片机进行连续的数据采集,每次持续时间得几十秒,但是还要用单片机实现实时时钟功能,期间每秒都得进Timer中断计时.
这样势必会影响数据的连续采集.
这种矛盾该怎么解决呢A68:数据采集启动后,有一定的时间才能完成AD转换.
这段时间内,CPU要么空转,要么进行时钟处理.
因此我认为CPU干这两件工作完全胜任,只要:1.
提高CPU时钟到8MHz.
2.
用中断方式进行AD及时钟处理,中断程序要高效小巧.
3.
数据采集从微观上讲,并不是连续不停进行的(这是模拟电路的带宽及数据稳定所决定的),因此合理选择单位时间内AD转换的次数.
4.
要连续采集几十秒数据,单位时间内AD转换的次数应与系统的数据存储空间大小一并考虑.
Q69:如何实现间隔1小时触发定时器中断进行采集,对定时器如何设置呢如果我用32K的时钟源,最多是不是只能实现2秒触发一次A69:时钟选择32768HZ,计数的最大范围为65535,最多为2s呢.
要实现一个小时的延时只需要计算中断次数就可以了.
Q70:我想用TA的CCR0定时中断,增记数模式,但我看书上的CCIFG0的设置只有在CCR0与TAR的值相等时才置位,下一个周期马上又复位了.
要是此时正在运行一条指令,那岂不是错过了进入中断了吗.
可能我的理解有错,请指教.
A70:CCIFG0应该相应了中断服务程序后才复位啊!
或者用指令清除,不会错过的.
.
Q71:用430进行脉冲记数问题,是不是可以用TIMER――A的捕捉功能呢A71:可以的,TA中的捕获功能就是做这个事情的,记录脉冲的个数.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第54页共68页Q72:一个TA或TB最多只能产生两个中断吗.
要不是的话,中断向量表该怎么处理A72:应该说是两个中断向量地址,不能说产生两个中断.
TA、TB总4个中断向量地址,TA、TB各有两个,如TIMER_A的比较模式采用CCR0、CCR1、CCR2就可以产生三个中断,但中断入口只有两个,CCR0占用一个,CCR1、CCR2、TAIFG占用一个,通过中断标志来判断是那个中断源引起的中断.
Q73:MSP430中断所需的最小输入脉宽是多少A73:最小中断脉宽必须大于1.
5主时钟周期(MCLK),以确保中断有效.
有关问题请参阅器件特定的数据表.
第七章:系统时钟类Q1:想找一款时钟芯片能和MSP430结合的,最好是并口的,这样不用占用串口A1:节约成本考虑:使用430的定时器可以做一个实时时钟RTC,不会引起多余的功耗.
另外,市面上时钟芯片多为I2C接口,可以通过430的2个普通I/O口来模拟实现,而不占用硬件串口.
Q2.
430f435晶振最大能接多少能接32.
768兆吗LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第55页共68页A2:msp430f4xx最大只能接8M,数据手册有相关说明Q3:选择低频晶体(LFXT1CLK)做ACLK.
系统进入低功耗模式四(LPM4),这时引发一个外部中断,在中断服务程序里,DCO是启动了吧,那么低频晶体有没有起振啊A3:进入低功耗4所有的时钟均停止,当外部中断来临时,DCO自动被唤醒,然后由DCO去引导晶振起振.
Q4:用msp430f147外接了一个6M晶振,占用两个串口工作,一个波特率设置为2400,另一个设置为115200,但是运行的时候发现,波特率为115200的那个串口不能正常进中断接收数据,经过不断试验,发现当其改为38400的时候就可以正常工作了,但是波特率再往上调通讯都不正常.
以前做过一个试验,只用一个串口,同样外接6M晶振,波特率设置到57600都没有问题.
问题出现在哪呢A4:注意你的232芯片的最大工作波特率,可能是这方面存在问题.
另外你测试的时候最好只有一个串口再工作,另外提醒下:小数寄存器是否配置妥当Q5:MSP430F2系列的外接晶振一般多大我看大部分资料上写的都是32768晶振.
可以大点吗比如1M或者4M.
A5:这个最好看下用户指南和数据手册,如果至此高频模式的话,那么配置成1M和4M都是可以的.
Q6:问题:假如波特率为9600,时钟频率为32768,波特率控制寄存器为32768/9600=3.
41.
UBR00=0x03;UBR10=0x00;UMCTL0=0x4A;这个0x4A是如何来的啊A6:是为了修正0.
41的偏差,其中1最好均匀分布.
比如说0x4a,2进制码是1001010,这其实就是3个1均匀分布么Q7:DCO可以调到很高的频率,系统主时钟有上限吗是多少A7:看是哪个系列的了,1XXX和4XXX在8MHZ左右,2XXX多数可跑16MHZ.
另外还与工作电压有关.
结合你的实际情况选择Q8:1、XTINXTOUT接低速晶振,最高可以接多大频率晶振,可以接8M的吗2、用DCO作为主时钟,最高频率可以到多少3、XT2INXT2OUT接高速时钟,最高可以接多大频率晶振(看资料,好像有的可以8M,有的可以到16M)A8:1.
将xt1改成高速模式可以接8m晶振2.
根据系列不同而不同比如最新的5xx系列能到25m而2xx则是16m3.
这个得看你选择的芯片型号Q9:以57600波特率实现PC与1611通信.
PC给1611发送1122334455667788,单片机只能收到114477总是隔2个收到一个数据;单片机给PC发数据的话,PC都能收到.
voidBaudrate57600(void){UBR0_0=0x8B;//波特率发生器选择SMCLK,57600UBR1_0=0x00;UMCTL_0=0x00;LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第56页共68页}怎么回事A9:1、1611的收发速度小于PC的,从你提供的情况,大约为PC的1/4.
降低波特率或改进MSP1611的收发代码执行效率.
2、建议MCLK再提高一些,MCLK不要和UART的时钟是同一个时钟源,再试试.
Q10:要使串口2输出波特率为115200是不是必须要在XT2加个8M晶振呀用加电容吗A10:不需要那么大,可以考虑用DCO产生,但要注意校准,如果用XT2最好要加电容的.
Q11:我用的是430F449我想用XT2作为我的MCLK,但是怎么也切换不过去,一直都是DCO再工作的,我打电话给技术支持,按照他们说的都切换不过去,请问大家谁有好的办法不或者说下这个切换的过程,最好有程序,谢谢了A11:由于XT2时钟失效自动切换到DCO.
因此程序中首先打开XT2,判断晶振失效标志位,直到XT2正常工作,OFIFG为0后再执行其它程序.
可用以下程序再做尝试:voidinit_XT2(void){unsignedintt;FLL_CTL1&=~XT2OFF;do{IFG1&=~OFIFG;for(t=0xfff;t>0;t--);}while(IFG1&OFIFG);FLL_CTL1=SELM1;//MCLK-->XT2=4MHzQ12:CALBC1_1MHZ这个值到底是多少啊,在那有它的定义A12:对于2XX系列由于DCO没有锁频环,因此不能够自动校准频率,需要通过手动配置DCOMODRESEL来校准频率.
2XX单片机在出厂时候,TI已经对常用1MHZ,8MHZ,12MHZ,16MHZDCOMODRESEL寄存器配置已经配好,保存在信息段里面.
具体位置还有定义你可在2系列的头文件里查找.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第57页共68页第八章:LCD显示驱动类Q1:用MSP430F470来驱动段式液晶,发现有的段不该显示的时候,却有点模糊,该显示的段位,却亮度达不到有些段位,比较小的段就比较清晰.
A1:常见的41X,42X,43X,44X芯片的驱动需要外部的调压电阻,3个1M电阻可以调整到100K-1M之间,达到较好的亮度和对比度.
IO选择为LCD功能,并且没有被LCD应用到的,要悬空.
Q2:我用的是430F413的片子,配的是点正液晶显示器.
在整个电路调好后,有部分的电路液晶显示,放置一段时间后液晶出现浅显(不该显得都显出来了).
A2:MSP430F413自带LCD段式液晶驱动器,配的是点阵液晶,估计是液晶驱动程序没有写正确.
Q3:晶体一般都是接32768,然后使用液晶很正常.
我打算将晶体接6M的替换32768,那么液晶还能正常显示吗A3:看你所用的LCM模块时序极限是多少HZ,然后看6M情况下,MSP430去驱动LCM时,程序时间会不会超过这个极限频率,如果超过,得加延时.
Q4:msp430fw427制作水表液晶显示模块,能用LCD1602吗A4:1602是点阵液晶吧!
那样比较费电,还是用段式液晶好1602是点阵液晶吧!
那样比较费电,还是用段式液晶好FW427本身自带了段式液晶存储器,一般水表商均自己开模去做的段式液晶,毕竟水表所需表达信息量并不多,没必要使用点阵液晶.
Q5:I/O怎样直接驱动LCD,如何做A5:建议采用带LCD驱动的芯片.
可采用MSP430F4xx系列的芯片.
如果不用带LCD驱动的芯片,可以用IO口仿LCD的波形,比较复杂些,不过也能做出来.
可以到TI网站上去下载关于LCD的应用报告.
Q6:用CMOS系列芯片驱动LED数码管,进行LED数码管的静态驱动,但不知道用那一款CMOS芯片,有什么好方法A6:CD4094或HC4094芯片,74LS245/74hc245/74hc373也可以,可选的芯片比较多,觉得CD4094可以,这个成本比较高的吧,建议可以采用一个升压的电源管理芯片+一个普通的移位寄存器来实现.
CAT4238+74HC164来实现.
像74hc373这些都可以.
一个数码管可以静态;2片74hc373扫描方式可以驱动8个LED数码管.
Q7:段式液晶和点阵式液晶区别和不同的应用A7:段式液晶显示的信息较少,但是便宜,驱动电路简单.
点阵液晶,显示信息丰富,可以显示汉字,图片,但是比较贵,驱动电路比较复杂,驱动程序也要比段式液晶的驱动程序复杂许多.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第58页共68页第九章:通信类Q1:430串口中,有个R/D控制线,在接收上位机的数据,但本身的数据有无发送完毕不知道啊,什么时候才可置低R/d位来接收数据啊好像430没有发送完中断标志A1:字节主动发送,一般都能发出去,除非你的的时钟有问题.
可以用程序检测,半双工通讯,可以多发送一个字节,作为判断,当最后个字节(作为判断用)写入发送缓存产生中断时,在中断里改变R/D状态.
Q2:我想做个6个节点的网络,最远的距离为2mF20系列的USI做3线SPI模式用是否能满足要求能否提供其他低端的430芯片A2:SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议.
.
但作为芯片间的通信,距离不能太远,如果你想做2m,建议你用串口232去做!
Q3:从PC端,用串口调试助手发送一个字MSP430可以接收到,但是我发送一个字符串MSP430就接收不到了,不知道为何,程序如下:#pragmavector=UART0RX_VECTOR__interruptvoidusart0_rx(void){RecBuf[revcont]=RXBUF0;//RXBUF0toTXBUF0revcont++;}用上面的中断程序接收到后,发送RecBuf到PC串口.
.
.
.
我如果发送0x010x02到MSP430后,再从MSP430发送到PC,我接收到的是0xE0A3:查查你的程序,在中断程序中的revcont++;会不灰导致RecBuf[]越界;发送0x010x020x030x04在串口调试助手里应该是01020304并点以十六进制传输.
否则PC将会以ASCII码形式发出.
Q4:本人想利用单片机的定时器,DMA,Flash常数表和DA产生一定频率的正弦波.
希望CPU在初始化设置好之后不再占用CPU资源.
有没有可能DMA输送一段数据,在我的时钟控制下一个一个的往DA送数,当这一段数据传送完成之后传送地址自动返回到这段数据开始再送呢A4:你的这种思路是可以实现的,不过要设置好DMA1、在"块地址到单地址"编址模式下,采用"重复块传送"方式;2、要由中断来触发DMA的数据传送,从而实现DAC的数据更新,这时要使用CPU方法1,即可实现无CPU干预的情况下数据的directmemoryaccessQ4:请问,无线通讯系统,增加通信距离都有哪些方法呢最有效最常用的A4:加放大器,换增益更大的天线,降低通讯速率,降低载波频率,加大发射功率,基本就这些了.
主要是硬件上,发射功率和你的高频电路负载的匹配Q5:Modulationbits.
ThesebitsselectthemodulationforBRCLK.
调制位,不明白umctl是什么作用A5:调整器,举个例子,BRCLK=32768hz,要产生2400波特率,分频器分频系数为32768/2400=13.
65,所LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第59页共68页以设置分频器的计数值为13.
接下来调整寄存器的值来设置小数部分的0.
65,调整器是8位,在调整器里要设置的1的个数是0.
65*8=5.
具体可以参考USER'SGUIDE或者介绍430单片机原理的书Q6:低功耗的产品应该是不接XT2直接用DCO的吗用msp149,产品用到UART不知道DCO稳定否当波特率9600,msp149的DCO最大频率多少啊A6:低功耗产品建议使用内部的DCO,1系列的DCO稳定度比起晶振确实不是很好,但是如果只是给UART提供时钟源,而工作的波特率是9600的话,还是可以胜任的,149的DCO频率最大能达到多少还是看149的数据手册吧,内有详细介绍.
Q7:异步串口通信分别什么时候产生发送中断和接收中断A7:应该是先中断,在中断中发送数据,接收数据是一个字节收完才产生中断的.
Q8:MSP430的BSL下载的硬件电路是采取串口与MSP430的直连.
如果复用串口信号线的话,会与普通的串口通信冲突吗另外用于BSL下载的各信号线需要做什么处理A8:BSL只是芯片中固定位置的一段程序,在执行应用程序它是不起作用的,所以不会与普通的串口通讯冲突.
BSL下载的各信号线基本没有什么特殊的要求,如果复用时只要不将它们直接接地或者VCC就可以上拉下拉是没问题的,不过能不复用最好.
Q9:比如:702.
0,在MSP430中占四个字节,为00802f44.
是不是通过指针,一次发一个字节,发四次而在上位机上用VC编程序时,串口接收数据时,怎样把这四个字节还原为702.
0呢A9:简单的方便使用指针,分四次发,接收时直接使用指针存入一个浮点数中.
ptr=(char*)&fData;ptr[1]=Rec1Buff[m];ptr[0]=Rec1Buff[m+1];ptr[0]=Rec1Buff[m+2];ptr[0]=Rec1Buff[m+3];Q10:使用USCI模块B进行IIC通信,配置完寄存器后,置位***STT位后,从示波器观察并没看到SCL和SDA线上发出起始信号,请问可能是因为什么原因A10:2系列为了降低功耗只有在把数据写到发送缓存的时候才会产生时钟.
Q11.
问题:请问MSP430F247的SPI总线的SOMI和SIMO上如果加上了4.
7K的上拉电阻对总线有影响吗A11:一般来说增加上拉可以提高驱动能力,但是SPI可以寄存器配置是空闲高电平还是低,因此如果要上拉需要软件设置一致,否则出错.
Q12:MSP430SPI或UART的速度A12:在SPI主模式下,通信速率可以达到4Mbps,而在UART模式下,速率也可达到2Mbps.
USART可进行配置,以便同时支持同步(SPI)与异步(UART)操作,并且可从几个内部及外部时钟源(与CPU时钟无关)中进行选择.
在SPI主模式下,USART的运行速率可达到应用时钟的1/2.
例如,如果使用8MHz时钟,则SPI主模式的传输速率可达到4Mbps.
在UART模式下,实现可靠通信至少要求每位3或4个时钟.
例如,8MHz时钟除以4可以支持高达2Mbps的速率.
MSP430xxxx用户指南中提供了有关USART功能的完整说明,其网址是:http://www.
ti.
com/msp430.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第60页共68页第十章:IO端口类Q1:请问430的I/O中断能不能可靠的响应60ns的脉冲信号,就是来了一个60ns的脉冲,430的中断会有丢失吗A1:端口支持的最高8M的时钟,无法响应这么快的频率.
Q2:430是3.
3V供电,如果我想使P2.
7管脚置高,然后等待低电平中断.
接5V左右的电压接上拉电阻行不行需不需要用分压电路到3.
3VA2:你可能要进行电平变换,430I/O口最好不要接5v的Q3:当Jtag接口把程序下载到单片机之后,Jtag接口还能不能用作普通IO口A3:和GPIO端口复用的JTAG引脚,只要不在仿真状态,就是普通的i/o引脚.
Q4:我在产品的测试中经常会发现,某一管脚输出电压不正常,本来应该是高电平,可是就有那么一个是低电平,而且不影响cpu其他管脚正常工作,有没有遇到相同问题的高手,能帮忙解决下吗,出现这个情况是不是cpu就是坏了,不能正常使用了A4:首先确定该端口的PxSEL对应的位是0,比如2系的P2.
6和P2.
7默认与XIN和XOUT复用,如果不设置就是不能正确输出的.
然后才是看是不是虚焊,最后确认IO可能是坏的.
Q5:430单片机能不能用I/O口仿并口通讯,仿的时候需要注意什么,是不是只要把PXDIR设置成输出就行A5:可以.
向外写的时候要设为输出,读取数据时要设为输入,根据情况随时控制PXDIRQ6:MSP430刚刚上电时I/O管脚的状态是高电平还是高阻态还是低电平啊A7:I/O在设置之前的状态是输入状态,电平不定的,这个最简单了,你只要测试以下就可以知道答案.
关于I/O及其他寄存器的初始值,在相关的系列Usersguide中有描述.
Q8.
P1REN这个寄存器是什么用途的A8:是控制上下拉是否启用的.
用法是DIR置为0也就是输入状态时,通过OUT的值控制上拉还是下拉.
当REN置位时,就被拉,否则输入是高阻的.
Q9:在同一个程序中,前半段用的是P3.
1(SIMO)P3.
3(UCLK)的SPI模式,然后在接下来的程序中要P3.
3,P3.
3作为普通IO口输出时钟.
用什么指令能使SPI工作完后清除SPI功能,变成好象没使用过SPI模式前一样A9:可以的,IO口的IO功能及辅助功能可以随时切换的.
一般而言只要更改PxSEL寄存器即可.
具体可以查看一下相应的用户指南及数据手册LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第61页共68页Q10:低功耗设计中430接CMOS器件要注意点A10:在低功耗产品设计中,当430的i/o口与CMOS器件接口时,比如LCD之类的,为了省电,LCD间歇供电,当LCD关断时,与之相连的430的i/o口一定要设置为输入口或者设置为输出为1.
否则LCD内部cmos器件的I/O口通过二极管导到其VCC上,这样MCU的电流变大了,功耗变的更大了.
Q11:430I/O最大驱动电流是多少呀A11:每个I/O输出电流最大允许6mA,数据手册(datasheet)上有详细说明.
Q12.
:msp430201X的电源电压为1.
8V,其IO口电平电压是不是也是1.
8V呢,对最大输出电流会不会影响呢A12:若DVCC采用1.
8V的,则I/O的高电平不会超过1.
8V的,其CPU核的电压与外围模块的电压用的是一个电压,不过在其F5xx系列中,CPU核电压与外围模块电压分开了.
A13:请问:如果不用的口,方向设做什么好,输入还是输出为什么Q13:输出低电平,或者设成输入,并接地.
效果是差不多的Q14:在F149芯片应用时使用了其中的两个串口进行通讯,现在想增加通讯的串口数量,不知道F149芯片能不能进行端口功能的扩展,若能,怎样实现另外怎样在外部扩展ROM区,具体怎么实现,请指教!
A14:可以用定时器模拟几个串口,timera专门为这个功能做了特殊处理,请参考例程.
430不开放总线所以扩展ROM是不可以的.
Q15:JTAG与I/O功能之间的MSP430引脚复用A15:四个引脚P1.
7-P1.
4在20与28引脚MSP430F1xx器件上均同时具有I/O与JTAG功能.
这些引脚的默认功能是,当器件通电时具有I/O功能.
当测试引脚拉高时,则将这些引脚选为JTAG.
当使用交互式系统内调试程序时,这些器件的FET会将这些引脚处于JTAG模式下.
如欲了解有关在使用调试程序时从JTAG模式发布引脚的信息,敬请参阅《FET工具用户指南》.
注:如果将外部电路附加到共享引脚上,则必须考虑JTAG信号对引脚的相互影响.
如果通过JTAG对该器件进行系统内交互式编程或调试,则需考虑电路将产生的影响.
如果电路将增加共享引脚的负载或偏置,进而干扰JTAG通信,则应考虑这一点.
更高引脚计数器件具有仅可用于调试与编程的专用JTAG引脚.
Q16:MSP430I/O引脚的汲极电流与源极电流A16:MSP430未指定来自I/O引脚的最大绝对电流.
如欲了解Voh与Vol的规范,敬请参阅数据表.
其中显示了每个I/O引脚均可提供几毫安的电流,但输出电压将随着电流的增大而发生变化.
这些规格的附注通常提供了要维持特定电压,所有组合的输出提供的最大总电流.
MSP430I/O不适于驱动高电流的20mALED.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第62页共68页第十一章:FLASH存储类Q1:用IAREmbeddedWorkbenchforMSP430通过JTAG往MSP430上写程序.
为了知道片内程序的版本,必须读出Flash中内容.
什么工具软件可以通过JTAG口实现这个功能A1:熔丝未烧断的话,做个空程序的项目,然后在C-SPY选项里选择保留未改变的区域,DEBUG后看MEMORY里的内容!
熔丝烧断的话只能用编程器或BSL,如果加密了,只能通过BSL来读了,不过你要知道中断向量表的32个字节的内容,即密码.
Q2:MSP430F449中我想把一个整形的数A存入某地方掉电也不丢失,作为以后程序运行的参数.
是放在flash里面吗用代码怎么实现A2:如果只是个巴字节的话就把它作为数组或者变量定义到FLASH就可以了.
如:constunsignedcharValue@0x0C000;Q3:430里面Flash的主存储区和信息存储区有什么区别么是不是程序是保存在主存储区里面的那信息存储区是存什么信息的呢存进去之后是不是随时能够读写出来呢A3:Flash分主Flash和信息Flash.
如你所说,Flash主存储区主要来存储程序.
信息Flash就是保存数据用的,可以随时读取.
不过从物理特性而言他们是一模一样的,就段的长度有区别.
当然信息段你也可以用来存储程序使用.
Q4:在flash单字节写的时候,如我写在D区,可以不用全部清D区吗因为D区还有先前保存的数据.
A4:不可以.
只能先读出然后全部擦除再重新写入,如果FLASH可以如您说的那么操作,那就是EEPROM了Q5:目前使用的单片机是5V供电,买的flash存储芯片3.
3V供电,单片机和存储芯片的连接是怎么的呢我查看一些相关资料,说是可以直接连接,但是直接连接有问题,请问如何连接需要什么样的方法A5:最好在FLASH与MCU之间接一个电平转换芯片,或者用MOFET管转换一下电平.
Q6:请问擦写FLASH选择频率时,有没有要特别注意的,如果我用8M的,不分频,这样可以吗A6:要注意啊,擦写Flash的频率在250~470K(具体可以查查手册);必须对FCTL2进行设置,使频率在这个范围内.
Q7:用jtag接口往430中写程序会不会破坏原有flash信息段保存的数据啊A7:取消擦除信息段选项,即在IARproject的options选项中DEBUG下的选项.
Q8:从数据手册上来看,在写的过程中,好像要求判断BUSY位来决定接下来的操作,可是为什么TI的例程里面没有判断BUSYbit是不是MCU会自动判断A8:430对FLASH的写操作多种.
比如块写(**OCKWRITE)和字节/字写(BYTE/WORDWRITE),在不同模式下,允许写的操作也不同.
比如在字节写(BYTEWRITE)操作下,允许在FLASHMEMORY或在RAM下进行.
当在FLASHMEMORY下进行写操作时,此时CPU是挂起的,直到写操作完成它才能执行下一个指令操作,LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第63页共68页您看到的例子,可能就是这方面的.
但是当擦除程序是在RAM内初始化的,那么CPU就可以一直执行,如果不判断BUSY位的话,当RAM内代码执行完毕(us级),PC跳转到FLASH,而此时FLASH还再做擦除操作(ms级)就会造成非法访问,产生不可屏蔽中断.
Q9:MSP430的编译器默认是将数组定义在RAM里面.
请问如果我要将定义的数组直接保存在flash里面应该如何定义呢是不是要修改编译器的某个配置信息,然后直接用const定义呢A9:这个如何分配,以及用什么关键字都是由编译器决定的,如果你用的是IAREmbeddedWorkbenchfor430,那再在数组声明的时候,前面加一个CONST那么在编译的时候就会将数组分配到FLASH空间.
如果不加const默认的情况是分配到RAM空间的.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第64页共68页第十二章:AD转换类Q1:用430f1132采样是10位的ad数据,而用f169的12位da输出,请问那边采过来的数据可以直接用吗还是需要有一个换算才能用A1:如果参考电源一样的话,直接除10后再乘12就可以了.
Q2:在2274的ADC10里,现在的BCSCTL1=CALBC1_8MHZ;DCOCTL=CALBC1_8MHZ;voidADC10_SET(void){ADC10AE0|=BIT1;//选择ADC10A1(P2.
1)采样通道ADC10DTC0|=ADC10CT+ENC;//选择连续转移数据ADC10DTC1=62;//连续采样62次中断一次ADC10SA=(uint)ad_value+1;//ADC10数据转移起始地址ADC10CTL1=INCH_1+ADC10DIV_1;//选择第10通道,为片内温度传感器ADC10CTL0=REFON+SREF_0;//打开1.
5V正参考,地为负参考ADC10CTL0|=ADC10SHT_3+ADC10IE;//打开ADC10内核,设定采样保持时间为64个ADC10CLK,使能ADC10中断ADC10CTL0&=~(ENC+ADC10ON);//关闭ADC10转换}现在采样时间是125US,采样62次中断一次,现在要指把采样时间稍微的加长一点如何设置A2:ADC10CTL1中的ADC10SSEL没有设置,说明默认0,也就是说ADC10模块的时钟是自带的时钟ADC10OSC,频率一般都是5MHz,也就是说AD模块的fadc10=5M,Tadc10=0.
2usADC10CTL0中的ADC10SHT为3,也就是说采样时间是64个Tadc10也就是64*0.
2=12.
8us不知道你的125us从何而来.
如果AD时钟用1M,相应采样时间是64us,采样时间不是想设多少就可以设多少的从上面的计算就可以看出是由时钟和SHT决定的Q3:初步的设想是使用模拟开关切换16路电阻值,阻值在0-1000之间,精度0.
5或1;现在遇到的困难是,4067的开关电阻在3V供电的情况下较大,300400的样子,而且此阻值在输入电压变化时也有上百的变化,不适合用作做积分转换.
是不是有什么办法来消除开关电阻的影响,或者是使用slopA/D法是不是无法实现多路转换或者是通过软件可以校正误差重复精度如何A3:切换稳定后再测量,SLOP的方法本身就很慢,测量完一次需要等1秒后再测下一次,这样精度才高.
Q4:ad转换中inch_10表示第十通道,可是第十通道是哪个管脚啊A4:一般是内部温度传感器Q5:MSP430F149AD的输入阻抗有多大A5:RC|A0.
0+,Vin1--->|A0.
0-那就是说可以转换的输入电压V=(Vin1+)-(Vin1-),的范围为=+-(VREF/2/GAIN),这样理解对吗SD16CCTL有SD16DF位就是数据格式为双精度或单精度,这与输入电压的正负有什么关系A9:V=(Vin1+)-(Vin1-)的范围=Buffer+n){pBuffer=Buffer;}}LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第67页共68页第十三章:电源类Q1:请问msp430(我用的4619)的VCC,DVCC,VSS,DVSS怎么接啊模拟的和数字的一样吗A1:CC就是正,SS就是负,A是模拟电,D是数字电,A的都接在一起,D的都接在一起,地线要分开布,中间用000贴片连接,也就是传说中的单点连接.
A和D的正电源间如果信号源有固有的频率或频率范围建议中间用适当的电感连接,并在两侧加适当的退耦电容,以防止数字部分的信号干扰模拟信号.
要求不是很精的时候,模拟电源和数字电源多数都是连通的.
Q2:如果直接用干电池(比如两节AA电池)不经过PWIC给MSP430供电,时间长了电池电压下降,这时候是不是芯片的参数,比如说Voh/Vol/Vih/Vil甚至时钟频率都要发生变化了.
如果电池电压降得远低于3V,可能会导致电路工作不正常.
这个理解是不是正确A2:可以这么理解,VCC电压下降了,相应的IO口电平会变化,内部DCO震荡频率也会变化,如果远低于3V会导致电路工作不正常,但可以利用SVS模块来监控电压,或利用AD采样电池电压,当低于一定程度时关闭相关电路甚至MCU本身.
Q3:430的电源范围很宽,一般来说电压越低,功耗越小,不知大家都使用的几伏的电压以前用的3.
3V的,现在想用3V,不知稳定性怎样在JTAG下载程序时有没有什么问题A3:具体用几伏电压的电源,要看实际情况:1、在允许条件下,电源电压越低,MCU能耗越低.
2、GIO或其它功能引脚,比如LCD、ADC、USART等与外部电路或器件之间电压的匹配.
3、如果用了电源管理器件,过低的输出电压会增加该器件输入端与输出端之间的压降,从而增加其本身的能耗举例:3节1.
5V铝电池1、新电池电压3*1.
55=4.
65V2、电池能量快消耗完毕时的电压3*1.
2V=3.
6V3、如果采用DC/DC或LDO作MCU的电源,则其输入电压与输出电压之差应大于0.
3V4、选MCU电源电压为3V或3.
3V都可以5、如果考虑到防止电池电压接反以及作为电源保险,最好在DC/DC或LDO前面接一只肖特基二极管,那么该二极管约0.
2V的压降也要考虑进去其它情况,可以类比.
Q4:MSP430F449芯片,供电是3V,无意中吧电源接反了,大概有几秒钟,但芯片没怎么热,怎么判断是否坏A4:测VCC和VSS间的双向导通情况:用万用表电阻档测VCC对VSS,电阻值不能低于M欧级别.
用万用表二极管档测VSS对VCC,显示值不能大于几百欧姆.
或者也可以用仿真器测试.
Q5:用430做了个系统,用在发电机上,但目前发电机出来的信号干扰太大,CPU容易死机,脉冲峰值有近400V,有效值大概30V左右,电源波形很差,要把这个干扰去掉,使CPU不死机.
有什么方法呢A5:滤除这种噪声,可以考虑一下加上瞬态抑制二极管.
但是瞬态抑制二极管是可以解决一定干扰不能完全解决问题,还要考虑跟大地滤波.
LSDMCUTECHNOLOGYCO.
,LTD.
利尔达单片机技术有限公司WWW.
LIERDA.
COM公司地址:杭州市登云路425号杭州利尔达科技大厦Tel:0571-88800000Fax:0571-89908519第68页共68页Q6:如果一节电池是2400毫安时.
如果放电电流为1毫安,就可以用2400小时,也就是说可以用100天A6:不对!
通常所说的电池额定放电容量是指在额定放电电流下放电到特定电压时的电池放电容量.
当实际放电电流比额定放电电流低的时候,实际放电容量会有所增加;间歇放电情况下,实际放电容量也比连续放电情况下相对有所增加.
同时当电池放电时,其电压也有下降,当下降到MCU不能工作时,就不能在放电了.
举个例子:比如额定容量为2400mAh的电池,它的额定放电电流是50mA,那额定放电时间就是2400/50=48小时.
如果实际放电电流是20mA,小于额定放电电流,由于电池的理化特性,实际放电时间会比2400/20=120小时要长.
反过来,如果超常规放电,放电电流远大于额定放电电流,则电池的容量就会减小,甚至会缩短电池的使用寿命.
Q7:1602与430电平不匹配问题,用什么芯片进行电平转换较好.
A7:建议选用TI的SN74LVTH245,TI的74LVC2451、TI的SN74LVTH245是专门为低压3.
3V而设计的芯片,但也可以用于5V系统(Theseoctalbustransceiversaredesignedspecificallyforlow-voltage(3.
3-V)VCCoperation,butwiththecapabilitytoprovideaTTLinterfacetoa5-Vsystemenvironment.
)其用ABT技术(AdvancedBiCMOSTechnology).
输入电压VCC范围是2.
7~3.
6.
2、TI的74LVC245是通用的转换芯片,VCC在1.
65~3.
6V之间.
其输出电压最大值是VCC,输入可以是5V,所以可以用作电平转换.
74LS245是通用型3态transceiver,其VCC范围4.
5~5.
5V.
PacificRack最近促销上瘾了,活动频繁,接二连三的追加便宜VPS秒杀,PacificRack在 7月中下旬已经推出了五款秒杀VPS套餐,现在商家又新增了三款更便宜的特价套餐,年付低至7.2美元,这已经是本月第三波促销,带宽都是1Gbps。PacificRack 7月秒杀VPS整个系列都是PR-M,也就是魔方的后台管理。2G内存起步的支持Windows 7、10、Server 2003\20...
易探云怎么样?易探云是国内一家云计算服务商家,致力香港服务器、国内外服务器租用及托管等互联网业务,目前主要地区为运作香港BGP、香港CN2、广东、北京、深圳等地区。目前,易探云推出深圳或北京地区的适合挂机和建站的云服务器,国内挂机宝云服务器(可选深圳或北京地区),独立ip;2核2G5M挂机云服务器仅330元/年起!点击进入:易探云官方网站地址易探云国内挂机宝云服务器推荐:1、国内入门型挂机云服务器...
CloudCone的[2021 Flash Sale]活动仍在继续,针对独立服务器、VPS或者Hosted email,其中VPS主机基于KVM架构,最低每月1.99美元,支持7天退款到账户,可使用PayPal或者支付宝付款,先充值后下单的方式。这是一家成立于2017年的国外VPS主机商,提供独立服务器租用和VPS主机,其中VPS基于KVM架构,多个不同系列,也经常提供一些促销套餐,数据中心在洛杉...
ie缓存文件夹在哪为你推荐
ps移花接木教程教教我PS的移花接木ip地址是什么网络地址和IP地址有什么区别?主机地址是什么?金山杀毒怎么样金山杀毒怎么样?二叉树遍历二叉树三种遍历方式原则?自助建站什么情况下采用自助建站方式建站好?百度手写百度手写怎么不见了godaddygodaddy域名怎样使用硬盘人什么叫“软盘人”和“硬盘人”?开机滚动条谁会调开机的滚动条畅想中国未来的中国是什么样子的
域名解析服务器 海外服务器 info域名 2017年万圣节 免费静态空间 云鼎网络 双11秒杀 爱奇艺vip免费领取 厦门电信 视频服务器是什么 太原联通测速 lamp什么意思 主机返佣 实惠 阿里云邮箱登陆 谷歌搜索打不开 沈阳idc 远程登录 网络安装 电脑主机 更多