主题中讨论的其他器件: 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