|
原帖作者:tuoxie ' I @+ d! O F; c9 b: V 最近新使用STM32F101RC这款芯片开发产品。发现一掉电RTC就没了。芯片手册看了好几遍,厂家电话也打了无数个就是不知道为什么。Vbat这根线直连电池,示波器看了半天,掉电过程中Vbat上一点扰动都没有。后来还是俺们领导经验足,让直接拔Vdd上的电源,结果RTC存住了。试验时我用24V的开关电源给板子供电,24V电源掉电是个缓慢掉电的过程,我们感觉是缓慢掉电使芯片不稳定,丢失RTC 我把这个情况和厂家的技术支持赵工说了一下,这哥们人真不错。他说他也重现了这个现象,他发现进掉电中断后while(1),可以保持RTC不丢。接下来就是波澜壮阔的进PVD中断的过程。 感谢赵工的代码和本网站中几位兄弟的文章(这也是我开这个博的原因),很快找到了进中断的代码:3 X. A: e. f' w, C' s; ?4 M* z //==================PVD=================================== EXTI_ClearITPendingBit(EXTI_Line16 ); EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;# L" T4 x6 H z: X6 Q$ C4 T EXTI_InitStructure.EXTI_Line = EXTI_Line16;3 y# V. ]& Y" K% n8 B( s( S; w EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE;/ G. O$ }) A1 r5 R0 o5 \* k/ A- G, l EXTI_Init(&EXTI_InitStructure); 6 j1 K- i( C4 } NVIC_ClearIRQChannelPendingBit(PVD_IRQChannel);, v4 B2 l9 Z' p0 C' u NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQChannel;8 R/ {+ }: o# B" p, V2 w p NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8;& s8 D b% }$ B% I6 d/ \ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;, u0 Y9 Y- H, h/ w, L9 A //NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;; @+ v: e" k$ l& o1 ~* g6 i4 Z NVIC_Init(&NVIC_InitStructure);; x* H; x! H7 d. U PWR_PVDLevelConfig(PWR_PVDLevel_2V9);. F: }- z7 L$ V1 r PWR_PVDCmd(ENABLE); 这里要多说一句,杠掉的代码有人加,有人不加,事实上不加也行的。不知道其中区别,请高人指教。0 E. H& _7 h+ J# D3 C 一试当然是没反应咯,从2.9V设到2.2V,连个毛都没有试出来。这掉电试验比较难做,插不了jtag,因为jtag会给芯片供电的,所以必须拔掉。瞪大着眼睛看LED,希望他亮一下,真的没有-_-。7 d, W5 S/ {. c" j2 D, J( L' F1 j 我决定看看寄存器里的东西对不对,真被我猜对了,PWR里面都没设进去,一查时钟忘记开了,所以RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);这句话不能忘记了。! W. P0 F% K- g$ d- Z. c2 Q 再一试,进去了!但是不是掉电,而是上电!只要PWR_PVDCmd(ENABLE);一完,立马进中断,但是掉电时不进。以为是中断没清,但是我真的清了。通过jtag一看,PVDO一直是1。难道Rising和Falling搞错了?我把电压在2.3V到3.3V瞎调,什么都没进去。没办法,再打电话给赵工,他说他那边都是正常的。只能自己死磕了。: w+ S! K. F- Z1 K2 R- `7 [ 改成2.2V,没戏,2.8V,没戏,试个2.5V,有了!!再联系赵工,他说Vdda也参与比较的,一查我们的电路,Vdda连着稳压的2.5V……+ I" H. t Z* i 但是,虽然PVD中断进去了,但是RTC还是丢失,我们把Vdda连接到3.3V后,设成2.9V,OK了。% i/ W/ ~" A% [) F3 k! q6 s+ m" n 总结一下:' c- D1 n/ ]- q4 C$ n 1、要确认寄存器是否写成功了,这芯片里面有好多时钟,用一个开一个,为了省电。但是我们的产品省Flash,省Ram,就是不用省电-_- 2、Vdd和Vdda都要参与比较,这个居然忽视了,惭愧,惭愧9 g' N1 C! _6 V/ A 遗留问题:2 b% \% ^6 R; S' [ 如果在2.5V才进PVD中断,RTC还是丢了;但是2.9V进PVD中断,RTC能保存。就是说2.9V到2.5V芯片有稳定到不稳定的过程。这个还不知道为什么,能不能通过软件方法搞定,要有请高人了。电压我用示波器看了一下,挺正常的,不能说瞬间掉电,但是也挺快的,要再研究研究 |
微信公众号
手机版
RE:关于STM32F进掉电中断的问题
前阵子看到有人想要掉电瞬间写flash的...真是够疯狂的...) \0 d0 Q. V8 _
这个不懂哈~等高手回答~
回复:关于STM32F进掉电中断的问题
在PVD中断写Flash很正常,可以先在中断外擦除芯片,在中断里写就行了,Flash的操作大部分时间是在擦除上,我试了一下擦除一页(大存储的2K)需要21.9ms,然而写100个半字节数据只需5~6ms。在供电处接个电容就OK了
“可以先在中断外擦除芯片” 请问这个怎么做的啊?