当前位置:文档之家› MSP430单片机深入学习笔记

MSP430单片机深入学习笔记

复位1.POR信号只在两种情况下产生:➢微处理器上电。

➢RST/NMI管脚被设置为复位功能,在此管脚上产生低电平时系统复位。

2.PUC信号产生的条件为:➢POR信号产生。

➢看门狗有效时,看门狗定时器溢出。

➢写看门狗定时器安全健值出现错误。

➢写FLASH存储器安全键值出现错误。

3.POR信号的出现会导致系统复位,并产生PUC信号。

而PUC信号不会引起POR信号的产生。

系统复位后(POR之后)的状态为:➢RST/MIN管脚功能被设置为复位功能。

➢所有I/O管脚被设置为输入。

➢外围模块被初始化,其寄存器值为相关手册上注明的默认值。

➢状态寄存器(SR)复位。

➢看门狗激活,进入工作模式。

➢程序计数器(PC)载入0xFFFE(0xFFFE为复位中断向量)处的地址,微处理器从此地址开始执行程序。

4.典型的复位电路有以下3种:(1)由于MSP430具有上电复位功能,因此,上电后只要保持RST/NMI(设置为复位功能)为高电平即可。

通常的做法为,在RST/NMI管脚接100kΩ的上拉电阻,如图1-5(a)所示。

(2)除了在RST/NMI管脚接100kΩ的上拉电阻外,还可以再接0.1μF的电容,电容的另一端接地,可以使复位更加可靠。

如图1-5(b)所示。

(3)由于MSP430具有极低的功耗,如果系统断电后立即上电,则系统中电容所存储的电荷来不及释放,此时系统电压不会下降到最低复位电压以下,因而MSP430不会产生上电复位,同时RST/NMI管脚上也没有足够低的电平使MSP430复位。

这样,系统断电后立即上电,MSP430并没有被复位。

为了解决这个问题,可增加一个二极管,这样断电后储存在复位电容中的电荷就可以通过二极管释放,从而加速电容的放电。

二极管的型号可取1N4008。

如图1-5(c)所示。

系统时钟振荡器:1.DCO 数控RC振荡器,位于芯片内部。

不用时可以关闭2.LFXT1 可以接低频振荡器,典型的如32.768kHz的钟表振荡器,此时振荡器不需要接负载电容。

也可以接450kHz~8MHz的标准晶体振荡器,此时振荡器需要接负载电容。

3.XT2 接450kHz~8MHz的标准晶体振荡器,此时振荡器要接负载电容,不用时可以关闭。

通常低频振荡器用来降低能量消耗,例如使用电池的系统。

高频振荡器用来对事件作出快速反应或者供CPU进行大量运算。

DCO的振荡频率会受周围环境温度和MSP430工作电压的影响而产生变化,并且同一型号的芯片所产生的频率也不相同。

DCO的调节功能可以改善它的性能。

DCO的调节分为以下3步:(1)选择BCSCTL1.RSELx确定时钟的标称频率。

(2)选择DCOCTL.DCOx在标称频率基础上分段粗调。

(3)选择DCOCTL.MODx的值进行细调。

MSP430定义了3种时钟信号,分别为:(1)MCLK 系统主时钟。

除了CPU运算使用此时钟信号外,外围模块也可以使用。

MCLK可以选择任何一个振荡器产生的时钟信号并进行1、2、4、8分频作为其信号源。

(2)SMCLK 系统子时钟。

外围模块可以使用,并且在使用之前可以通过各模块的寄存器实现分频。

SMCLK可以选择任何一个振荡器产生的时钟信号并进行1、2、4、8分频作为其信号源。

(3)ACLK 辅助时钟。

外围模块可以使用,并且在使用之前可以通过各模块的寄存器实现分频。

ACLK只能由LFXT1进行1、2、4、8分频作为其信号源。

PUC结束时,MCLK和SMCLK的信号源为DCO,DCO的振荡频率约为800kHz(详见相关手册)。

ACLK的信号源为LFXT1。

例3.4 设置MCLK 的时钟8 分频。

下列4 条代码均可实现该功能。

BCSCTL2 |= 0x30; //人肉记忆+数脚趾头,原始社会才干的事!BCSCTL2 |= BIT5+BIT4; //需记忆DIVMx在BSCTL中的位置,不推荐!BCSCTL2 |= DIVM1+DIVM0; //由两项组成,看起来不直观,凑合!BCSCTL2 |= DIVM_3; //简洁明了,力荐!在使用按位或操作符“|=”配置寄存器时,要注意宏定义之间的“叠加”效应。

重新用宏定义配置寄存器前,一定要先清零。

(此外,极少数寄存器上电复位后默认值不是0,要特别注意。

)例3.5 先设定MCLK 分频为2,一段时间后改为4 分频。

错误的代码:BCSCTL2 |= DIVM_1; //这确实是2 分频delay( );BCSCTL2 |= DIVM_2; //因为|=赋值的原因,这实际上是8 分频,请自行面壁想清楚正确的代码:BCSCTL2 |= DIVM_1; // 2 分频delay( );BCSCTL2 &= ~( DIVM_0+ DIVM_1+ DIVM_2+ DIVM_3); // 预先把全部相关控制位置0 BCSCTL2 |= DIVM_2; //此时再用|=设置才不出错相关控制位全置0 还可写成:BCSCTL2 &= ~DIVM_3 或BCSCTL2 &=~(DIVM0+DIVM1)低功耗模式上电和外部复位信号产生POR信号,POR信号会引起PUC信号。

