你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【分享】STM32L151晶振掉了~~~

[复制链接]
跟风和天空对话 发布时间:2019-7-8 17:25
最近有个项目,用到STM32L151,原设计者使用外部8MHz晶振。有一天晚上调试过程中,突然发现程序跑不动了,翻到背面瞧见HSE脱落了~~~再用RCC_GetClocksFreq(&RCC_ClockFreq);观察RCC_ClockFreq.SYSCLK_Frequency,只有2.09MHz。手扶着HSE重新上电,单片机运转正常。看来就是它的锅。
. j( u0 ~+ B. [! r! \% L0 l
/ @# b" i7 ]; l9 x- [3 p. L/ Z; {

& y) H3 C+ v5 Q. Y! u$ Y但是,家里没有电烙铁。) E: i; l4 k! Q, F# E# K' a+ |

8 I+ q/ n/ I/ n那怎么办呢?只能换用16MHz的HSI了,MSI非整就不考虑了。我从来都只是用SystemInit();初始化的,除了修改一下HSE的频率,从来没碰过里面的其他语句。
. A: Q: j! d3 {# X一开始,我写了一个HSI倍频到32MHz的程序,替换掉.s文件里的SystemInit,结果失败。可能是因为我写的程序本身有问题。* T: g6 _& ?5 t& o

& ?+ d9 }9 F& {' n8 A* K
0 D! y- R$ D! u$ w0 y
后来想想,不如向SystemInit();里面添加HSE启动失败后的代码。它里面负责将HSE倍频到32MHz的程序是
! x( c# X/ k& W  _
. |0 T) Y0 L" P" u) O
* \( q9 l" ^6 R& B; C
/* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */0 q/ B+ u1 G9 h! t
  SetSysClock();; W2 `/ o" O3 U! K* h  M0 [
* \/ h# m( T& w' N1 o4 q6 `

/ j- H; T5 \; @3 D" _' F( e% @% m在它里面,除了详细描述了HSE+PLL的启动方式,还有下列注释:
( O. {( S# a( A2 L' ?5 ]/ S8 ^
+ p* B, }" ?! n, f7 v2 d
# k! m  |# \# N1 M3 e, k* |
if (HSEStatus == (uint32_t)0x01)/ _  ~$ V1 k/ [! u
{: l& L3 G, h) L0 ~* V# k
……省略……, V9 ~" I6 Z8 {, P9 V! l8 M
}
4 Y9 x4 ~6 ^0 S* celse- X" F  {$ p  U+ h0 u! j
{
$ _! j( U( i5 h* I- b0 v    /* If HSE fails to start-up, the application will have wrong clock
* `" i7 C1 n) H: G# c- L* Z! E/ I       configuration. User can add here some code to deal with this error */
2 N# M& M. o6 _9 O2 ~" T2 f$ A  ]% n' z6 ^- G
  //翻译:如果HSE无法启动,程序将以错误的时钟运行。用户可自行添加勘正代码$ C" t+ O4 _9 f0 l& I4 l8 u& Y
}
  i, l# E/ ?& r" }& b0 n
0 l, h) h  h. A. q( LST官方竟然提前留好了坑!
/ {3 o) H- @2 S. K/ Z2 u& W" @; S) C0 E% O* y+ Z# Z9 Q
于是,仿照着HSE+PLL启动方式,我写了下面的代码,使用HSI+PLL,并添加到else{}中,观察RCC_ClockFreq.SYSCLK_Frequency=32000000,一次性通过。4 j4 x; w) _( E6 i9 }, |
9 k4 |6 F- w4 {2 h
    /* Enable HSI */
* m- y. n* W/ p' e) K& c! u- T: u6 L- m    RCC->CR |= ((uint32_t)RCC_CR_HSION);! t8 B4 q! s* F% O$ y* H

! M* d( \$ H" a5 O; O$ {    /* Wait till HSI is ready and if Time out is reached exit */
& C# [/ k9 _$ I. B$ B! L# t    do
+ D0 q0 q* k. {+ }$ L    {7 w" E% A" v+ P6 k7 X" l
      HSIStatus = RCC->CR & RCC_CR_HSIRDY;
/ o( J* p7 S0 f, [2 f      StartUpCounter++;+ s! O. n! A/ C- _% }  M1 }
    } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));
- r9 r& M. _( d( |5 n0 {% L$ u6 T- T( t+ O( e4 y/ M
    if ((RCC->CR & RCC_CR_HSIRDY) != RESET)  i5 s& p% m7 k
    {
# q5 {' A% v  I& G5 r. z. B      HSIStatus = (uint32_t)0x01;
0 b: A& e5 e2 Q# ?. k- Q( Q. t    }
. D+ P5 y: H" Z% N+ r/ e    else/ M7 N& @9 @9 {% _0 J1 L3 e& r
    {$ ~1 A: `' u$ ?
      HSIStatus = (uint32_t)0x00;
" H5 u0 s7 d9 v3 Y5 B    }
/ f) `; h6 I9 v5 O$ x9 k1 t: ?3 j; c1 n' Q- L/ W$ ]
    if (HSIStatus == (uint32_t)0x01)
0 j9 |+ k6 C1 t" `5 F2 @) h    {
) n) C) g& Q4 S* N6 C9 P( p      /* Turn OFF the HSE oscillator */
& h' N8 z3 c, v2 m, K      RCC_HSEConfig( RCC_HSE_OFF );6 B$ p4 s! B8 O1 }: Y( I, v/ U3 N

/ s. _9 o- _: c# w: r      /* Enable 64-bit access *// f* L2 q0 R' b; k7 w
      FLASH->ACR |= FLASH_ACR_ACC64;/ `4 Y% ?& j$ H$ A# e9 G  c
5 }5 s1 _; B/ f
      /* Enable Prefetch Buffer */& r- Z$ C* M* X3 b  K/ I/ g
      FLASH->ACR |= FLASH_ACR_PRFTEN;
( a5 v; c8 F4 L0 |: q
. f8 \2 s3 Z  J$ C9 r* U  d0 f      /* Flash 1 wait state */
& c& d; Z  l7 Y! N. K      FLASH->ACR |= FLASH_ACR_LATENCY;1 p; M" f* A6 M% q

% I6 I) G' x8 E7 s      /* Power enable */
. t) u+ z" W: a% J) z- l* |2 o6 F      RCC->APB1ENR |= RCC_APB1ENR_PWREN;5 v. N9 U3 m. x6 x

( A) o% k+ h" w. R' @( t      /* Select the Voltage Range 1 (1.8 V) */& P) j+ u3 w* P8 g
      PWR->CR = PWR_CR_VOS_0;' |& D8 F0 F& ]4 a2 A9 Q4 e: K5 m

5 t6 R) s4 e. w- |4 x9 ~      /* Wait Until the Voltage Regulator is ready */, {4 S- z9 j4 O6 H
      while((PWR->CSR & PWR_CSR_VOSF) != RESET)
# [9 D6 J/ g" c      {7 C7 I- e  e4 N! i! q" e
      }7 Z3 \! K) @3 E* z; l
, A# E; O+ u* E  ]# _4 U; i% }
      /* HCLK = SYSCLK /1*/* b6 N- f3 C/ q( V3 g5 w/ d5 G+ G
      RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
+ r  q: q2 a- _
- s( p/ `! Y( b/ p5 u      /* PCLK2 = HCLK /1*/) I& i' j/ A3 U2 M4 w2 G
      RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;/ S9 J% ]1 O# F: p

4 G% K8 }4 H3 y9 y# g* o$ k. X" s( P      /* PCLK1 = HCLK /1*/
4 \+ n$ @8 {- W" a! ~) W      RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;
! E& T0 a; u5 X2 N# T' T: N# [# ]5 o9 o$ _! ?3 D7 ?
      /*  PLL configuration */
4 M: i' \) j4 g3 z1 V3 u9 [      RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL |, x$ a- E6 N* x2 q9 }1 w
                                          RCC_CFGR_PLLDIV));
6 c0 Y9 S0 q0 I: u. S8 g) h      RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI | RCC_CFGR_PLLMUL4 | RCC_CFGR_PLLDIV2);
/ N$ x2 p/ E7 n4 e3 H: C  p; F" y3 i4 X/ w% t" f  V: a
      /* Enable PLL *// C, {8 V' g# G' L5 `8 f
      RCC->CR |= RCC_CR_PLLON;' p  R2 r9 [! U/ c5 q1 f
( T: J5 k# q' E
      /* Wait till PLL is ready */
6 R! ~0 y. Z+ `. j5 u9 r  {* P      while((RCC->CR & RCC_CR_PLLRDY) == 0). E1 g6 @6 X% R" W8 y" B# A# ~
      {
: U' k4 a9 h2 k      }
" D3 u) Y" W: Y4 E$ D. u  E& W; ?
      /* Select PLL as system clock source */
, A! P0 q, w8 A0 {+ Y      RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));9 x. H- W; ?( o; q
      RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;7 l, n; _2 l( Q$ t0 y
. ~4 `* i8 ^* a9 @: R7 k3 V
      /* Wait till PLL is used as system clock source */3 _) L' f, U; [! b6 x  w( S% Q0 b
      while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL); O% j) A- H0 [1 u, n# h; G: C6 P- N
      {8 X/ s, n/ {! m* k4 [" f0 k2 u) {
      }   
/ X1 C2 V4 r$ b& T0 k7 N# N' o    }8 _' o% e; {1 z+ p9 _+ x/ y
$ J# c) x5 o* o% P4 p4 }
5 F0 c; W- y/ E. S2 ^( R
5 h( l. B6 F6 ?1 M3 \0 j# d
记得在static void SetSysClock(void)的第一行添加HSIStatus的定义,即:+ t+ h3 ]! ~& N: s
__IO uint32_t StartUpCounter = 0, HSEStatus = 0, HSIStatus = 0;
$ I8 p9 ?3 `" n) ~4 g/ H

7 S2 S9 e& Q! {8 Y% {
收藏 评论0 发布时间:2019-7-8 17:25

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版