- 芯片型号:MSP430FR6972
- 自己的电路板
- 烧录器型号以及烧录软件版本:稀微离线编程器
- 非官方例程
- 使用的开发环境以及版本:CCS11.1.0
- 电脑操作系统:WINDOWS 11
单片机直接连接3.6V电池,开关机实现方式:
在Fram中创建开关机变量power_state,mcu运行后判断该变量的值,如果是1,就直接开机,如果是0,就进入LPM3
使用IO口外部中断,作为开机按键
开机:按下按键后,进入中断,修改power_state = 1,退出到LPM0
关机:按下按键后,power_state = 0;手动看门狗复位。
目前的问题:短时间运行没有问题,运行超过1个月,关机前运行一切正常,关机后无法正常开机,手动复位(rst引脚接地)也无法运行,外部rtc震荡正常,必须给单片机断电再上电,才能恢复运行。
void main(void)
{
uint16_t i;
WDT_A_hold(WDT_A_BASE);
GpioConfig();
Kp2InterruptConfig();
CsConfig();
RtcConfig();
__enable_interrupt();
while (power_state == 0)
{
LED_RED_OFF;
__bis_SR_register(LPM3_bits);
__no_operation(); // BREAKPOINT HERE to verify the
while (IS_KP2_LOW)
{
LED_RED_ON;
if (rtc_sec - kp2_time > 1)
{
power_state = 1;
break;
}
}
}
LED_GREEN_ON;
LED_RED_ON;
LED_YELLOW_ON;
while(1)
{
}
}
void Kp2InterruptConfig(void)
{
GPIO_selectInterruptEdge(
KP2_PORT,
KP2_PIN,
GPIO_HIGH_TO_LOW_TRANSITION);
GPIO_clearInterrupt(
KP2_PORT,
KP2_PIN);
GPIO_enableInterrupt(
KP2_PORT,
KP2_PIN);
}
void CsConfig(void)
{
GPIO_setAsPeripheralModuleFunctionInputPin(
GPIO_PORT_PJ,
GPIO_PIN4 + GPIO_PIN5,
GPIO_PRIMARY_MODULE_FUNCTION
);
//Set DCO frequency to 8 MHz
CS_setDCOFreq(CS_DCORSEL_0,CS_DCOFSEL_6);
//Set external clock frequency to 32.768 KHz
CS_setExternalClockSource(32768,0);
//Set ACLK=LFXT
CS_initClockSignal(CS_ACLK,CS_LFXTCLK_SELECT,CS_CLOCK_DIVIDER_1);
//Set SMCLK = DCO with frequency divider of 1
CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
//Set MCLK = DCO with frequency divider of 1
CS_initClockSignal(CS_MCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
//Start XT1 with no time out
CS_turnOnLFXT(CS_LFXT_DRIVE_0);
}
void RtcConfig(void)
{
GPIO_setAsPeripheralModuleFunctionInputPin(
GPIO_PORT_PJ,
GPIO_PIN4 | GPIO_PIN5,
GPIO_PRIMARY_MODULE_FUNCTION);
CS_turnOnLFXT(
CS_LFXT_DRIVE_3);
RTC_C_clearInterrupt(RTC_C_BASE,
RTC_C_CLOCK_READ_READY_INTERRUPT);
RTC_C_enableInterrupt(RTC_C_BASE,
RTC_C_CLOCK_READ_READY_INTERRUPT);
RTC_C_startClock(RTC_C_BASE);
}
//开机中断
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = PORT2_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(PORT2_VECTOR)))
#endif
void
Port2Vector(void)
{
kp2_time = rtc_sec;
if (lcd_on == 0)
lcd_on = 1;
LED_RED_ON;
GPIO_clearInterrupt(
KP2_PORT,
KP2_PIN);
__bic_SR_register_on_exit(LPM0_bits);
}
//关机
case KEY_LEFT_LONG:
power_state = 0;
__delay_cycles(8000000 * 2);
WDTCTL = 0xDEAD;
break;