芯片:MSP430FR6972
问题:
1.手动焊接了三块板子,烧写同一个程序,三块板子的功耗都不一样(25,35,45),一致性太差了,想知道这个能确定是PCB设计或者焊接问题吗?
2.两块板子都存在这样一个问题:刚开始功耗能降到8uA以下,但是过个1分钟的样子功耗上升到18uA之后就一直是这么多,这情况可能是什么原因导致的呢?
这情况是在没开射频模块功能的情况下产生的,开了射频模块程序也存在则个问题,刚复位时功耗能到25ua,但是过会也会上升上升到40ua左右。
射频模块接收过程:
正常情况处在低功耗模式(睡眠时间:700ms,T1=1ms,T2=200ms),即睡眠700ms后,唤醒进入RX模式,T1时间内检测前导码,满足后进入T2检测同步码,都成功后停留在RX。
程序:
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
Indicator_FRAM_Init(); //初始化存储在FRAM的结构体
Unused_GPIO_Init(); //全部GPIO初始化
Power_Pin_Init(); //电源开关控制脚初始化
Led_Init(); //LED GPIO初始化
ADC_GPIO_Init(); //ADC GPIO初始化
Turn_Bowl_Init(); //功能模块GPIO初始化
CT_DET_Up(); //P4.6外部中断初始化
BAT_DET_Down(); //P4.5外部中断初始化
PJSEL0 |= BIT4 | BIT5; //LFXTCLK
PM5CTL0 &= ~LOCKLPM5;
Clock_Init(); //ACLK=32.768KHz MCLK=DCO=16MHz SMCLK=1MHz
// RF_Init(); //射频模块初始化
TimerA0_Init(); //定时器初始化
Reset_Status_Detect(); //逻辑判断
_EINT(); //使能中断开关
Led_ON();
DelayMs(20);
Led_OFF();
while(1)
{
{
状态机;
}
LPM3;
}
}
射频模块接收过程:
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
Indicator_FRAM_Init(); //初始化存储在FRAM的结构体
Unused_GPIO_Init(); //全部GPIO初始化
Power_Pin_Init(); //电源开关控制脚初始化
Led_Init(); //LED GPIO初始化
ADC_GPIO_Init(); //ADC GPIO初始化
Turn_Bowl_Init(); //功能模块GPIO初始化
CT_DET_Up(); //P4.6外部中断初始化
BAT_DET_Down(); //P4.5外部中断初始化
PJSEL0 |= BIT4 | BIT5; //LFXTCLK
PM5CTL0 &= ~LOCKLPM5;
Clock_Init(); //ACLK=32.768KHz MCLK=DCO=16MHz SMCLK=1MHz
// RF_Init(); //射频模块初始化
TimerA0_Init(); //定时器初始化
Reset_Status_Detect(); //逻辑判断
_EINT(); //使能中断开关
Led_ON();
DelayMs(20);
Led_OFF();
while(1)
{
{
状态机;
}
LPM3;
}
}
射频模块接收过程:
正常情况处在低功耗模式(睡眠时间:700ms,T1=1ms,T2=200ms),即睡眠700ms后,唤醒进入RX模式,T1时间内检测前导码,满足后进入T2检测同步码,都成功后停留在RX。
#pragma vector=PORT3_VECTOR
__interrupt void Port_3(void)
{
//射频接收中断
}
__interrupt void Port_3(void)
{
//射频接收中断
}
#pragma vector=PORT4_VECTOR
__interrupt void Port_4(void)
{
//电压监控器触发中断
//功能:满足条件后使能ADC模块工作
}
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer0_A0_ISR(void)
{
//定时器,ACLK,秒计时
}
__interrupt void Port_4(void)
{
//电压监控器触发中断
//功能:满足条件后使能ADC模块工作
}
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer0_A0_ISR(void)
{
//定时器,ACLK,秒计时
}
#pragma vector=ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
//ADC采样中断,由定时器B0触发(1ms)。
//CH0
}
__interrupt void ADC12_ISR(void)
{
//ADC采样中断,由定时器B0触发(1ms)。
//CH0
}
JIUGEN LI:
回复 灰小子:
你好,我刚才补充了一下,你有空帮我看看吧!
Susan Yang:
建议您将问题分离开分析。
1 先测试一下TI的LPM3例程(禁止射频功能),来排除您硬件本身的问题,链接如下:
dev.ti.com/…/
2 排除硬件本身问题后,来测试您自己的程序(禁止射频功能)
3 添加射频功能后,再次测试
灰小子:
回复 Susan Yang:
同一楼上的思路。楼主可以分别测试一下。
另外,一般的无线模块都带有唤醒引脚,可以通过这个引脚产生的上升或下降沿唤醒配置了io中断的mcu,楼主也可以考虑一下。
JIUGEN LI:
回复 Susan Yang:
你好,我关掉射频测试,功耗最低到达5uA,然后过会他又自己升高了(18uA)。不知道什么原因。
JIUGEN LI:
回复 灰小子:
嗯,知道了。