我们有时候会用到SMT32F0x2芯片做产品开发,用到其中的CAN外设。采用8MHz外部晶振,经锁相环PLL 6倍频后产生48M主频,配置为250K波特率。' M5 R: ^+ l; S9 F ! d- D& f) I Q$ M; U+ C, s / T4 A l( m+ w3 w8 y 可实际示波器抓的和预期不符,大概是理论值1/6的样子。下面是相关配置代码: % j8 f$ `* V6 R; ? 4 K) m8 _! y/ }! ]6 v; x 0 p! O# d5 _2 d) z 按照上面的配置,波特率的确应该是250Kbps,可测得值怎么才是理论值1/6? & f* ?2 k$ j+ H$ l9 s# J 第一感觉是那个PLL没有起作用。这首先让人想到PLL之前的时钟源是否有问题。1 O. Y w0 {. X$ r, F$ y9 U& z( r 鉴于此,该用户检查外部晶振振荡及焊接情况,结果发现晶振没焊接好。这意味着根本没有HSE时钟给到PLL,自然它没法起作用。在这种情形下,代码里当检测到HSE无效时会默认将内部HSI时钟作为系统时钟,而这个HSI 刚好也是8MHz,所以测得CAN实际波特率为实际值的1/6.' o7 i/ \* D& z& P3 Z: t6 t k, T: P, @& V4 a0 r ; n: X5 I' Z+ R * {" A. t4 z0 c% r 当用户将晶振重新焊接良好后,就一切正常了。那么,到此有人或许会问,是不是这个外部晶振焊接OK、软件配置代码也OK就不会出现这个问题呢? 那还不一定! # F/ k7 n: W$ N ' _# j+ v Y6 p 毕竟,你外部晶振品质及焊接良好,软件配置正确还不能完全保证PLL一定正常工作。我们不妨看下STM32F0x2芯片的电源供应布局框图。 7 s7 Q0 C; `! {, H2 N; [ * g+ P* X' E& ^% Y# v / W+ v c- c% j" t) l 从框图中我们可以看出,PLL是属于模拟电路部分,它的供电由VDDA提供。如果说芯片的VDDA脚没有正常供电【当然包括没有正常焊接情况】的话,PLL仍然是没法正常工作的,随之而来的时钟也就没法呈现我们软件代码配置所期望的结果。自然,如果作为芯片工作心跳的时钟出现异常时,它引起的连锁反应往往就会遍及到方方面面。* X8 c# E1 j# o& ?5 A 2 L9 t4 z% z2 Q5 z& [: V# n 这里就上述案例做个简单延展,提醒我们在做MCU调试出现问题时,除了查找代码原因外,也别忘了最基本的电源供应、电源脚、晶振脚的连接、焊接情况。对于STM32芯片工作后的各种时钟信号的检测,有个比较简单方便的方法,那就是将某内部时钟【有时可能经过分频了】通过MCO【Master Clock Out】脚引出来,直接通过示波器查看即可。下图就是STM32F0X2芯片的MCO输出连接映射图。 0 M1 H1 G$ T4 } : n% A, q+ \, B6 z6 k6 P0 ~7 \( J# \- N * R. a& N0 W9 c0 f5 Q- ^5 E 6 {8 e- ~# d, p+ j! R% b5 a |