主题中讨论的其他器件: MSP430F6779、 MSPWARE、 MSP430WARE
您好!
你好。 我有一位客户正在处理 MSP430F67791A 的编码问题、请参阅下面他的问题。 非常感谢。
我尝试研究和编辑 tidc620a 中给出的 MSP430F6779_AUX_11.c
请检查函数"EnterLPM35()"。 根据数据表的读数、设置 PMMREGOFF 位后、内核电压必须测量0V。 对吧? 但我的问题是、在关闭主电源后、我仍然可以在 Vcore 上测量1.5V、因此我假设控制器未进入 LPM3.5模式
#include
//用于显示 LCD 字符的查找表
const unsigned int LCD_Char_Map_Top[]=
{
BIT3|BIT2|BIT1|BIT0|BIT7|BIT6、//"0"或"O"
位2|BIT1、//"1"或"I"
BIT3|BIT2|BIT0|BIT7|BIT4、//'2'或'Z'
BIT3 | BIT2 | BIT1 | BIT0|BI5、//'3'
Bit2|BIT1|BIT6|BIT5、//'4'或'y'
BIT3|BIT1 |BIT0|BIT6|BIT4、//'5'或'S'
BIT3|BIT1|BIT0|BIT7|BIT6|BIT4、//'6'或'b'
BIT3 | BIT2 | BIT1、//'7'
BIT3|BIT2|BIT1|BIT0|BIT7|BIT6|BIT4、//"8"或"B"
BIT3|BIT2|BIT1 |BIT0|BIT6|BIT4、//'9'或'g'
};
const unsigned int LCD_Char_Map[]=
{
位2 |位3 |位4 |位5 |位6 |位7、//"0"或"O"
Bit 5 | BIT6、//'1'或'I'
BIT0 | BIT1 | BIT3 | BIT4 | BIT6 | BIT4、//'2'或'Z'
BIT0 | BIT1 | BIT4 | BIT4 | BIT6 | BIT4、//'3'
BIT0 | BIT1 | BIT2 | BIT4 | BIT6、//'4'或'y'
BIT0 | BIT1 | BIT2 | BIT4 | BIT4 | BIT2 | BIT7、//'5'或'S'
BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT4 | BIT4 | BIC7、//'6'或'b'
Bit 5 | BIT6 | BIT4、//'7'
BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT4 | BIT6 | BIT2、//"8"或"B"
BIT0 | BIT1 | BIT2 | BIT4 | BIT4 | BIT6 | BIT4、//'9'或'g'
};
void Board_LPM (void);
void EnterLPM35 (void);
#include
int LPM0_enter=0、LPM35_enter=0;
int i=0、RESET_SOURCE=0、RESET_SOURCE1=0;
int srcLo、srcHi;
void main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止 WDT
RESET_SOURCE=SYSRSTIV;
UCSCTL6 =(UCSCTL6 | XT1DRIVE_3);//针对 XT1启动的最高驱动设置
while (SFRIFG1和 OFIFG)
{
UCSCTL7 &=~(DCOFFG | XT1LFOFFG | XT2OFFG);/*清除 OSC 故障标志*
SFRIFG1 &=~OFIFG;/*清除 OFIFG 故障标志*/
}
UCSCTL6 =(UCSCTL6 &~(XT1DRIVE_3));//将驱动降低至较弱的状态*/
if (RESET_SOURCE1 = 0x08)//刚退出 LPM3.5模式时的情况、这会导致复位。 (但控制永远不会出现在这个 if()内。)
{//从 LPM3.5唤醒时、重新启动
PMMCTL0_H = PMMPW_H;//打开 PMM
// PM5CTL0 &=~LOCKIO;//清除 LOCKBAK 和使能端口
PMMCTL0_H = 0x00;//关闭 PMM
}
P1DIR &=~(BIT0);//将 P1.0设置为输入
P1IE |= BIT0;// P1.0中断被启用
P1IES &=~BIT0;// P1.0高/低边沿
P1IFG &=~BIT0;
PMMCTL0_H = PMMPW_H;
SVSMHCTL &=~SVSMHRRL_7;
SVSMHCTL |= SVSMHRRL_4;
AUXCTL0 = AUXKEY;
AUX2CHCTL = AUXCHKEY | AUXCHC_1 | AUXCHV_1 | AUXCHEN;
AUX3CHCTL = AUXCHKEY | AUXCHC_1 | AUXCHV_1 | AUXCHEN;
AUXCTL2 |= AUX0LVL_6 + AUX2LVL_5;
AUXCTL1 |= AUX2PRIO;
AUXIE |=(AUX0SWIE | AUX2SWIE | AUX2DRPIE);
AUXCTL0_L 和=~LOCKAUX;
PMMCTL0_H = 0;
//设置 LCD
对于(I = 0;I < 20;I++)
{
LCDMEM[i]= 0;
LCDBMEM[i]= 0;//清除闪烁段存储器
}
LCDCCTL0 = LCDDIV_31 | LCDPRE_1 | LCD4MUX | LCDON;
LCDCVCTL = LCDCPEN | VLCD_2_60;
LCDCPCTL0 = 0xFFFF;
LCDCPCTL1 = 0xFFFF;
LCDCPCTL2 = 0xFFC3;
LCDCCPCTL = 0xFFFF;
RTCCTL0 = RTCKEY;
RTCCTL0_L |= RTCRDYIE;//启用 RTC 时间事件、
RTCCTL1 |= RTCBCD | RTCHOLD;// RTC 使能 BCD 模式、RTC 保持
RTCCTL1 &=~(RTCHOLD);//启动 RTC
RTCCTL0_H = 0;
_bis_SR_register (GIE);//启用中断
//Print "RS:xx"、其中 xx 是最后一次复位的源。
LCDM17=BIT5 | BIT7 | BIT4;
LCDM16=BIT0| BIT1 | BIT3 | BIT5 | BIT6;
LCDM15= LCD_Char_Map_Top[RESET_SOURCE >>4];
LCDM14= LCD_Char_Map_Top[RESET_SOURCE 和0xF];
//处理发生复位并从 AUXVCC2运行的情况。
IF (AUXCTL0和 AUX0SW)
{
LPM0_ENTER=0;
LPM35_ENTER=0;
}
否则(AUXCTL0和 AUX2SW)
{
Board_LPM ();
LPM0_ENTER=0;
LPM35_ENTER=1;
AUXCTL1 |= AUX0MD;
AUXCTL1 &=~(AUX0OK);
}
while (1)
{
if (LPM35_ENTER=1)
{
EnterLPM35();//输入 LPM3.5。 RTCRDY 中断将不会被触发。
//与 RTCOFIE、RTCEVIE、RTCAIE 中断不同、这个中断不能从 LPM3.5唤醒 RTC
//但是、RTC 仍在 LPM3.5中计数、尽管您看不到它。
}
}
}
void EnterLPM35 (void)
{
PMMCTL0_H = PMMPW_H;//打开 PMM 寄存器进行写入
PMMCTL0_L |= PMMREGOFF;//并设置 PMMREGOFF (该位不起作用、我相信我可以在 Vcore 为主电源供电时测量1.52v)
_bis_SR_register (LPM4_bits+ GIE);//使用中断进入 LPM3.5模式
__no_operation();//已启用
}
#pragma vector=AUX_Vector
_interrupt void aux_interrupt (void)
{
开关(__evo_in_range (AUXIV、16))
{
AUXI_NONE 案例:
中断;
案例 AUXI_AUXSWNMIFG://*全局(不)可屏蔽电源切换中断标志*
中断;
案例 AUXI_AUX0SWIFG:/*切换到 DVCC 中断标志*
_BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);//退出 LPM0模式(如果处于此模式)
__no_operation();
PMMCTL0_H = PMMPW_H;//打开 PMM
PMMCTL0_L = 0x08;//触发软件上电复位
PMMCTL0_H = 0x00;
LPM35_ENTER=0;
中断;
案例 AUXI_AUX1SWIFG:/*切换到 AUXVCC1中断标志*/
中断;
案例 AUXIV_AUX2SWIFG:/*切换到 AUXVCC2中断标志*/
Board_LPM ();
LPM35_ENTER=1;//当切换到 AUXVCC2时、进入 LPM3.5模式
中断;
案例 AUXI_AUX1DRPIFG://* AUXVCC1低于阈值中断标志*
中断;
案例 AUXI_AUX2DRPIFG://* AUXVCC2低于阈值中断标志*
中断;
案例 AUXI_AUXMONIFG:/*电源监控器中断标志*
中断;
}
}
#pragma vector=RTC_Vector // RTC 中断服务例程
_interrupt void RTC_ISR (void)
{
开关(__evo_in_range (RTCIV、16))
{
案例 RTCIV_NONE://无中断
中断;
案例 RTCIV_RTCOFIFG:// RTCOFIFG
中断;
案例 RTCIV_RTCRDYIFG:// RTCRDYIFG
LCDM8=LCDM4=0x04;//在时间中显示两个“:”
LCDM3 = LCD_Char_Map[RTCHOUR & 0xF];//显示实际时间
LCDM1 = LCD_Char_Map[RTCHOUR >> 4];
LCDM7 = LCD_Char_Map[RTCMIN & 0xF];
LCDM5 = LCD_Char_Map[RTCMIN >> 4];
LCDM11 = LCD_Char_Map[RTCSEC & 0xF];
LCDM9 = LCD_Char_Map[RTCSEC >> 4];
中断;
案例 RTCIV_RTCTEVIFG:// RTCEVIFG
__no_operation();
中断;
案例 RTCIV_RTCAIFG:// RTCAIFG
__no_operation();
中断;
案例 RTCIV_RT0PSIFG:// RT0PSIFG
中断;
案例 RTCIV_RT1PSIFG:// RT1PSIFG
中断;
案例16:中断;//保留
默认值:break;
}
}
void Board_LPM (void)
{
//端口配置
P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;P4OUT = 0x00;P5OUT = 0x00;P6OUT = 0x00;
P7OUT = 0x00;P8OUT = 0x00;P9OUT = 0x00;P10OUT = 0x00;P11OUT = 0x00;PJOUT = 0x00;
P1DIR = 0xFE;P2DIR = 0xFF;P3DIR = 0xFF;P4DIR = 0xFF;P5DIR = 0xFF;P6DIR = 0xFF;
P7DIR = 0xFF;P8DIR = 0xFF;P9DIR = 0xFF;P10DIR = 0xFF;P11DIR = 0xFF;PJDIR = 0xFF;
LCDCCTL0 &=~LCDON;//禁用时钟
//此端口中断会将芯片从 LPM3.5中唤醒。
// P1DIR &=~(BIT0);//将 P1.0设置为输入
P1IE = BIT0;// P1.0中断被启用
P1IES = 0;// P1.0高/低边沿
P1IFG = 0;
}
#pragma vector=Port1_vector
_interrupt void Port_1 (void)
{
P1IFG = 0;// P1.0 IFG 清零
}
这是"tidc620a"中给出的"MSP430F6779_AUX_11.c"的编辑版本
我当时假设微控制器没有从2个观察中进入 LPM3.5。 一个是断电后 Vcore 不变为0V。 接下来、我在辅助中断中添加了'Board_LPM ();'、现在显示为实时且正在触发 RTCIV_RTCRDYIFG
此致、
Ray Vincent