主题中讨论的其他器件: MSP430FR2433
MSP430FR2422用作 RTC、3.0V 电池作为备用。
系统在正常运行(AM)期间运行@ 5V 电源。当无电源(5V)时、系统切换至3.0V 电池 电源和控制器开关
将唤醒源作为引脚中断和 RTC 计时器溢出 中断的 LPM3、5设置为 LPM3。
问题案例:当系统在工作模式下从5V 电压运行时,某个时间控制器挂起且从不恢复。 仅在上电复位时恢复。
注意:当控制器挂起时,它会观察到它始终处于活动模式,而不是处于 LPM。
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.
MSP430FR2422用作 RTC、3.0V 电池作为备用。
系统在正常运行(AM)期间运行@ 5V 电源。当无电源(5V)时、系统切换至3.0V 电池 电源和控制器开关
将唤醒源作为引脚中断和 RTC 计时器溢出 中断的 LPM3、5设置为 LPM3。
问题案例:当系统在工作模式下从5V 电压运行时,某个时间控制器挂起且从不恢复。 仅在上电复位时恢复。
注意:当控制器挂起时,它会观察到它始终处于活动模式,而不是处于 LPM。
Prashanth、您好!
您没有直接从5V 电源轨运行 MSP430FR2422、对吧? 根据您的措辞、我认为不是这样、但我只想确保。 此外、您在多个电路板上还是仅在单个电路板上看到这种情况?
[引用 userid="508943" URL"~μ C/support/microcontroller /msp-lust-power-microcontroller 组/msp430/f/msp-lust-microcontroller 论坛/1114039/msp430fr2422-control-ging-hung in -active-mode"]至 LPM3、5、其中唤醒源作为引脚中断、RTC 计时器溢出 [引用/引用]您如何配置 RTC 计数器、计时器溢出的间隔是多少?
如果 缩短此间隔、您是否看到故障发生得更快?
[~用户名="508943" URL" URL ="μ C/支持/微控制器/MSP-low 功耗微控制器-group/msp430/f/MSP-low 功耗微控制器-forum/1114039/msp430fr2422-control-ging-hung in -active-mode"]问题案例:当系统在工作模式下从5V 电压运行时,某个时间控制器挂起且从不恢复。 仅在上电复位时恢复。
注意:当控制器挂起时,它会观察到它始终处于活动模式,而不是处于 LPM。
[/报价]发生故障通常需要多长时间? 此外、您如何确定功率模式、是通过电流测量还是通过其他方法来确定功率模式?
此致、
Brandon Fisher
您好!
MSP430FR2422 将从两个电源获取电源
1.外部5V,转换为3.1v。
2.无 外部电源时的板载电池3.1v。
[~ userid="315008" URL"支持/微控制器/MSP-low-power-microcontrollers-group/msp430/f/MSP-low-power-microcontroller-forum/1114039/msp430fr2422-control-ging-hung in -active-mode/4128968#4128968 "]您如何为您的 RTC 溢出计数器和计数器间隔配置什么计数器? [/报价]RTC 计数器配置有外部晶振(32768Hz、进一步除以 1024。
在正常运行(AM)下、它溢出@34 min、即65279计数
在从 AM 转换到 LPM3.5期间。
RTC 将重新配置为在2秒(即64个计数)发生溢出。这样我们就可以验证
电源转换、并且由于噪声而未触发。 验证后、将 RTC 溢出配置回34分钟
断电 检测通过使用 ADC (使用 v ref internal 1.5v 配置)完成。
if (gAdcFltr>=10) 检测到断电
{
UCA0IE &=~UCRXIE; //可调 UART 中断
gAdcFltr=0;
*(unsigned int *)(BKMEM_BAS+2)=(*(unsigned int*)&TIMESTAMP[0]);
*(unsigned int *)(BKMEM_BASE+4)=(*(unsigned int*)&TIMESTAMP[2]);
SYSCFG2 &=~(ADCPCTL3);
P1SEL0 = 0;
P1SEL1 = 0;
P1DIR =(BIT0 |BIT1 |BIT2 | BIT3 | BIT4 | BIT5| BIT6 | BIT7);
P2DIR =(BIT2 | BIT3 | BIT4 | BIT5| BIT6 | BIT7);
P1OUT = 0;
P2OUT = 0;
P2IES = 0x00;//低边沿到高边沿
P2IFG = 0;
P2IE = 0;
/_________________________
ADCCTL0 &=~(ADCSHT_2 | ADCON);// ADCON、S&H=16 ADC CLKS
ADCCTL1 &=~ADCSHP;// ADCCLK = MODOSC;采样计时器
// ADCCTL2 |= ADCRES;// 10位转换结果
ADCIE &=~ADCIE0;//启用 ADC 转换完成中断
ADCMCTL0 &=~(ADCINCH_3 | ADCSREF_1);// A1 ADC 输入选择;Vref=1.5V
// RTC 溢出更改为2秒
{
unsigned int temp;
RTCMOD = 64;
temp = RTCCNT;
RTCCTL = 0x2742; //重置 RTC 计数器
gRtcTMRCntVal += temp;
gRtcSecCounter +=(gRtcTMRCntVal /32);
gRtcTMRCntVal = gRtcTMRCntVal%32;
}
//_________________ 输入 LMP3.5_________________
PMMCTL0_H = PMMPW_H;//打开 PMM 寄存器进行写入
PMMCTL0_L |= PMMREGOFF;//并设置 PMMREGOFF
PMMCTL2 &=~INTREFEN;//禁用内部基准
PMMCTL0_H = 0;//锁定 PMM 寄存器
__no_operation();
__no_operation();
__no_operation();
_bis_SR_register (LPM3_bits | GIE);//使用中断转至 LPM3
__no_operation();
}
您好、Brandon、
以下是我的主 UART ISR 缺失( 那里没有这样的挂起代码,但假设标志是自动清除,我不清除那里的任何标志)。
多个电路板存在该问题、
测试条件:电路板使用连续5V 电源运行,RTC 电路板连接到另一个5V 电源的电路板
提供给我们的 RTC 板。电机和螺线管等负载连接到其他板、因此可能会产生噪声。
某些时间板在10分钟内挂起、甚至需要一天的时间。
/* --COPYRIGHT--,BSD_EX * Copyright (c) 2014, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************* * * MSP430 CODE EXAMPLE DISCLAIMER * * MSP430 code examples are self-contained low-level programs that typically * demonstrate a single peripheral function or device feature in a highly * concise manner. For this the code may rely on the device's power-on default * register values and settings such as the clock configuration and care must * be taken when combining code from several examples to avoid potential side * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware * for an API functional library-approach to peripheral configuration. * * --/COPYRIGHT--*/ //****************************************************************************** // MSP430FR2422 Demo - RTC, device enter LPM3.5 and toggle P1.0 in RTC // interrupt handling every 1s // // // Description: Device enter LPM3.5 after configuring the RTC. The RTC wakes // the device up from LPM3.5 every second and toggles P1.0. // It also stores the state of P0OUT in the Backup RAM Registers. // // XT1 = 32kHz, ACLK = default, MCLK = SMCLK = default, DCODIV = ~1MHz. // // MSP430FR2422 // ----------------- // /|\| | // | | | // | | XIN(P2.0)|-- // --|RST | ~32768Hz // | XOUT(P2.1)|-- // | | // | P1.0|-->LED // // Rui Ji // Texas Instruments Inc. // May 2017 // Built with IAR Embedded Workbench v6.50 & Code Composer Studio v7.0.0 //****************************************************************************** #include <msp430.h> #include <string.h> #include <stdlib.h> #include "app\sysDef.h" #include "app\SerialCom.h" #include "app\flashStorage.h" #include "app\dataFrames.h" #include "app\myRtc.h" #include "app\utility.h" //#pragma PERSISTENT (timeStamp) unsigned char timeStamp[4] = {0}; #pragma PERSISTENT (gMemoryExtRtcAry) unsigned char gMemoryExtRtcAry[sizeof(EXT_RTC_STRUCT)] = {0}; #pragma PERSISTENT (tst) unsigned char tst=0; extern unsigned char uartRcvdByte; extern void frameProcess(void); extern volatile unsigned char dataFrameFlg,dataIndex; extern unsigned char uartDataFrame[]; extern RTC_VALUE_STRUCT gRtc; //_____Function protos_____________________________________ void adcInit(void); void sysInit(void); void uartInit(void); void enterLPM_3_5(void); unsigned char isFlashWrtRqd(void); void clearOCD(void); void dly1(unsigned int count); void dly_pump_check_at_powerup(void); void sysInit(void); void processFilterLife(void); void filter_life_update(void); void ResetFunctionality(void); unsigned char isTimeValid(RTC_VALUE_STRUCT* time); unsigned char rtcTimeValidation(void); void updateServiceDays(void); unsigned long getDateTimeInMin(RTC_VALUE_STRUCT date); unsigned int getAdc(void); //________________________Variables________________________ unsigned char gCryptoCode1,gRand1; const unsigned int gMntToDays[13]={0,0,31,59,90,120,151,181,212,243,273,304,334}; volatile Sflags gFlags; volatile struct ProductStatus productStatus; unsigned char gSecCounter; unsigned char rquestId=0,rqstReTry; EXT_RTC_STRUCT gExtRtcData,gStoredExtRtcData,gMemoryExtRtcData; volatile unsigned char g_Mode=0,g_PowerOnDly,gRtcReady; volatile unsigned char g_Mode11; unsigned int ADC_Result=0; volatile unsigned char gAdcReady=0; volatile unsigned char gAdcFltr=0; volatile unsigned char gTmOutCntr=0; //________________________________________________________ int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop WDT // SFRRPCR |= (SYSRSTUP__PULLUP|SYSRSTRE__ENABLE); SFRRPCR |= (SYSRSTUP__PULLUP|SYSRSTRE__ENABLE|SYSNMI__NMI); P1DIR = (BIT0 |BIT1 |BIT2 | BIT3| BIT4| BIT5| BIT6| BIT7); // make all port output and make it zero P2DIR = ( BIT3| BIT4| BIT5| BIT6| BIT7); P1OUT = 0; P2OUT = 0; //___ Initialize XT1 32kHz crystal______________________________________ P2SEL1 |= BIT0 | BIT1; // set XT1 pin as second function do { CSCTL7 &= ~(XT1OFFG | DCOFFG); // Clear XT1 and DCO fault flag SFRIFG1 &= ~OFIFG; }while (SFRIFG1 & OFIFG); // Test oscillator fault flag __bis_SR_register(SCG0); // disable FLL //CSCTL3 |= SELREF__XT1CLK; // Set XT1CLK as FLL reference source CSCTL3 |= SELREF__REFOCLK; // Set XT1CLK as FLL reference source //CSCTL4 = SELMS__XT1CLK | SELA__XT1CLK; // set ACLK = XT1CLK = 32768Hz CSCTL4 = SELA__XT1CLK; // set ACLK = XT1CLK = 32768Hz //SFRIE1 |= OFIE; //enable interrupt for oscillator fault //______________________________________________________________________ // PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode to activate previously configured port settings // First determine whether we are coming out of an LPMx.5 or a regular RESET. if (SYSRSTIV == SYSRSTIV_LPM5WU) // When woken up from LPM3.5, reinit { // RTCIV = 0; if(RTCIV) // code restarted with rtc overflow? { if(RTC_LPM_RELOAD != RTCMOD) //rtc in normal(34min) or its validating mode(2 sec)? { unsigned int temp; gRtcSecCounter+=2; RTCMOD = RTC_LPM_RELOAD; // 34 min overflow temp = RTCCNT; RTCCTL = 0x2742; // reset counter gRtcTMRCntVal += temp; }else { // overflow time keeping RTC_TEMP_CNTR = (RTC_TEMP_CNTR+ 1); } RTCIV=0; // clear interrupt flag } else // woke up due to power on wake up pin so enter into lpm for validation 2 sec { //entering into rtc validation mode { unsigned int temp; RTCMOD = RTC_VALIDATION_RELOAD0; temp = RTCCNT; RTCCTL = 0x2742; // reset counter gRtcTMRCntVal += temp; gRtcSecCounter += (gRtcTMRCntVal/32); gRtcTMRCntVal = gRtcTMRCntVal%32; } P2IFG = 0; P2IE = 0; // disable pin wake up PM5CTL0 &= ~LOCKLPM5; PMMCTL0_H = PMMPW_H; // Open PMM Registers for write PMMCTL0_L |= PMMREGOFF; // and set PMMREGOFF PMMCTL0_H = 0; // Lock PMM Registers __no_operation(); __no_operation(); __bis_SR_register(LPM3_bits | GIE); // Go to LPM3 with interrupt __no_operation(); } // code comes her only on rtc wake up RTC validation P2DIR &= ~BIT2; P1DIR &= ~BIT3; PM5CTL0 &= ~LOCKLPM5; P2IFG = 0; if(POWER_STATUS!=0) // chaeck power condition { // powered (*(unsigned int*)&timeStamp[0])=*(unsigned int *)(BKMEM_BASE+2); (*(unsigned int*)&timeStamp[2])=*(unsigned int *)(BKMEM_BASE+4); uartInit(); //______timer____________________ TA0CCTL0 |= CCIE; //eNABLE INTERRUPT TA0CTL = TASSEL_1+MC_1+ID_3; //TASSEL_1 -use ACLK,MC_1 upcount,ID_3 -divide by 3 // TA0CTL = TASSEL_1+MC_0+ID_3; //TASSEL_1 -use ACLK,MC_0 hALT,ID_3 -divide by 3 TA0CCR0 = 2048;//; //500msec value //________________Port Pin Interrupt______________ P2IE = 0; // disable interrupt //____________adc config_____________ { adcInit(); } __enable_interrupt(); }else // not powered enter into LPM with pin interrupt { //Entering into Low power mode with wakeup interrupt P2DIR &= ~BIT2; P1SEL0 = 0; P2SEL1 = BIT0 | BIT1; P1OUT = 0; P2OUT = 0; P2IES = 0x00; // 2.2 Low to High edge P2IFG = 0; P2IE = BIT2; // enable pin interrupt PMMCTL0_H = PMMPW_H; // Open PMM Registers for write PMMCTL0_L |= PMMREGOFF; // and set PMMREGOFF PMMCTL0_H = 0; // Lock PMM Registers __no_operation(); __no_operation(); __bis_SR_register(LPM3_bits | GIE); // Go to LPM3 with interrupt __no_operation(); } } else // restart due to reset or power on reset { RTC_VALUE_STRUCT dd; // load a default time value dd.min =0; dd.hr = 1; dd.day = 1; dd.month = 1; dd.year =22; // Device powered up from a cold start. uartInit(); //PM5CTL0 &= ~LOCKLPM5; RTC_TEMP_CNTR = 0; gRtcTMRCntVal = 0; gPwrOffCount = 0; gPwrOffCount_Dbg=0; gRtcSecCounter=0; gRtcVlidnReloadInex=0; // Initialize RTC SYSCFG2 = RTCCKSEL; // Set RTC CLK to ACLK RTCMOD = RTC_LPM_RELOAD; RTCCTL = RTCSS__XT1CLK | RTCSR | RTCPS__1024 | RTCIE; //______timer____________________ TA0CCTL0 |= CCIE; //eNABLE INTERRUPT TA0CTL = TASSEL_1+MC_1+ID_3; //TASSEL_1 -use ACLK,MC_1 upcount,ID_3 -divide by 3 // TA0CTL = TASSEL_1+MC_0+ID_3; //TASSEL_1 -use ACLK,MC_0 hALT,ID_3 -divide by 3 TA0CCR0 = 2048;//; //500msec value //________________Port Pin Interrupt______________ P1OUT = 0x00; P2IE = 0; // disable interrupt //____________adc config_____________ { adcInit(); } (*(unsigned long*)timeStamp)=convertDateToTmStamp(&dd); __enable_interrupt(); } //________________App start_______________________________________________ P1DIR |= BIT2; // enable TXT level conversion P1OUT |= BIT2; // enable TXT level conversion mosfet turned on PM5CTL0 &= ~LOCKLPM5; initFlashData(); gRtcReady=0; gAdcFltr =0; __bic_SR_register(SCG0); // enable fll #ifdef _DEBUG uart1_put_value("Start",1); #endif //______________Init Variable______________________________________________ memset((unsigned char*)&productStatus,0,sizeof(struct ProductStatus)); memset((unsigned char*)&gFlags,0,(sizeof(Sflags))); SEC_LOOP_FLG = 0; gSecCounter = 0; g_Mode = 0; g_PowerOnDly = PWR_ON_DLY; // To out put aclk clk @ P11 P1DIR |=(BIT1|BIT2); P1SEL1 |= BIT1 ; while(1) { enterLPM_3_5(); // check power condition //___________Delay Timer_______________________________ if(_500mSEC_TOGLE_STATUS) { _500mSEC_TOGLE_STATUS = 0; _500mSEC_LOOP_FLG = 1; gSecCounter++; if(gSecCounter>1) { SEC_LOOP_FLG = 1; gSecCounter = 0; } } //__________________data frames _____________________________________ if(dataFrameFlg == 2 ) // frames available for processing { frameProcess(); dataFrameFlg =0; dataIndex =0; } else // periodic data frames { if(_500mSEC_LOOP_FLG==1) { //if(rquestId == 0) { if(gRtcReady) putDateTime(CMD_PERIODIC); } /*else { if(gRtcReady) putDateTime(CMD_PERIODIC); }*/ } } //__________________1 Sec Section__________________________________________ if(SEC_LOOP_FLG) { // if(g_PowerOnDly == 0) { readRTC(); gRtcReady = 1; } #ifdef _DEBUG { // char str[30]={0}; /* strcat(str, "Rtc "); itoa(gRtc.hr,(unsigned char*)&str[strlen(str)]); strcat(&str[strlen(str)], ":"); itoa(gRtc.min,(unsigned char*)&str[strlen(str)]); strcat(&str[strlen(str)], ":"); itoa(secRTC,(unsigned char*)&str[strlen(str)]); strcat(&str[strlen(str)], " "); itoa(gRtc.day,(unsigned char*)&str[strlen(str)]); strcat(&str[strlen(str)], "/"); itoa(gRtc.month,(unsigned char*)&str[strlen(str)]); strcat(&str[strlen(str)], "/"); itoa(gRtc.year,(unsigned char*)&str[strlen(str)]); uart1_put_value((unsigned char*)str,0); */ // uart1_put_value("PC",gPwrOffCount_Dbg); } #endif //___________________Flash Write___________________________________ if(productStatus.status9.status9_bits.compStatus == 1) { if(isFlashWrtRqd()) { Write_DATAFLASH_ARRAY((unsigned char *)&gStoredExtRtcData,sizeof(EXT_RTC_STRUCT)); memcpy(&gMemoryExtRtcData,&gStoredExtRtcData,sizeof(EXT_RTC_STRUCT)); // uart0_put_value("Flash Write :",1); } } } //__________________end of 1 Sec Section__________________________________________ if(g_PowerOnDly) { g_Mode = MODE_POWER_ON; secDownCounter((unsigned char*)&g_PowerOnDly); } else { g_Mode = MODE_IDLE; } //______________________________________________________ SEC_LOOP_FLG = 0; _500mSEC_LOOP_FLG = 0; } } #pragma vector = RTC_VECTOR __interrupt void RTC_ISR(void) { RTCIV = 0; RTC_TEMP_CNTR += 1; } #pragma vector=PORT2_VECTOR __interrupt void Port_2(void) { //Clear P1.3 IFG if no port1 pins are configured as interrupt // uart1_put_value("int P2 ",P2IN); P2IFG = 0; } #pragma vector=PORT1_VECTOR __interrupt void Port_1(void) { P1IFG = 0; //Clear P1.3 IFG if no port1 pins are configured as interrupt } // TIMER A interrupt service routine #pragma vector=TIMER0_A0_VECTOR __interrupt void TIMER0_A0_ISR(void) { _500mSEC_TOGLE_STATUS = 1; TA0CCTL0 &= ~CCIFG; } #pragma vector=UNMI_VECTOR __interrupt void UNMI_ISR(void) { /* do { // set a breakpoint on the line below to observe XT1 operating from VLO // when the breakpoint is hit during a crystal fault CSCTL7 &= ~XT1OFFG; // Clear XT1 fault flag SFRIFG1 &= ~OFIFG; __delay_cycles(25000); // time for flag to get set again }while (SFRIFG1&OFIFG); // Test oscillator fault flag */ // SFRIFG1 &= ~NMIIFG; } unsigned char isFlashWrtRqd(void) { // if(compRTC_DateTime()) // { // //if(gExtRtcData.flags.RTC_startBit ==1) // { // gStoredExtRtcData.gRtcValue.year = gExtRtcData.gRtcValue.year; // gStoredExtRtcData.gRtcValue.month = gExtRtcData.gRtcValue.month; // gStoredExtRtcData.gRtcValue.day = gExtRtcData.gRtcValue.day; // gStoredExtRtcData.gRtcValue.hr = gExtRtcData.gRtcValue.hr; // gStoredExtRtcData.gRtcValue.min = gExtRtcData.gRtcValue.min; // return 1; // } // } if(gStoredExtRtcData.flags.RTC_startBit != gMemoryExtRtcData.flags.RTC_startBit) return 1; // if(gStoredExtRtcData.flags.RTC_tamperedBit != gMemoryExtRtcData.flags.RTC_tamperedBit) return 1; // if(abs(gStoredExtRtcData.actualDays - gMemoryExtRtcData.actualDays) > 0) return 1; return 0; } unsigned char isTimeValid(RTC_VALUE_STRUCT* time) { if((time->min>59)||(time->hr>23)||(time->day>31)||(time->day<1)||(time->month>12)||(time->month<1)||(time->year<21)||(time->year>99)) { return 0; } return 1; } //unsigned char rtcTimeValidation(void) //{ // unsigned long time1=0; // unsigned char ret = 0; // if(productStatus.status9.status9_bits.compStatus == 1) // { // time1 = getDateTimeInMin(gStoredExtRtcData.gRtcValue); //// time1=((unsigned long)(gStoredExtRtcData.gRtcValue.year*365)*(24 *60)); //// time1+=((unsigned long)gMntToDays[gStoredExtRtcData.gRtcValue.month]*(24 *60)); //// time1+=(gStoredExtRtcData.gRtcValue.day*24*60); //// time1+=((gStoredExtRtcData.gRtcValue.hr*60)+gStoredExtRtcData.gRtcValue.min); // // currentTime = getDateTimeInMin(gRtc); //// currentTime=((unsigned long)(gRtc.year*365)*(24 *60)); //// currentTime+=((unsigned long) gMntToDays[gRtc.month]*(24 *60)); //// currentTime+=(gRtc.day*24*60); //// currentTime+=((gRtc.hr*60)+gRtc.min); // // // // if(currentTime>=time1) // { // // ret= 0; // // } // else // { // ret= RTC_TAMPERED; // //uart0_put_value("t set : ",2); // //uart0_put_value("currentTime: ",currentTime); // //uart0_put_value("time1: ",time1); // } // // //uart0_put_value("time1: ",time1); // //uart0_put_value("time2: ",time2); // //uart0_put_value("ret:",ret); // if(ret == 0) // { // memcpy(&gStoredExtRtcData.gRtcValue,&gRtc,sizeof(RTC_VALUE_STRUCT)); // updateServiceDays(); // } // // } // if(ret ==1) // { // gStoredExtRtcData.flags.RTC_tamperedBit = 1;//uart0_put_value("t set : ",0); // }else // { // gStoredExtRtcData.flags.RTC_tamperedBit =0; // //uart0_put_value("t clr : ",0); // } // // return ret; // //} unsigned long getDateTimeInMin(RTC_VALUE_STRUCT date) { unsigned long ret; ret=((unsigned long)( date.year*365)*(24 *60)); ret+=((unsigned long) gMntToDays[ date.month]*(24 *60)); ret+=( date.day*24*60); ret+=(( date.hr*60)+ date.min); return ret; } void Write_DATAFLASH_ARRAY(unsigned char* wData,unsigned char length) { unsigned char i; for(i=0;i<length;i++) { SYSCFG0 = FRWPPW | DFWP; gMemoryExtRtcAry[i]=wData[i]; SYSCFG0 = FRWPPW | PFWP | DFWP; } } void Read_DATAFLASH_ARRAY(unsigned char* rData,unsigned char length) { unsigned char i; for(i=0;i<length;i++) { rData[i] = gMemoryExtRtcAry[i]; } } void enterLPM_3_5(void) { // uart1_put_value("Ent LPM3 : ",(*(unsigned long*)timeStamp)); getAdc(); if(ADC_Result<POWER_OFF_THLD) { do { __delay_cycles(10); getAdc(); if(gAdcReady == 0) { gAdcFltr =0; break; } else { if(ADC_Result<POWER_OFF_THLD) gAdcFltr++; else { gAdcFltr =0; break; } } }while(gAdcFltr<10); } if(gAdcFltr>=10) // if(ADC_Result<POWER_OFF_THLD) { //P1SEL1 =0; UCA0IE &= ~UCRXIE; gAdcFltr=0; *(unsigned int *)(BKMEM_BASE+2) = (*(unsigned int*)&timeStamp[0]); *(unsigned int *)(BKMEM_BASE+4) = (*(unsigned int*)&timeStamp[2]); SYSCFG2 &= ~(ADCPCTL3); P1SEL0 = 0; P1SEL1 = 0; P1DIR = (BIT0 |BIT1 |BIT2 | BIT3| BIT4| BIT5| BIT6| BIT7); P2DIR = (BIT2 | BIT3| BIT4| BIT5| BIT6| BIT7); //P2DIR = (BIT3| BIT4| BIT5| BIT6| BIT7); P1OUT = 0; P2OUT = 0; P2IES = 0x00; // Low to High edge P2IFG = 0; P2IE = 0; //________________________ ADCCTL0 &= ~(ADCSHT_2 | ADCON); // ADCON, S&H=16 ADC clks ADCCTL1 &= ~ADCSHP; // ADCCLK = MODOSC; sampling timer // ADCCTL2 |= ADCRES; // 10-bit conversion results ADCIE &= ~ADCIE0; // Enable ADC conv complete interrupt ADCMCTL0 &= ~(ADCINCH_3 | ADCSREF_1); // A1 ADC input select; Vref=1.5V // PMMCTL0_H = PMMPW_H; // Unlock the PMM registers // PMMCTL2 &= ~INTREFEN; // disable internal reference gPwrOffCount = (gPwrOffCount+1); gPwrOffCount_Dbg = gPwrOffCount_Dbg+1; { unsigned int temp; // gRtcVlidnReloadInex=gRtcVlidnReloadInex+1; // if(gRtcVlidnReloadInex > 10 ) gRtcVlidnReloadInex = 0; RTCMOD = RTC_VALIDATION_RELOAD0;//gRtcVlidnReloadVal[gRtcVlidnReloadInex]; temp = RTCCNT; RTCCTL = 0x2742; // reset counter gRtcTMRCntVal += temp; gRtcSecCounter += (gRtcTMRCntVal/32); gRtcTMRCntVal = gRtcTMRCntVal%32; } //_______________________ PMMCTL0_H = PMMPW_H; // Open PMM Registers for write PMMCTL0_L |= PMMREGOFF; // and set PMMREGOFF PMMCTL2 &= ~INTREFEN; // disable internal reference PMMCTL0_H = 0; // Lock PMM Registers __no_operation(); __no_operation(); __no_operation(); __bis_SR_register(LPM3_bits | GIE); // Go to LPM3 with interrupt __no_operation(); } } // ADC interrupt service routine void __attribute__ ((interrupt(ADC_VECTOR))) ADC_ISR (void) { switch(__even_in_range(ADCIV,ADCIV_ADCIFG)) { case ADCIV_NONE: break; case ADCIV_ADCOVIFG: break; case ADCIV_ADCTOVIFG: break; case ADCIV_ADCHIIFG: break; case ADCIV_ADCLOIFG: break; case ADCIV_ADCINIFG: break; case ADCIV_ADCIFG: ADC_Result = ADCMEM0; gAdcReady = 1; break; default: break; } } /*unsigned int getAdc(void) { gAdcReady=0; gTmOutCntr =0; ADCCTL0 |= ADCENC | ADCSC; // Sampling and conversion start while((gAdcReady==0) &&(gTmOutCntr < 200)) { gTmOutCntr++; __delay_cycles(15); } return gAdcReady; } void adcInit(void) { SYSCFG2 |= ADCPCTL3; // Configure ADC10 ADCCTL0 |= ADCSHT_2 | ADCON; // ADCON, S&H=16 ADC clks ADCCTL1 |= ADCSHP; // ADCCLK = MODOSC; sampling timer ADCCTL2 |= ADCRES; // 10-bit conversion results ADCIE |= ADCIE0; // Enable ADC conv complete interrupt ADCMCTL0 |= ADCINCH_3 | ADCSREF_1; // A1 ADC input select; Vref=1.5V // Configure reference PMMCTL0_H = PMMPW_H; // Unlock the PMM registers PMMCTL2 |= INTREFEN; // Enable internal reference __delay_cycles(400); } */ unsigned int getAdc(void) { ADCCTL0 |= ADCENC | ADCSC; // Sampling and conversion start gAdcReady=0; gTmOutCntr =0; while( (0!=(ADCCTL1 & 0x0001))&& (gTmOutCntr < 200)) { gTmOutCntr++; __delay_cycles(15); } if((ADCCTL1 & 0x0001)==0) { gAdcReady =1; ADC_Result = ADCMEM0; } return gAdcReady; } void adcInit(void) { SYSCFG2 |= ADCPCTL3; // Configure ADC10 ADCCTL0 |= ADCSHT_2 | ADCON; // ADCON, S&H=16 ADC clks ADCCTL1 |= ADCSHP; // ADCCLK = MODOSC; sampling timer ADCCTL2 |= ADCRES; // 10-bit conversion results // ADCIE |= ADCIE0; // Enable ADC conv complete interrupt ADCMCTL0 |= ADCINCH_3 | ADCSREF_1; // A1 ADC input select; Vref=1.5V // Configure reference PMMCTL0_H = PMMPW_H; // Unlock the PMM registers PMMCTL2 |= INTREFEN; // Enable internal reference __delay_cycles(400); } /* void uartInit(void) { P1SEL0 = BIT4 | BIT5; // UCA0 RXD and TXD UCA0CTLW0 = UCSWRST | UCSSEL__ACLK; UCA0BRW = 3; UCA0MCTLW = 0x9200; UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI UCA0IE = UCRXIE; // Enable USCI_A0 RX interrupt } */ void uartInit(void) { P1SEL0 = BIT4 | BIT5; // UCA0 RXD and TXD UCA0CTLW0 = UCSWRST ; UCA0CTLW0 |= UCSSEL__SMCLK; UCA0BRW = 6; // UCA0MCTLW = 0x2080|UCOS16; UCA0MCTLW = 0x22D0|UCOS16; UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI UCA0IE = UCRXIE; // Enable USCI_A0 RX interrupt }
Prashanth、您好!
您可以尝试通过在 MSP430FR2433中设置 JTAG 电子保险丝来禁用 JTAG。 更多详细信息、请参阅本文档的第2.2.3节(SLAA685)以及《MSP430FRrxx 和 MSP430FR2xx 系列用户指南》的第1.11.1节。 用户指南确实指定了 JTAG 和 SBW 接口保持正常工作、 只是 某些命令访问受到限制、因此您可能仍会看到挂起、但值得一试。
请记住、此过程只能通过在器件上使用 BSL 模式来实现反向。 如果您目前没有执行 BSL 批量擦除的直接设置、我只会在您的其中一个电路板上尝试它。
此致、
Brandon Fisher