- 芯片型号: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;