《MSP430系列单片机系统工程设计与实践 谢楷1_第1章 MSP430单片机入门基础》由会员分享,可在线阅读,更多相关《MSP430系列单片机系统工程设计与实践 谢楷1_第1章 MSP430单片机入门基础(52页珍藏版)》请在金锄头文库上搜索。
1、09HO1,主编,第1章 MSP430单片机入门基础,1.1 初识MSP430单片机 1.2 MSP430单片机开发软件入门 1.3 MSP430单片机C语言基础 1.4 文件管理 1.5 代码优化 1.6 风格 1.7 可移植性 1.8 版本管理,1.1 初识MSP430单片机,1.1.1 MSP430单片机的应用前景 1.1.2 MSP430单片机的特点 1.1.3 MSP430单片机最小系统,1.1 初识MSP430单片机,图1.1.1 用水果电池供电的MSP430单片机系统,1.1.1 MSP430单片机的应用前景,从实验中,读者已经了解了超低功耗系统的概念:能够以极低(一般微安级)的
2、耗电运行的系统。在实际应用中,许多产品和系统都对功耗提出了越来越严酷的要求,从而为MSP430单片机拓展了应用领域。,1.1.2 MSP430单片机的特点,MSP430单片机最显著的特点是能够超低功耗运行。除了超低功耗特性以外,MSP430单片机还具有许多其他特点。,1.1.3 MSP430单片机最小系统,图1.1.2 MSP430单片机最小系统,1.1.3 MSP430单片机最小系统,图1.1.3 MSP430单片机的外部时钟接法,1.1.3 MSP430单片机最小系统,1.2 MSP430单片机开发软件入门,图1.2.1 IAR EW430编辑界面,1.2 MSP430单片机开发软件入门,
3、参照下面的步骤,我们开始尝试为MSP430单片机写第一个程序: 1)在File菜单里面选择 File-New-Workspace,建立一个空工作空间。 2)在Project菜单里面选择Project-Create New Project,在当前空间建立一个新工程。 3)在File菜单里选择File-Save Workspace,提示选择路径并输入文件名(例如first.eww),保存当前工作空间。 4)在工程管理窗内会看到新建的名为first的工程,若在第2步选择了“C-main”,则在工程内已经包含了main.c,双击文件,在编辑窗打开后即可编辑。 5)配置工程属性。 6)连接FET-Deb
4、ugger,见图1.2.3。 7)在编辑窗口输入第一个MSP430单片机程序: 8)在Project菜单点击Rebuild All,开始编译。,图1.2.2 配置工程属性,1.2 MSP430单片机开发软件入门,图1.2.3 FET-Debugger的连接,1.2 MSP430单片机开发软件入门,图1.2.4 下载进程框,1.2 MSP430单片机开发软件入门,图1.2.5 EW430调试界面,1.2 MSP430单片机开发软件入门,在EW430调试状态下,View 菜单里面提供了功能丰富的查看功能(见图1.2.6): 1)在线查看变量。 2)通过菜单View-Watch打开观察窗。 3)通过
5、菜单View-Register 打开寄存器窗。 4)通过菜单View-Disassembly打开反汇编窗。 5)通过菜单View-Call Stack打开调用关系窗。 6)通过菜单View-Stack打开堆栈窗。 7)通过菜单View-Memory打开内存窗。,1.2 MSP430单片机开发软件入门,图1.2.6 各种观察窗口,1.2 MSP430单片机开发软件入门,排错方法是一个需要不断练习和积累经验的过程。对于新手,以下的几个基本方法是普遍适用的: (1)包围法 将程序划为若干段,打开观察窗,监视可疑变量或中间结果,用“断点”或“运行到光标处”工具检验各段程序运行的结果是否正确,逐步缩小问
6、题范围,最后可以用单步、跟踪工具找到问题。 (2)极限法 对于某些偶尔出现或周期出现的问题,很可能是某些变量处于溢出边缘,或者在判断语句中将“=”和“”混淆之类的习惯性错误。 (3)陷阱法 当怀疑系统偶尔出现某种不应出现的状态时,或者怀疑某变量偶尔出现了不应出现的值时,可以用一个if语句判断该状态的出现,在后面跟一条空操作语句NOP();并在空语句处设置断点。,1.2 MSP430单片机开发软件入门,(4)穷举法 当怀疑某个函数有可能在某些特殊的输入情况下产生错误结果,可以用一个for循环对所有可能输入进行尝试,并设置错误陷阱,看哪些输入会造成错误,然后用观察窗的变量赋值功能专门产生错误输入情
7、况,最后用跟踪工具找出错误来源。 (5)对比法 自己写的程序无法正常执行,恰巧手头有可参考的代码;或者以前写的程序正常,现在写的却突然不能用了;甚至写了一段新程序后,前面已经调试通过的代码却突然失灵。,1.2 MSP430单片机开发软件入门,下面通过一个实例来示范排错的过程。下面这段代码“突然失灵”:,1.2 MSP430单片机开发软件入门,运行上述程序,本应闪烁的LED却一直亮。下面开始排查错误: 1)在for循环处执行“运行到光标处”。 2)在“P2DIR=0x01;”处设断点,全速运行,程序没有停止,说明看门狗没有复位程序。 3)暂停,在“P2OUT=0x01;”处设断点,全速运行,会停
8、下来,再运行几次,发现到每运行一次,LED都会交替亮、灭一次。 4)为什么单步运行LED正常闪烁,全速运行LED却不会闪烁?上面已经将问题缩小包围至for循环那一句,单步跟踪一下,发现for语句只执行1次循环就执行“P2OUT=0x01;”而不是预计的20000次。,1.2 MSP430单片机开发软件入门,1.3 MSP430单片机C语言基础,1.3.1 变量 1.3.2 数学运算 1.3.3 位操作 1.3.4 寄存器操作 1.3.5 中断 1.3.6 内部函数 1.3.7 库函数,图1.3.1 C语言、编译器和机器码之间的关系,1.3.1 变量,1.3.1 变量,表1.3.1 C430中变
9、量类型,1.3.2 数学运算,C430的数学运算符与标准C语言完全一致。在此了解一下MSP430单片机的数据运算特点和编程原则,对于初学者仍然是很有帮助的。 1)尽可能避免浮点运算。 2)防止定点数溢出。 3)小数的处理。 4)尽量减少乘除法。,1)尽可能避免浮点运算。,浮点数数值范围大,不易溢出,精度较高。对于习惯写PC程序的设计者来说,遇到数值计算会优先考虑浮点数。但对于单片机,浮点数的运算速度很慢,RAM开销也大;在低功耗应用中CPU运算时间直接关系到平均功耗。对于单片机以及嵌入式软件开发人员,在编程初期就要养成尽量避免使用浮点数的习惯。,2)防止定点数溢出。,虽然x是long型变量,但
10、a和常数1000都是int型,相乘结果仍然是int型。在a65的情况下,结果就会溢出。程序应该修改为:,3)小数的处理。,遇到需要保留小数的运算,可以采用浮点数,但是软件开销较大。用定点数也可以处理小数。原理就是先扩大,再运算。,4)尽量减少乘除法。,MSP430单片机的CPU没有乘法、除法指令,乘除操作会被编译器转换成移位和加法来实现。如果乘除的数值刚好是2的幂,可以用移位直接替代乘除法,运算速度会提高很多。,1.3.3 位操作,位操作指令大部分存在于早期速度不高的CISC处理器上(以8051为代表),以提高执行效率,弥补CPU运算速度的不足。目前几乎所有的RISC型处理器都取消了位操作指令
11、,MSP430单片机也不例外。,1.3.4 寄存器操作,MSP430单片机内部各模块的配置、操作全部通过寄存器进行。MSP430单片机内部有数百个寄存器、近千个控制位。通过这些寄存器可以配置各个模块的工作方式、状态、连接关系等参数。第2章将逐个模块讲解寄存器功能配置。这里仅从C语言语法上讨论寄存器的设置方法。,1.3.5 中断,下一章将会了解到MSP430单片机的低功耗主要靠CPU进入休眠状态来实现,能够将CPU从休眠状态唤醒的条件只有发生中断或复位。因此低功耗和中断之间的关系密不可分。MSP430单片机所有的大部分功能模块均能够在不需CPU干预的情况下独立工作,且都能引发中断。,1.3.6
12、内部函数,标准C语言具有普遍适用性,但每种CPU都有其独特之处,很可能对某CPU来说一个简单操作,用标准C语言表达出来却很复杂。比如前文中修改SR寄存器的例子,因为C不能直接操作堆栈,只能用指针操作来进行,效率较低。为了解决类似问题,编译器一般会提供一些针对目标CPU的特殊函数,以及经汇编高度优化的常用函数。,1.3.7 库函数,除了编译器提供针对CPU独有的函数之外,C语言作为一种通用平台,自身也会提供一些实用的函数。C语言国际标准规定了每种C编译器都必须提供格式化输入/输出、字符串操作、数据转换、数学运算等标准函数。,受到简短的C语言入门程序范例的影响,初学者往往将所有的代码都写在一个C文
13、件中。这是一种非常坏的习惯。当程序逐渐变长,只要超过5个屏幕长度,会发现编辑、查找和调试都将变得非常困难。而且这种代码很难用在别的项目中,除非仔细地理顺函数关系,然后寻找并复制每一段函数。,1.4 文件管理,图1.4.1 用文件夹功能管理文件,在编译过程中,同一段C语言代码可以有不同的编译结果。某些编译结果速度特别快,但可能占用ROM比较多,某些编译结果可能占用ROM少,但可能执行速度慢。,1.5 代码优化,1.5 代码优化,图1.5.1 优化选项菜单,1.6 风格,1.6.1 变量命名规则 1.6.2 函数命名规则 1.6.3 表达式 1.6.4 风格一致性 1.6.5 注释 1.6.6 宏
14、定义,1.6.1 变量命名规则,变量名尽量使用具有说明性的名称,避免使用a、b、c、x、y、z等无意义字符。使用范围大的变量,如全局变量,更应该有一个说明性的名称。变量名尽量使用名词,长度控制在14个单词最佳。,1.6.2 函数命名规则,和变量一样,函数名称也应具有说明性。函数名应使用动词或具有动作性的名字,后面可以跟名词说明操作对象。,1.6.3 表达式,表达式应该尽量自然、简洁、无歧义。写代码的时候,要杜绝各类“技巧”。因目标是要写最清晰的代码,而不是最巧妙的代码。,1.6.4 风格一致性,对于书写格式,向来争议很大,例如括号配对就有两种流行的写法:,1.6.5 注释,注释是帮助程序读者的
15、一种手段,但是如果注释只是代码的重复,将会变得毫无意义。若注释与代码矛盾,反倒会帮倒忙。最好的注释是简洁明了的点明程序的突出特征,或者阐明思路,或者提供宏观的功能解释,或者指出特殊之处,以帮助别人理解程序。,1.6.6 宏定义,数值没有任何能表达自身含义的可读性,因此对于程序中出现的数值,它们应该有自己的名字。一般可以用宏定义来实现,并且用宏定义来计算常数之间的关系。在寄存器操作章节中,已经看到头文件中对寄存器地址、标志位等都作了宏定义,用宏对寄存器赋值后,程序立刻有了可读性。类似的,可以用宏定义来对常数数值赋予可读性。,1.7 可移植性,1.7.1 消除CPU差异 1.7.2 消除硬件差异
16、1.7.3 软件层次划分 1.7.4 接口 1.7.5 屏蔽,1.7.1 消除CPU差异,若希望自己写的程序在不同处理器上运行,首先需要了解这些处理器的不同之处。其中包括硬件的不同以及特殊语法的差异。,1.7.2 消除硬件差异,即使同一款单片机,在不同项目中硬件接法仍可能导致程序不通用。以LCD或数码管显示为例,假设连接LCD或数码管的I/O口顺序发生改变,结果将是显示数据与实际段码的关系发生改变。这意味着要重写显示段码表。而且很不幸,出于布线方便的考虑,LCD或数码管的八段连接关系经常被随意调。硬件设计人员大多会这么做:因为显示表的调整可以交给软件处理,布线过程怎么方便怎么连。,1.7.3 软件层次划分,图1.7.1 人机接口的函数层次划分图,1.7.4 接口,接口(Interface)是一个很宽泛的概念。可以广义的理解为两个部件之间的连接。对于每一个函数来说,传入的参数就是输入接口,返回值是输出接口。,1.7.5 屏蔽,在物理学中,“屏蔽”一词的意思是不让干扰电波进出某个区域。软件中借用了“屏蔽”这个概念,指的是不让软件中某个区域的细节(或者说差异)暴露出来干扰编程者的思路