看门狗激活时,定时器溢出和安全键值错误也会引起PUC信号。

PUC信号结束后,MSP430进入AM状态。

在AM 状态程序可以选择进入任何一种低功耗模式,然后在适当的时机,由外围模块的中断使CPU 退出低功耗模式。

LPM0(主力休眠,先头部队工作)和LPM3(主力和先头部队都休眠,仅留警戒哨兵)最常用,LPM4 则当关机使用。

中断MSP430可以在没有事件发生时进入低功耗状态,事件发生时,通过中断唤醒CPU,事件处理完毕后,CPU再次进入低功耗状态。

MSP430的中断分为:系统复位、不可屏蔽中断、可屏蔽中断。

系统复位前面已经作过介绍,其中断向量为0xFFFE。

不可屏蔽中断向量为0xFFFC,产生不可屏蔽中断的原因如下:(1)RST/NMI管脚功能选择为NMI时,RST/NMI管脚上产生一个上升沿或者下降沿(具体是上升沿还是下降沿由寄存器WDTCTL中的NMIES位决定)。

NMI中断可以用WDTCTL中的NMIIE位屏蔽。

需要注意的是,当RST/NMI管脚功能选择为NMI时,不要让RST/NMI 管脚上的信号一直保持在低电平。

原因是如果发生了PUC,则RST/NMI管脚的功能被初始化为复位功能,而此时它上面的信号一直保持低电平,使CPU一直处于复位状态,不能正常工作。

(2)振荡器失效中断允许时,振荡器失效。

(3)FLASH存储器的非法访问中断允许时,对FLASH存储器进行了非法访问。

不可屏蔽中断可由各自的中断允许位禁止或打开。

当一个不可屏蔽中断请求被接受时,相应的中断允许位自动复位。

退出中断程序时,如果希望中断继续有效,则必须用软件将相应中断允许位置位。

中断使用的步骤:1)配置子模块中断相关的寄存器,比如外部中断的上升沿触发还是下降沿触发,定时中断的计数方式和定时值。

2)依模板写中断服务子函数框架,添加中断后要干什么的代码(事件处理函数)。

3)使能子模块的中断,使能总中断。

4)一旦中断发生,CPU 停下主函数的活,并标记位置。

进入中断服务子函数里干活,完事后回到主函数标记位置处继续干活。

我们来看MSP430 的中断子函数模板,加粗斜体部分是允许用户“创意”的地方,其他则是固定格式。

其中,PORT1_VECTOR 是中断向量表中的地址宏定义,直接决定了这个中断子函数是响应哪个中断源。

PORT1_ISR 是中断子函数名,这个最好按标准写法取名字,便于理解。

中断向量表和标准的中断子函数名可见头文件<MSP430G2553.h>。

在MSP430 单片机中,中断资源是比较“宝贵的”,很多中断都是共用一个“中断向量入口”。

比如上面写的是P1 口的中断服务子函数,当P1 的8 个IO 口任何一个检测到中断事件(上升沿或下降沿),就会进入中断子函数。

我们需要在子函数里,查询中断标志位#pragma vector = PORT1_VECTOR__interrupt void PORT1_ISR(void){//中断后想干的事写这里;}LaunchPad 口袋实验平台—MSP-EXP430G2 篇50(特殊功能寄存器),判断一下到底是哪个IO 口“出事”了。

& 按位与, | 按位或, ^ 按位异或AND (位与&) OR ( 位或| ) XOR ( 位异或^ )1 & 1 = 1 1 | 1 = 1 1 ^ 1 = 01 & 0 = 0 1 | 0 = 1 1 ^ 0 = 10 & 1 = 0 0 | 1 = 1 0 ^ 1 = 10 & 0 = 0 0 | 0 = 0 0 ^ 0 = 0C语言提供的位运算符列表:运算符含义描述& 按位与如果两个相应的二进制位都为1,则该位的结果值为1,否则为0| 按位或两个相应的二进制位中只要有一个为1,该位的结果值为1^ 按位异或若参加运算的两个二进制位值相同则为0,否则为1~ 取反~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0<< 左移用来将一个数的各二进制位全部左移N位,右补0>> 右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0写位操作:在对某字节使用“=”进行写操作时,所有位的值都将被改变。

如果先将原字节读出来,再使用“按位”操作符对原字节进行赋值,则可“等效”实现对单个位的写操作。

将P1.0 置1、P1.1 置0、P1.2 取反,不影响其他位。

P1OUT |= 0x01; P1OUT |= BIT0; //“按位或”,相当于置1P1OUT &= ~0x02; P1OUT &= ~BIT1; //取反后再“按位与”,相当于置0 P1OUT ^= 0x04; P1OUT ^= BIT2;//“按位异或”,相当于取反也可以用加号对多位同时操作。

将P1.0、P1.1、P1.2 均置1,不影响其他位。

P1OUT |= BIT0+BIT1+BIT2; //可用加法进行批量设置读位操作:读位操作主要是通过if 语句判断的方法得到的。

同样,这种变通的办法不意味着MSP430 单片机可以对位进行读取,这种方法同样需要对1 个字节的8 位都操作。

Eg:将P2.0 的输出设置成与P1.1 输入相反,读取P1.0 状态到变量Temp。

unsigned char Temp=0;if((P1IN&BIT1)==0) P2OUT |= BIT0; //读P1.1 写P2.0else P2OUT &= ~BIT0;if(P1IN&BIT0) Temp=1; //读P1.0 写Tempelse Temp=0;寄存器配置小结1)一般情况下,均使用宏定义去配置寄存器,这样做省事省力,可读性好。

相关主题