
本帖最后由 nk714 于 2015-8-28 19:41 编辑 ( g, i5 E9 x4 ^( g, n 测试芯片:STM32F030; z( v) l+ |; i% {9 d 测试PCB板:自主读卡模块PCB 测试电源:PCB板5V输入经过低压差LDO输出3.3V LDO自身功耗2.99uA6 t* U. y r. a 低功耗模式:待机模式+IWDG看门狗唤醒3 g1 t' x. `7 q+ ]- ~" t' C 5 |& g# r# z0 g t, j. O5 l 电流数据: SMT32F030C8T6 4.32uA 低压差LDO 2.99uA+ Y$ ~& G/ R% } Q1 M0 d! y$ t B 读卡IC低功耗 0.07uA3 }- j5 k. E; p8 u/ } 2 F: h2 u8 `1 G# ~ 8 S+ d- C% A; [* t- F 低功耗测试注意事项: 测试过程中也曾经出现电流大的现象,现在逐一说明 S6 b, P' z8 d4 A4 w* J 1.最开始直接调用库函数《PWR_EnterSTANDBYMode();》进入待机模式函数,发现电流有几个mA,经过测量IO口发现进入待机模式后个别IO口有高电平有低电平,电流消耗明显,因此在进入待机模式前先将全部IO配置为输入模式、下拉使能,再次测试进入待机模式,电流减小为17.25uA。 % Y+ S. o" i2 e4 s8 z1 P 2.17.25uA也与数据手册待机模式的几个微安还是相差甚远,最后经过全面搜罗资料与借鉴别人经验发现一个特点,STM32F030必须在进入待机模式前调用《RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);》使能电源管理寄存器时钟函数,否则也能进入待机模式,但电流会增大十几个微安。此时电流减小为3.24uA。9 t" M' E! D/ ?0 m* y _+ ~9 _3 m6 } 3.配置好IWDG看门狗,电流略有增加变为4.32uA,看门狗消耗电流1.08uA。此时待机低功耗模式基本正常。 " x; h7 t# C- N" E1 [ 3 Z: R3 f# U# B9 \; l6 z4 g 9 b0 B# i) W* S. ~ ' i$ G' P9 w8 w& T3 f6 m 调试经验:0 `5 H9 K' `% ?9 E4 E: w. @( u 1.如果进入待机模式电流为mA级别,那一定是IO口或者外设配置问题导致消耗电流比较大,需要重点检查IO配置和外设配置。: G3 ?3 V8 {$ v V/ x5 a& i - B/ w- `+ C+ t; r& w8 ]1 r3 b 2.如果进入待机模式电流为几十uA的级别,那就要确认是否已经使能电源管理的时钟,如果电源管理时钟已经使能则需要检查PCB板焊接后是否清洗干净,实测焊接一个外部芯片或者电源的滤波电容,若不清洗干净会导致电流增大数uA到数十uA, 所以电流在数十uA级别时不一定是配置问题,有可能是你的PCB板没洗干净导致电流泄露引起的电流过大。切记PCB洗干净,否则也会在测试过程中发现每焊接一次再测试板子的电流就与上次测试电流不同了,我是每次焊接完成拿洗板水清晰两次,芯片的话引脚会清晰多次。1 {& j" X$ \4 O D: f: m . V$ ]0 s! q6 z7 G6 }1 ?" d 3.测试电流最好用指针的微安表,能直观的观察到电流的变化和波动,数字万用表数字跳动很难确定实际功耗电流。并且不同级别的数字表测试uA电流有可能差别很大,甚至比指针表大很多,不要盲目迷信数字表,我用安捷伦的手持表测试uA依然数字乱跳。% p: N5 Y8 `0 H, f 8 O& C8 s7 \2 l 4.指针微安表可以并接一个低压差的二极管,来保护uA表免受在上电过程中的瞬间大电流的冲击。这个是通过二极管的PN结压降实现的,原理请自行百度。 5.关于编程,我是用SWD接口编程,为了省空间去掉了SWD的复位脚,造成进入待机模式后时钟停止无法进入编程模式,此时只要先用镊子将复位脚对地短接,然后点击下载,看到下载器开始检测芯片时松开复位脚即可正常编程。; o" C3 a/ y8 N: N$ C & D, k8 W6 K5 Y ' x0 S1 q6 v( _( z) s / O% A' ?. _3 S% ]& { ( L% G+ M9 \; p; m/ g 最终效果% ]5 {6 e" T: g, w3 C. D 测试板最终效果实现每200ms唤醒一次,然后启动读卡芯片读卡,成功读到卡后通过UART接口把卡号发送出去然后进入休眠,若检测不到卡片则直接进入休眠等待下次唤醒。正常工作电流:有卡时=12uA~14uA 无卡时=9uA~11uA " B) |' W) c4 g2 T ( G2 ?9 z1 M# s 部分测试代码示例 int main(void) { ( l% H$ k5 n5 N2 |2 I( E: x+ t% S SystemInit(); // 配置系统时钟 . t2 S* B* x3 G2 u9 _& k/ C SysTick_Config(TICK_10ms); // 配置系统时基定时器 IWDG_Init(IWDG_200ms); // 初始化看门狗3 U) D) S" c3 O: K- ^1 J ; x c# Z1 T. [" ?- l# G& x while(1) { LowPowerIOConfig(); // 所有IO口配置为输入 下拉使能) @1 \& c* G3 @4 {# ^3 y RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // 使能电源管理时钟 PWR_EnterSTANDBYMode(); // 进入待机模式( ?+ L! f2 P4 U- C } } 1 V* y$ W) g! K+ j0 i 致谢:7 v4 E3 L6 t" }+ G+ X/ y 调试过程中一度进入毫无头绪的过程中,网络搜索很多描述都是不完全的,大多数是只写了低功耗当中注意的个别要点,但也有了很好的借鉴,为了方便其他朋友调试,写了这篇从头到尾的调试笔记,只希望尽量完整描述整个调试过程,供大家偶然借鉴之以期望少走弯路。同时感谢各个论坛中的分享自己调试经验的朋友。* p$ v' L" a2 j% ]. X $ c+ O3 J5 `1 Z, f7 V2 t 7 h: P# ? S. f( G( @* J ! @/ Y# R& X7 X" H% V1 i5 W/ V: i: Z. d |
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // 使能电源管理时钟(就是这句)
谢谢帖主nk714,谢谢技术大牛。
用指针微安表头
内核有什么问题?
内核不一样,移植起来有些麻烦
好文章,值得学习
好文章,值得学习