1、第第2章章 MSP4301第第2章章 MSP430单片机原理单片机原理2.1 MSP430F249单片机基本结构与原理单片机基本结构与原理MSP430F249的主要结构特点的主要结构特点 供电电压范围供电电压范围 1.8V3.6V。超低功耗:活动状态超低功耗:活动状态270uA(1MHz,2.2V);待机);待机模式模式0.3uA;关机模式;关机模式0.1uA。16位位RISC精简指令集处理器。精简指令集处理器。时钟系统:多种时钟源,可灵活使用。时钟频率达到时钟系统:多种时钟源,可灵活使用。时钟频率达到16MHz;具有内部振荡器;可外接;具有内部振荡器;可外接32kHz低频晶振;低频晶振;外接
2、时钟输入。外接时钟输入。第第2章章 MSP4302 12位位A/D转换器,内部参考电压,采用保持电路。转换器,内部参考电压,采用保持电路。16位定时器位定时器A,3个捕获个捕获/比较寄存器。比较寄存器。16位定时器位定时器B,7个捕获个捕获/比较寄存器。比较寄存器。4个通用串口:个通用串口:USCI_A0和和USCI_A1、USCI_B0和和USCI_B1(I2C、SPI)。60kB+256B的的flash程序存储器,程序存储器,2kB的的RAM数据存储器。数据存储器。64引脚引脚QFP封装。封装。MSP430F249的主要结构特点的主要结构特点第第2章章 MSP4303MSP430F24x系
3、列单片机功能结构示意图 第第2章章 MSP4304MSP430F249单片机引脚图 第第2章章 MSP4305(1)CPU简介简介MSP430单片机的CPU为16位RISC精简指令集的处理器,只有27条正交汇编指令和7种寻址方式。RISC处理器基本上是为高级语言所设计的,编译程序对正交指令系统很容易做到最优化,利于产生高效紧凑的代码。MSP430CPU中集成了16个16位通用寄存器R0R15,其中R0R3分别复用为程序指针PC、堆栈指针SP、状态寄存器SR和常数发生器CG1/CG2。这些寄存器之间的操作只需要一个CPU周期。第第2章章 MSP43061)程序计数器(PC指针)也就是CPU专用寄
4、存器R0,PC指针是一个16位寄存器,可以寻址64kB的空间。MSP430单片机的指令长度以字(16位)为最小单位,而程序存储器单元以字节(8位)为单位,所以PC的值总是偶数。2)堆栈指针SP为CPU专用寄存器R1,SP指针为16为寄存器,也总是偶数的。堆栈是在片内RAM中实现的,通常将堆栈指针设置为片内RAM的最高地址加一。使用C语言编程时,集成编译软件IAR会自动设置堆栈指针初始值。对程序员来说无需关心细节,编译结束后在信息窗提示的编译结果会给出 RAM 使用量的大小,只要不超过 RAM 区实际容量并稍留余量给堆栈用即可。使用汇编语言编程时必须注意堆栈指针的正确设置,否则堆栈可能会覆盖你的
5、变量区,导致程序出错。第第2章章 MSP4307(2)片内存储器MSP430单片机采用冯诺依曼结构,程序存储器flash、数据存储器RAM、特殊功能寄存器以及中断向量全部映射到64kB内部地址空间。MSP430不同型号单片机地址空间略有不同,MSP430F249的存储器结构如表2-2所示。名称地址范围大小中断向量0 xFFFF0 xFFC064B程序存储区flash0 xFFC00 x1100约60kB信息存储区0 x10FF0 x1000256B引导区0 x0FFF0 x0C001kB数据存储区RAM0 x09FF0 x02002kB16位外围模块0 x01FF0 x0100256B8位外围
6、模块0 x00FF0 x0010240B特殊寄存器0 x000F0 x000016B第第2章章 MSP4308模式说明活动模式CPU、所有时钟与外设都为激活状态LPM0CPU关闭、ACLK和SMCLK外设时钟可用LPM1CPU关闭、ACLK和SMCLK外设时钟可用,若活动模式中DCOCLK未使用,则DCO发生器也禁止LPM2CPU关闭、MCLK和SMCLK禁止,DCO发生器使能,ACLK可用LPM3CPU关闭、MCLK和SMCLK禁止,DCO发生器禁止,ACLK可用LPM4CPU关闭且禁用所有时钟表2-3工作模式表第第2章章 MSP43092.2 MSP430单片机的单片机的C语言基础语言基础
7、C语言是一种结构化的高级语言,其优点是语言简洁、表达能力强、使用方便灵活、可读性好、可移植性强。C语言程序本身不依赖单片机硬件,如果更改工程项目中的单片机型号,对C语言程序稍加修改就可以进行程序移植,而且移植程序时不一定要求程序开发人员详细掌握新型号单片机的指令系统。C语言程序的书写格式十分自由。一条语句可以写成一行,也可以写成几行;还可以在一行内写多条语句;但是需要注意的是,每条语句都必须以分号“;”作为结束符。第第2章章 MSP43010为了C语言程序能够书写清晰,便于阅读、理解和维护,在书写C语言程序时最好遵循以下规则。a)一个声明或一条语句占一行;b)不同结构层次的语句,从不同的起始位
8、置开始,机缩进相同的字数;c)用括起来的部分表示程序的某一层次结构。第第2章章 MSP430111)C语言的标识符是用来标识源程序中某个对象名字的。这些对象可以是函数、变量、常量、数组、数据类型、存储方式、语句等。一个标识符由字符串、数字和下划线等组成,第一个字符必须是字母或下划线,通常以下划线开头的标识符是编译系统专用的,因此在编写C语言源程序时一般不要使用以下划线开头的标识符,而将下划线用作分段符。标识符的长度由系统决定,标识符最长可达255个字符,编写源程序时标识符的长度不要超过 32个字符。第第2章章 MSP430122)关键字是一类具有固定名称和特定含义的特殊标识符,又称为保留字。在
9、编写C语言源程序时一般不允许将关键字另作别用,换句话说就是对于标识符的命名不要与关键字相同。上面表2.4所列的C语言关键字由系统保留不能用作用户标识符。3)程序中对于标识符的命名应当简洁明了,含义清晰,便于阅读理解,如用标识符“max”表示最大值,用“TIMER0”表示定时器0等。尽量不要取名“aa”、“bb”等等没有特定意义的标识符,这样虽然没有违反C语言的规则,但是在程序里就很不容易理解。第第2章章 MSP430134)C语言区分大小写字母,C语言编译器在对程序进行编译时,对于程序中同一个字母的大小写作为不同的变量来处理。例如定义一个延时函数的形式参数time,但是如果程序当中再出现一个由
10、大写字母定义的标识符TIME,那么它们在程序当中是两个不同的标识符,是没有冲突的。5)C语言程序中有且只有一个main函数,一个C语言程序,无论main函数的物理位置在那里,总是从main函数开始执行。第第2章章 MSP430146)每句程序语句后面一定要加分号,分号是C语言结构的一部分,如果缺少了就会语法出错。7)注释,在程序中添加注释是为了能更加容易读懂和理解程序,IAR有两种风格的注释方法“/”和“/*-*/”。“/”的意思是在其后面的全部引导为注释,而“/*-*/”的意思是在“/*”开始,一直到遇到“*/”为止,在其里面的内容都被认为是注释。第第2章章 MSP43015Float和do
11、uble的指数位是按补码的形式来表示的,所以float的指数范围为-128+127,而double的指数范围为-1024+1023。float的范围为-2128 +2128,也即-3.40E+38 +3.40E+38;double的范围为-21024 +21024,也即-1.79E+308 +1.79E+308。float和double的精度是由尾数的位数来决定的。float:223=8388608,一共七位,这意味着最多能有7位有效数字,float的精度为7位;double:252=4503599627370496,一共16位,double的精度为16位。第第2章章 MSP43016cons
12、t:定义常量。在 C430 语言中,const关键字定义的常量实际上被放在了 程序存储器flash中,经常用const关键字定义显示表之类的常数数组。extern:声明外部变量,外部变量是指在函数或文件外部定义的全局变量。使用时,extern置于变量或函数前,表示变量或函数的定义在别的文件中,提示编译器在遇到此变量和函数时在其他模块中寻找它的定义,static:定义静态局部变量或静态函数,静态局部变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。有时候希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下次该函数调用时,该变量保留上一次函
13、数调用结束时的值。这时就应该指定局部变量为静态局部变量。第第2章章 MSP43017全局变量:只要定义在函数体(包括主函数)外,就是全局变量了,编译器为全局变量安排特定的数据区,这些数据区为全局变量专用。全局变量一般定义在C程序的开头部分、主函数之前,在与该程序有关的所有文件都可以使用该变量。程序开始时分配空间,程序结束时释放空间,默认初始化为0。对于多文件C语言程序,如果全局变量定义在其它文件中,那么别的程序文件里面的函数要访问另一个文件里面的全局变量,须在对全局变量进行外部变量声明,关键词extern。局部变量是在一个函数内部定义的变量,它只在定义它的那个函数范围以内有效,在此函数之外局部
14、变量即失去意义,因而也就不能使用这些变量了。不同的函数可以使用相同的局部变量名,由于它们的作用范围不同,不会相互干扰。函数的形式参数也属于局部变量。局部变量在每次函数调用时分配存储空间,在每次函数返回时释放存储空间。第第2章章 MSP43018自增、自减运算符说明:+i 意思是:i自增1后再参与运算。-i 意思是:i自减1后再参与运算。i+意思是:i参与运算后,i的值再自增1。i-意思是:i参与运算后,i的值再自减1。复合赋值运算符说明:在赋值运算符“”的前面加上其它运算符,就构成了所谓复合赋值运算符。+加法赋值,右移位赋值,-减法赋值,逻辑与赋值,*乘法赋值,逻辑或赋值,除法赋值,逻辑异或赋
15、值,取模赋值,逻辑非赋值,左移位赋值。第第2章章 MSP430191)尽可能避免浮点运算。对于单片机来说,浮点数的运算速度很慢,RAM开销也大,且有效位数有限;在低功耗应用中CPU运算时间直接关系到平均功耗。因此在编程初期就要养成尽量避免使用浮点数的习惯。2)防止定点数溢出。定点数运算首先要防止数据溢出。3)小数的处理。遇到需要保留小数的运算,可以采用浮点数,但是软件开销较大。用定点数也可以处理小数。原理就是先扩大,再运算。4)尽量减少乘除法。430 单片机没有乘法/除法指令,乘除操作会被编译器转换成移位和加法来实现。如果乘除的数值刚好是 2 的幂,那么可以用移位直接替代乘除法,运算速度会提高
16、很多。第第2章章 MSP43020例如将 P1.0 置高、将 P1.1 置低,将 P1.2 取反,我们可以写成:P1OUT|=0 x01;/P2.0 置高P1OUT&=0 x02;/P2.1 置低P1OUT=0 x04;/P2.2 取反在寄存器头文件中,已经将 BIT0BIT7 定义成 0 x010 x80,上述程序也可以写成:P1OUT|=BIT0;/P2.0 置高P1OUT&=BIT1;/P2.1 置低P1OUT=BIT2;/P2.2 取反对于多位可以同时操作,例如将 P1.1、P1.2、P1.3、P1.4 全部置高/低可以写成:P1OUT|=BIT1+BIT2+BIT3+BIT4;/P1
17、.1/2/3/4 全置高P1OUT&=(BIT1+BIT2+BIT3+BIT4);/P1.1/2/3/4 全置低,注意括号!实际上,这条语句相当于P1OUT|=0 x1e;/P1.1/2/3/4 全置高第第2章章 MSP43021char Key;if(P1IN&BIT5)=0)P2OUT|=BIT0;/若P1.5为低,则P2.0口的LED 亮if(P1IN&BIT5)P2OUT|=BIT1;/若P1.5为高,则P2.1口的 LED 亮if(P1IN&(BIT5+BIT6)P2OUT|=BIT0;/若 P1.5 和 P1.6 任一为高,则点亮LEDif(P1IN&(BIT5+BIT6)!=(B
18、IT5+BIT6)P2OUT|=BIT0;/若 P1.5 和 P1.6 任一为低,则点亮 LEDif(P1IN&BIT5)Key=1;ElseKey=0;/读取 P1.5 状态赋给变量 Key。第第2章章 MSP43022函数是C语言中的一种基本模块。在进行程序设计的过程中,如果所设计的程序较大,一般应将其分成若干个子程序模块,每个子程序模块完成一种特定的功能。在C语言中,子程序是用函数来实现的。对于一些需要经常使用的子程序可以按函数来设计,以供反复调用。此外,EW430编译器还提供了丰富的运行库函数,用户可以根据需要随时调用。这种模块化的程序设计方法,可以大大提高编程效率。从用户的角度来看,
19、有两种函数:标准库函数和用户自定义函数。标准库函数是IAR EW430编译器提供的,不需要用户进行定义,可以直接调用。用户自定义函数是用户根据自己的需要编写的能实现特定功能的函数,它必须先进行定义之后才能调用。第第2章章 MSP43023指针是C语言中一个十分重要的概念,也是C语言的一个难点,曾经有许多人这样讲过,要精通指针的程序员才算正真懂得C语言。只要掌握指针,才能使程序变得更加简洁、紧凑、高效,在C语言当中指针可以谈得上是全部精华的所在。初学者在开始学习时可能会有一点不习惯但是不要灰心,只要我们在平时多思考、多上机,那么很快就可以掌握它了。所谓指针就是指内存中的地址,它可能是变量的地址,
20、也可能是函数的入口地址。如果指针变量存储的地址是变量的地址,则称为变量的指针,简称变量指针;如果指针变量存储的地址是函数的入口地址,则称为函数的指针,简称函数指针。变量的指针就是该变量的地址,可以定义一个指向某个变量的指针变量。为了表示指针变量和它所指向的变量地址之间的关系,C语言提供了两个专门的运算符:*取内容,取地址。第第2章章 MSP43024C语言程序的开始部分通常是预处理命令,如程序中通常遇到的include命令。这个预处理命令通知编译器在对程序进行编译时,将所需要的头文件读入后再一起进行编译。一般在“头文件”中包含有程序在编译时的一些必要的信息,通常C语言编译器都会提供若干个不同用途的头文件。头文件的读入是在对程序进行编译时才完成的。预处理命令通常在程序编译时进行一些符号处理,其并不执行具体的硬件操作。C语言中的预处理命令主要有宏定义指令、文件包含指令和条件编译指令,还有其他一些调试时使用的指令。本章将详细介绍各种预处理命令以及用户配置文件,并结合一定的程序实例以加深理解。预处理指令是以#号开头的代码行,#后是指令关键字,整行语句构成了一条预处理指令。该指令将在编译器进行编译之前对源代码做某些转换。第第2章章 MSP43025