原创 关于STM32F进掉电中断的问题

2009-2-8 12:00 4184 5 5 分类: MCU/ 嵌入式

最近新使用STM32F101RC这款芯片开发产品。发现一掉电RTC就没了。芯片手册看了好几遍,厂家电话也打了无数个就是不知道为什么。Vbat这根线直连电池,示波器看了半天,掉电过程中Vbat上一点扰动都没有。后来还是俺们领导经验足,让直接拔Vdd上的电源,结果RTC存住了。试验时我用24V的开关电源给板子供电,24V电源掉电是个缓慢掉电的过程,我们感觉是缓慢掉电使芯片不稳定,丢失RTC


我把这个情况和厂家的技术支持赵工说了一下,这哥们人真不错。他说他也重现了这个现象,他发现进掉电中断后while(1),可以保持RTC不丢。接下来就是波澜壮阔的进PVD中断的过程。


感谢赵工的代码和本网站中几位兄弟的文章(这也是我开这个博的原因),很快找到了进中断的代码:
  //==================PVD===================================
  EXTI_ClearITPendingBit(EXTI_Line16 );
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Line = EXTI_Line16;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
 
  NVIC_ClearIRQChannelPendingBit(PVD_IRQChannel);
  NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  //NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);


  PWR_PVDLevelConfig(PWR_PVDLevel_2V9);
  PWR_PVDCmd(ENABLE);
这里要多说一句,杠掉的代码有人加,有人不加,事实上不加也行的。不知道其中区别,请高人指教。


一试当然是没反应咯,从2.9V设到2.2V,连个毛都没有试出来。这掉电试验比较难做,插不了jtag,因为jtag会给芯片供电的,所以必须拔掉。瞪大着眼睛看LED,希望他亮一下,真的没有-_-。


我决定看看寄存器里的东西对不对,真被我猜对了,PWR里面都没设进去,一查时钟忘记开了,所以RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);这句话不能忘记了。


再一试,进去了!但是不是掉电,而是上电!只要PWR_PVDCmd(ENABLE);一完,立马进中断,但是掉电时不进。以为是中断没清,但是我真的清了。通过jtag一看,PVDO一直是1。难道Rising和Falling搞错了?我把电压在2.3V到3.3V瞎调,什么都没进去。没办法,再打电话给赵工,他说他那边都是正常的。只能自己死磕了。


改成2.2V,没戏,2.8V,没戏,试个2.5V,有了!!再联系赵工,他说Vdda也参与比较的,一查我们的电路,Vdda连着稳压的2.5V……


但是,虽然PVD中断进去了,但是RTC还是丢失,我们把Vdda连接到3.3V后,设成2.9V,OK了。


总结一下:
1、要确认寄存器是否写成功了,这芯片里面有好多时钟,用一个开一个,为了省电。但是我们的产品省Flash,省Ram,就是不用省电-_-
2、Vdd和Vdda都要参与比较,这个居然忽视了,惭愧,惭愧


遗留问题:
如果在2.5V才进PVD中断,RTC还是丢了;但是2.9V进PVD中断,RTC能保存。就是说2.9V到2.5V芯片有稳定到不稳定的过程。这个还不知道为什么,能不能通过软件方法搞定,要有请高人了。电压我用示波器看了一下,挺正常的,不能说瞬间掉电,但是也挺快的,要再研究研究


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条