This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
单片机直接连接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;
您复位设备的代码 (WDCTL = 0xDEAD;) 只是一个片段,而不是任何函数的一部分。
您的低功率设置不一致。您设置了 LPM3 (SCG1+SCG0+CPUOFF) ,但在 ISR 中您清除了 LPM0(CPUOFF),这不太好。我以以下几种方法处理这个问题。首先是在头文件中定义一些用于设置和清除低功耗模式的低功耗模式宏,然后在整个项目中使用它们,这便于更改和保持一致。
另一种是使用 LPM4_EXIT,因为这会清除所有 LPM 位,因此设置哪种模式没有影响。