您好!
我能够从 Blow link 运行示例代码。 我正在使用 Launch Pad MSP‑EXP430FR4133。
http://dev.ti.com/tirex/explore/node?node=AIIst5gLtBM7DVuyhd5.8A__IOGqZri__LATEST
现在、我想通过按下按钮来打开几个 LED。 我在下面的 TI 提供的示例代码中添加了突出显示的行、但不会触发 ISR 例程。
如果我移除2条以下的线路、按钮中断开始触发、但 RTC 中断失败。
PMMCTL0_H = PMMPW_H;
PMMCTL0_L |= PMMREGOFF;
能否在 LPM 3.5模式下运行 RTC 和端口 ISR? 请帮助我解决问题
#include
#define pos1 4 //数字 A1 - L4
#define pos2 6 //数字 A2 - L6
#define pos3 8 //数字 A3 - L8
#define pos4 10 //数字 A4 - L10
#define pos5 2 //数字 A5 - L2
#define pos6 18 //数字 A6 - L18
const char digit[10]=
{
0xFC、//"0"
0x60、//"1"
0xDB、//"2"
0xF3、//"3"
0x67、//"4"
0xB7、//"5"
0xBF、//"6"
0xE4、//"7"
0xFF、//"8"
0xF7 //"9"
};
volatile unsigned char * seconds =&BAKMEM0_L;//在备份 RAM 模块中存储秒
volatile unsigned char * minutes =&BAKMEM0_H;//在备份 RAM 模块中存储分钟
volatile unsigned char * hours =&BAKMEM1_L;//在备份 RAM 模块中存储小时数
void initGpio (void);
void incumentRtc (void);
int main( void )
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
//配置 GPIO
initGpio();
//初始化 XT1 32kHz 晶振
P4SEL0 |= BIT1 | BIT2;//将 XT1引脚设置为第二功能
操作
{
CSCTL7 &=~(XT1OFFG | DCOFFG);//清除 XT1和 DCO 故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1 & OFIFG);//测试振荡器故障标志
IF (SYSRSTIV = SYSRSTIV_LPM5WU)//如果 LPM3.5唤醒
{
__ENABLE_INTERRUPT ();// RTC 中断应立即触发...
}
其他
{
//器件从冷启动加电。
//它配置器件并将器件置于 LPM3.5中
*seconds = 0;//将初始时间设置为04:30:00
*分钟=30;
*小时=4;
//配置 RTC
RTCCTL = RTCSS_XT1CLK | RTCIE;//初始化 RTC 以使用 XT1并启用 RTC 中断
RTCMOD = 32768-1;//将 RTC 模数设置为32768以每秒触发一次中断
//配置 LCD 引脚
SYSCFG2 |= LCDPCTL;//选择 R13/R23/R33/LCDCAP0/LCDCAP1引脚
LCDPCTL0 = 0xFFFF;
LCDPCTL1 = 0x07FF;
LCDPCTL2 = 0x00F0;//选择 L0~L26 & L36~L39引脚
LCDCTL0 = LCDSSEL_0 | LCDDIV_7;// flcd 参考频率为 xtclk
//LCD 运行-模式2、内部3.08v、电荷泵256Hz
LCDVCTL = LCDCPEN | LCDSELVDD | VLCD_8 |(LCDCPFSEL0 | LCDCPFSEL1 | LCDCPFSEL2 | LCDCPFSEL3);
/*
// LCD 操作-模式3,内部3.08v,电荷泵256Hz
LCDVCTL = LCDCPEN | LCDREFEN | VLCD_8 |(LCDCPFSEL0 | LCDCPFSEL1 | LCDCPFSEL2 | LCDCPFSEL3);
*
LCDMEMCTL |= LCDCLRM;//清除 LCD 存储器
LCDCSSEL0 = 0x000F;//配置 COM 和 SEG
LCDCSSEL1 = 0x0000;// L0、L1、L2、L3:COM 引脚
LCDCSSEL2 = 0x0000;
LCDM0 = 0x21;// L0 = COM0、L1 = COM1
LCDM1 = 0x84;// L2 = COM2、L3 = COM3
LCDCTL0 |= LCD4MUX | LCDON;//打开 LCD、选择4路复用(LCD4MUX 还包括 LCDSON)
//显示时间
LCDMEM[pos1]= digit[(*hours)/10];
LCDMEM[pos2]= digit[(*hours)% 10];
LCDMEM[pos3]= digit[(*minutes)/10];
LCDMEM[pos4]= digit[(*minutes)% 10];
LCDMEM[pos5]= digit[(*seconds)/10];
LCDMEM[pos6]= digit[(*seconds)% 10];
//显示2个冒号
LCDMEM[7]= 0x04;
LCDMEM[11]= 0x04;
}
PMMCTL0_H = PMMPW_H;//打开 PMM 寄存器进行写入
PMMCTL0_L |= PMMREGOFF;//并设置 PMMREGOFF
_bis_SR_register (LPM3_bits | GIE);//重新进入 LPM3.5
__no_operation();//用于调试器
}
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = RTC_vector
_interrupt void RTC_ISR (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (RTC_vector))) RTC_ISR (void)
其他
错误编译器不受支持!
#endif
{
switch (__evo_in_range (RTCIV、RTCIV_RTCIF))
{
案例 RTCIV_NONE:break;
案例 RTCIV_RTCIF:中断;
默认值:break;
}
}
空 initGpio (空)
{
//将所有 GPIO 配置为输出低电平
P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;
P5OUT = 0x00;P6OUT = 0x00;P7OUT = 0x00;P8OUT = 0x00;
P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;
P5DIR = 0xFF;P6DIR = 0xFF;P7DIR = 0xFF;P8DIR = 0xFF;
//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
P1OUT |= BIT7;//将 P1.3配置为上拉
P1REN |= BIT7;// P1.3上拉寄存器使能
P1IES |= BIT7;// P1.3高/低边沿
P1IE |= BIT7;// P1.3中断被启用
PM5CTL0 &=~LOCKLPM5;
P1IFG &=~BIT7;
}
//端口1中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=Port1_vector
_interrupt void Port_1 (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (Port1_vector))) Port_1 (void)
其他
错误编译器不受支持!
#endif
{
P1IFG &=~BIT7;
P1OUT ^= BIT0;//清除 P1.3 IFG
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//退出 LPM3
}
此致、
Sundar