|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
原因& {$ I$ d5 e* z, m5 E
在实际应用中,经常出现由于晶体振荡器在运行中失去 作用,造成微处理器的时钟源丢失,从而出现死机的现象,导致系统出错。严重时,由于系统的死机造成监控失效, 导致无法挽回的损失!# I1 J z j G6 V7 O
目的 B0 f3 w# s' W0 ^/ }6 H
STM32作为一个可靠稳定的微处理器,但是不能排除由于某些外界特殊因素可能造成STM32的外部振荡器失效,所以在芯片中需要一种包含机制能够在STM32运行时,一旦外部晶体振荡器(HSE) 失效,切换STM32的系统时钟源到一个稳定的时钟源,以保证STM32能够继续运行,并进行相应的保护操作。( X0 r4 F! A5 v# c0 e9 ~$ ]! X
原理
/ U* s3 [1 u3 c8 G4 F& x/ j 时钟安全系统被激活后,时钟监控器将实时监控外部高速振荡器;如 果HSE时钟发生故障,外部振荡器自动被关闭,产生时钟安全中断,此中断被连接到Cortex-M3的NMI的中断;与此同时CSS将内部RC振荡器切换为STM32的系统时钟源。( 对于STM32F103 ,时钟失效事件还将被送到高级定时器TIM1的刹车输入端,用以实现电机保护控制)
8 o" N- B) {& ^$ y9 B
8 ?% z, `( L9 `& U 注意
$ N. ~) O9 Q% X* C; `% ~, @( ~ 一旦CSS被激活,当HSE时钟出现故障时将产生CSS中断,同时自动产生 NMI。NMI将被不断执行,直到CSS中断挂起位被清除。因此,在NMI的处理程序中必须通过设置时钟中断寄存器(RCC_CIR) 里的CSSC 位来清除CSS中断。! K# e3 @3 P$ E8 z' u# j
8 `0 _/ ^: A1 q" c1 O应用9 v' i& f( E# T1 g+ X% G
; H. p; y, y" B
& t3 ^( S( ]# y! [1 w# D/ ^* g
1、启动时钟安全系统CSS:+ ~- V0 f9 u+ i5 Y
2 F8 O! F6 b6 T! R2 I0 |; l" h; m- ^/ ?1 _' g& _
RCC_ClockSecuritySystEMCmd(ENABLE); // (NMI 中断是不可屏蔽的!)
2 k/ T; i; `* D+ L5 n# a2、外部振荡器实现时,产生中断,对应的中断程序:
9 J' k* o9 u! H8 h- S$ Z% V
1 y6 f& Z5 M) `
4 l0 Z+ e! ]1 E$ }- Y, K$ @* ~! R; rvoid NMIException(void)( d1 H \# {# w1 B* x
{6 \2 w1 M( G9 C
if (RCC_GetITStatus(RCC_IT_CSS) != RESET)
, h, c& W( ]6 u \5 G; l; `$ P { // HSE、PLL 已被禁止(但是PLL 设置未变)
+ [% f1 ]. B6 v /* …… */ // 客户添加相应的系统保护代码处
4 G8 }( n' V) m- f! @- |. q // 下面为HSE恢复后的预设置代码
+ W8 h+ u- \- J RCC_HSEConfig(RCC_HSE_ON); // 使能HSE( M/ R8 y% a n
RCC_ ITConf ig(RCC_IT_HSERDY, ENABLE); // 使能HSE就绪中断
9 ~, H: R5 }; C; H/ \% k RCC_ ITConfig(RCC_IT_PLLRDY, ENABLE); // 使能PLL 就绪中断
& Q! X# a" r) j2 }2 l! F RCC_ClearITPendingBit(RCC_IT_CSS ); // 清除时钟安全系统中断的挂起位* j1 q/ t5 h. x& t5 a( A9 H) c- b
+ i( o4 l1 S7 i* j' \ // 至此,一旦HSE时钟恢复,将发生HSERDY中断,' _9 v% W! @0 k6 M C+ ]8 Q
6 G& D$ n" q, \+ X2 X
//在RCC中断处理程序里, 系统时钟可以设置到以前的状态 ' `7 i) E0 }$ R4 M8 @0 ^
}3 s/ |! e' B, f/ Q5 q( H
}
2 N k* L- g6 y3、在RCC的中断处理程序中,再对HSE和PLL 进行相应的处理。 : D7 ?. h6 W$ ~, d4 y/ f
|
|