所有振荡器停止工作。
MCLK禁止?SMCLK禁止?ACLK活动
4.4 低功耗应用原则 n 最大化LMP3的时间?用32.768KHZ晶振作为ACLK时钟?DCO用于CPU激活后突发短暂运行。
n 用接口模块代替软件驱动功能。 n 用中断控制程序运行。
n 用可计算的分支代替标志位测试产生的分支。 n 用快速查表代替冗长的软件计算。 n 避免频繁的子程序和函数调用。 n 在必要时才开启外围模块。
4.5 低功耗模块头文件定义 在msp430x16x. h对低功耗宏定义如下所示? #ifndef __IAR_SYSTEMS_ICC /* Begin #defines for assembler */ #define LPM0 (CPUOFF)
#define LPM1 (SCG0+CPUOFF) #define LPM2 (SCG1+CPUOFF)
#define LPM3 (SCG1+SCG0+CPUOFF)
#define LPM4 (SCG1+SCG0+OSCOFF+CPUOFF)
/* End #defines for assembler */ 注意?以上宏定义是对汇编的定义
在intrinsics.h对低功耗宏定义如下所示? /*Functions for controlling the processor operation modes.*/
#define __low_power_mode_0() (__bis_SR_register( __SR_GIE \\ | __SR_CPU_OFF)) #define __low_power_mode_1() (__bis_SR_register( __SR_GIE \\ | __SR_CPU_OFF \\ | __SR_SCG0)) #define __low_power_mode_2() (__bis_SR_register( __SR_GIE \\ | __SR_CPU_OFF \\ | __SR_SCG1)) #define __low_power_mode_3() \\ (__bis_SR_register( __SR_GIE \\ | __SR_CPU_OFF \\ | __SR_SCG0 \\ | __SR_SCG1))
#define __low_power_mode_4() \\ (__bis_SR_register( __SR_GIE \\ | __SR_CPU_OFF \\ | __SR_SCG0 \\ | __SR_SCG1 \\ | __SR_OSC_OFF))
#define __low_power_mode_off_on_exit() \\ (__bic_SR_register_on_exit( __SR_CPU_OFF \\ | __SR_SCG0 \\ | __SR_SCG1 \\
| __SR_OSC_OFF)) 注意?上述是对C语言的定义 www.docin.com 24 进入LPM0模式?可以通过调用__low_power_mode_0();函数来完成。 进入LPM1模式?可以通过调用__low_power_mode_1();函数来完成。 进入LPM2模式?可以通过调用__low_power_mode_2();函数来完成。 进入LPM3模式?可以通过调用__low_power_mode_3();函数来完成。 进入LPM4模式?可以通过调用__low_power_mode_4();函数来完成。 退出LPM模式?则调用__low_power_mode_off_on_exit();来实现。
4.6 低功耗模块例程 #include
// P1 中断服务子程序
#pragma vector = PORT1_VECTOR __interrupt void P1_IRQ(void) {
P1IFG = 0; // 清除中断标志 __low_power_mode_off_on_exit(); // 退出低功耗模式 }
void main(void) {
WDTCTL = WDTPW + WDTHOLD;
P1DIR &= BIT0; // P1.0输入 P1IE |= BIT0; // P1.0开中断 P1IES |= BIT0; // P1.0下降沿中断 _EINT();
while(1) {
_NOP(); // 空语句
__low_power_mode_0(); // 进入LPM0模式
// 当程序执行到上述语句后, 程序会停止到该语句, 并进入低功耗状态 // 当P1.0出现下降沿的时候, 在P1的中断服务子程序退出低功耗模式 // 则会再次运行_NOP();语句, 然后在进入底功耗 } }
www.docin.com 25 第五章I/O端口 Input / Output Port
端口是MSP430及其重要的资源。MSP430F169单片机共有六组端口?每组端口均为8位并且均可
独立编程?但每组端口均不提供位操作指令。目前MSP430所有系列总线均不对外开放?端口不但用于输
入/输出?还可为MSP430系统扩展等应用提供必要的逻辑控制信号
www.docin.com 26 5.1 I/O端口概述 MSP430F169端口的主要特点为? n 类型丰富?MSP430F169有P1、P2、P3、P4、P5、P6共六组独立的端口。 n 功能丰富?MSP430F169各组端口功能如下表所示。 端口 功能
P1、P2 I/O、中断能力、其它片内外设功能 P2、P3、P4、P6 I/O、其它片内外设功能
?编者按?其他类型的单片机还有S?COM端口?是用做段码液晶驱动的?F196没有? n 丰富的寄存器
MSP430各种端口有大量的控制寄存器供用户使用?从而提高了端口的输入/输出灵活性。其中P1和P2
有7个寄存器?P3?P6各有4个寄存器。通过设置寄存器?可实现以下功能? ① 每个I/O都可独立编程
② 允许任意组合输入、输出和中断
③ P1和P2所有8位全都可做外部中断处理 ④ 可以使用所以指令对寄存器操作
⑤ 可以按字节输入、输出?也可按位进行操作
5.2 端口控制寄存器 端口P1具有输入/输出、中断和外部模块功能?这些功能可通过7个控制寄存器的设置来实现。下面介绍
各控制寄存器特点及其使用? [1] PxDIR 输入/输出方向寄存器
相互独立的8位分别定义了Px口的8位的输入输出方向。在PUC复位后PIDIR各位均复位。 使用输入/输出功能时?应先定义端口方向。作为输入时?只能读?作为输出时?可读可写。 PxDIR.x?端口输入输出方向控制 0? 输入模式 1? 输出模式
操作? P1DIR |=0x10; // P1.4作输出?其余各位端口方向不变。 P1DIR &=0x7f; // P1.7作输入?其余各位端口方向不变。
www.docin.com 27 [2] PxIN 输入寄存器
该寄存器是只读寄存器。只能通过读取该寄存器内容才能知道Px口的输入信号的状态。 读出此寄存器的内容中?只有Px口设为输入的数据位有效。 对于Px口设为输出的那些位?一般来说?PxIN.x = PxOUT.x PxIN.x?端口输入的电平 0? 端口输入低电平 1? 端口输入高电平
操作? unsigned char Temp;
P1DIR &=0x77 ; // P1.3和P1.7输入
Temp = P1IN; // Temp为在已定义的一变量?Temp 中只要第7位和第四位有效。
[3] PxOUT 输出寄存器
该寄存器可读可写?读取时?其内容与Px口引脚定义无关。改变方向寄存器的内容?此寄存器内容不受 影响。
PxOUT.x?端口输出的电平 0? 端口输出低电平 1? 端口输出高电平 注意?
P1OUT.0 = 1?P1.0输出高??但是P1DIR.0 = 0?该引脚为输入模式??则此时P1.0为输入?
如果将P1DIR.0 = 1?该引脚为输出模式??则此时P1.0为输出?并且输出为高电平。
操作? P1DIR |=0x88; // P1.3和P1.7输出 P1OUT |=0x88; // P1.3和P1.7输出高电平
www.docin.com 28 [4] PxSEL 引脚功能选择寄存器
该寄存器可读可写?如果有该引脚具有特殊功能的话?则可以通过该寄存器使用特殊功能。 PxSEL.x?引脚功能选择
0? 该引脚的普通O/I端口 1? 该引脚的功能端口
[5] PxIFG 中断标志寄存器
该寄存器只有P1和P2口才有?该寄存器有8个标志位?标志相应引脚是否有中断请求。 PxIFG.x?中断标志 0? 该引脚无中断请求 1? 该引脚有中断请求 [6] PxIE 中断允许寄存器
该寄存器只有P1和P2口才有?该寄存器有8个标志位?标志相应引脚是否能响应中断请求。 PxIFG.x?中断允许标志 0? 该引脚中断禁止 1? 该引脚中断允许
[7] PxIES 中断触发沿控制寄存器
该寄存器只有P1和P2口才有?该寄存器有8个标志位?标志相应引脚的中断触发沿。 PxIFG.x?中断触发沿选择 0? 上升沿产生中断 1? 下降沿产生中断
www.docin.com 29 5.3 端口原理图 P1端口的引脚原理图?P1.0 ~ P1.7?