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

STM32复位来源,以及系统和内核复位区别

[复制链接]
STMCU小助手 发布时间:2020-12-25 17:22
STM32复位来源,以及系统和内核复位区别

' V% {8 E( S9 U8 L# Y, }
最近有朋友问了些关于STM32复位的问题,今天结合前面文章再次总结一下复位相关知识。
1 STM32的复位和时钟控制
RCC:Reset and ClockControl
每一块STM32中都有这么一个RCC复位和时钟控制模块。
STM32的复位为三类:系统复位、电源复位和后备域复位。
系统复位:
1. NRST引脚上的低电平(外部复位)
2. 窗口看门狗计数终止(WWDG复位)
3. 独立看门狗计数终止(IWDG复位)
4. 软件复位(SW复位)
5. 低功耗管理复位
电源复位:
1. 上电/掉电复位(POR/PDR复位)
2. 从待机模式中返回
备份区域复位:
1. 软件复位,备份区域复位可由设置备份域控制寄存器(RCC_BDCR)中的BDRST位产生。
2. 在VDD和VBAT两者掉电的前提下, VDD或VBAT上电将引发备份区域复位。
2 STM32的复位来源
在很多应用中,都会判断是什么引起的复位。
比如:判断为看门狗引起的复位,我们进行xxx操作。软件引起的复位,我们又执行xxx操作。
在STM32RCC模块中,有这么一个寄存器:控制/状态寄存器 (RCC_CSR):
5.1.jpg
这个寄存器就会记录各种复位的状态,我们直接读取这个寄存器(库函数有读寄存器接口)就能知道是什么引起的复位。
3 STM32的复位来源例程
之前我提供了一个简单
Demo
,
STM32F103ZE
(
Keil
)
_
复
位来源(寄存器版):
5.2.jpg

2 G& T' J/ y+ _* ?
4 STM32系统和内核复位
内核复位:它会使STM32内核(Cortex-M)进行复位,而不会影响其外设,如GPIO、TIM、USART、SPI等这些寄存器的复位。
系统复位:这个复位会使整个芯片的所有电路都进行复位,系统默认的函数接口NVIC_SystemReset就是系统复位(位于core_cm*.h)。
1.NVIC_CoreReset内核复位
CM3 允许由软件触发复位序列,用于特殊的调试或维护目的。在CM3中,有两种方法可以执行自我复位。第一种方法,是通过置位 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的VECTRESET 位(位偏移:0)。
这种复位的作用范围覆盖了整个CM3处理器中,除了调试逻辑之外的所有角落,但是它不会影响到 CM3 处理器外部的任何电路,所以单片机上的各片上外设和其它电路都不受影响。
C语言版函数:
  1. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">void NVIC_CoreReset(void)<o:p></o:p></font></span></p>% {" e: D6 _0 O: N& o5 X( C4 p

  2.   }3 h% L+ N! N# t" _1 I7 c1 w3 l; R
  3. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">{<o:p></o:p></font></span></p>
    # M: Z$ m5 c7 S/ Q1 y+ g
  4. 6 U* H2 {* ^" v8 A; C* p+ p. j) D$ I
  5. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">  __DSB();<o:p></o:p></font></span></p>/ ?$ q* w4 k9 g5 g0 r
  6. - ]9 o' f: n# J2 f) ]' i% J
  7. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">  <o:p></o:p></font></span></p>1 |; E9 m. f* Z% s

  8. 0 a; j* }: F+ t0 m  |. u3 ^0 U
  9. <p class="MsoNormal"><font color="#000000"><span lang="EN-US">  //</span>置位<span lang="EN-US">VECTRESET<o:p></o:p></span></font></p>
    ; e7 F( k! g# F6 q  P
  10. # E7 E: }" V( E$ \) Q4 f7 a
  11. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">  SCB->AIRCR
    ' e$ p" `) V+ x4 B6 [9 @, y
  12. = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |<o:p></o:p></font></span></p>
    ) X$ H7 O, K/ Z0 j0 \6 F
  13. * h& o: U0 I/ H! ^# r$ n
  14. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">                 (SCB->AIRCR &! |; g2 s$ J4 H: h$ _" g
  15. SCB_AIRCR_PRIGROUP_Msk) |<o:p></o:p></font></span></p>
    # D. [5 p* B8 {

  16. ' c0 [5 Y' a! ?
  17. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">                 SCB_AIRCR_VECTRESET_Msk);<o:p></o:p></font></span></p>
    ( D$ e8 x' T, S1 `+ z4 M- d7 W  `- ~! G

  18. . o5 b: O( O, k& z6 R$ Z6 d- W
  19. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">  __DSB();<o:p></o:p></font></span></p>; w2 J8 Q9 x0 @
  20. ! E0 t2 U- @; h& i6 B
  21. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">  while(1);<o:p></o:p></font></span></p>
    ( e3 S5 _( e! }( `8 I% p
  22. ) Y* B( W1 S/ p# d* D  I! o5 }
  23. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">}</font></span></p>
复制代码
2 J1 A- N3 b( P9 o
汇编版函数:
  1. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">__asm void% ^4 n( s# P  J9 \$ C
  2. NVIC_CoreReset_a(void)<o:p></o:p></font></span></p>$ }. A* Z, f3 H2 G& T5 B

  3. 2 x! N2 ?3 G0 Y0 q9 c% E6 Q
  4. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">{<o:p></o:p></font></span></p>9 `9 V4 X" X: B6 k( q2 E
  5. % Q+ ^0 v4 I3 h0 L- J% h  U
  6. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">  LDR R0, =0xE000ED0C<o:p></o:p></font></span></p>% ?  r9 ~7 ?9 g! I& ~
  7. + N. f9 \  G7 V$ G
  8. <p class="MsoNormal"><font color="#000000"><span lang="EN-US" style="">  LDR R1, =0x05FA0001  //</span>置位<span lang="EN-US">VECTRESET<o:p></o:p></span></font></p>1 }' Z5 o' N' |/ G8 k
  9. ! m) ?2 K. S, g1 M: e; H0 k- h
  10. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">  STR R1, [R0]<o:p></o:p></font></span></p>
    . h$ t  t7 \  K/ B2 O2 V/ {1 b
  11. , U5 Y2 E. |# q7 L# w
  12. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000"> </font></span></p>" H( D# l% y3 d% i* }0 C2 U# Q" j% v
  13. 1 C3 J; L7 W8 M2 Q) K- q% T1 Y
  14. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">deadloop_Core<o:p></o:p></font></span></p>
    5 Y8 Y: s; g, z' S6 d
  15. 3 i! _5 v1 k9 c" L: g4 C& y# p
  16. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">  B deadloop_Core<o:p></o:p></font></span></p>8 j( ?8 r- c7 j( `, G
  17. 8 D  ~5 d& f- F  Q; z
  18. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">}</font></span></p>
复制代码
4 `" e5 m  K  u' I, j4 q  U
内核主要注意:
SCB_AIRCR_VECTRESET_Msk
LDR R1, =0x05FA0001
它是和系统复位唯一的区别。
2.NVIC_SysReset系统复位
系统复位是置位同一个寄存器中的 SYSRESETREQ 位。这种复位则会波及整个芯片上的电路:它会使 CM3 处理器把送往系统复位发生器的请求线置为有效。但是系统复位发生器不是CM3的一部分,而是由芯片厂商实现,因此不同的芯片对此复位的响应也不同。因此,读者需要认真参阅该芯片规格书,明白当发生片内复位时,各外设和功能模块都会回到什么样的初始状态,或者有哪些功能模块不受影响(比如, STM32系列的芯片有后备存储区,该区就被特殊对待)。
大多数情况下,复位发生器在响应 SYSRESETREQ 时,它也会同时把 CM3 处理器的系统复位信号(SYSRESETn)置为有效。通常, SYSRESETREQ 不应复位调试逻辑。
这里有一个要注意的问题:从 SYSRESETREQ 被置为有效,到复位发生器执行复位命令,往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把FAULTMASK置位。因此,我在提供源代码中有这么一句:__set_FAULTMASK(1);,也就是置位FAULTMASK。
C语言版函数:
  1. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">void NVIC_SysReset(void)<o:p></o:p></font></span></p>5 m) O; e: |7 o" ~1 K6 v

  2. 6 _1 c7 G; N2 n4 k' R" r" o+ u
  3. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">{<o:p></o:p></font></span></p>
    . F0 u! s6 `9 R  f8 X+ u. l& x  N6 Q
  4. , a4 S/ V' }! }  `* Q
  5. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">  __DSB();<o:p></o:p></font></span></p>  Y1 y2 o; h7 f6 ^0 \, U% B
  6. ; Y  z0 K6 d1 S# P
  7. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000"> </font></span></p>: R! i/ p' x  e1 P- M

  8. + K) l% O8 k" A5 h# k# [9 y# K
  9. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">  SCB->AIRCR & b2 H; i# W7 h" d% F& i
  10. = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |<o:p></o:p></font></span></p>6 o1 @3 B% k7 p9 b

  11. ; X1 s! a2 `  d
  12. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">                 (SCB->AIRCR &* W( h4 ]# j: `2 P6 u9 u; M
  13. SCB_AIRCR_PRIGROUP_Msk) |<o:p></o:p></font></span></p>
    * |0 F" r+ {1 W& b4 W- `" E

  14. " M  A9 {  R; n8 _2 y+ Z
  15. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">                 SCB_AIRCR_SYSRESETREQ_Msk);<o:p></o:p></font></span></p>
    , r6 Q# ~2 R0 e" j! o
  16. ' n( y" T( E+ @
  17. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">  __DSB();<o:p></o:p></font></span></p>" w7 J, e& u: Z

  18. ! ^; H; h5 x# a/ V
  19. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">  while(1);<o:p></o:p></font></span></p>* G; V" F0 ?6 x' \

  20. + A- m; r$ z6 z. o
  21. <p class="MsoNormal"><span lang="EN-US" style=""><font color="#000000">}</font></span></p>
复制代码
% w5 v" p( o7 s, b
汇编版函数:
  1. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">__asm void4 P0 p3 x3 C& u3 b& h
  2. NVIC_SysReset_a(void)<o:p></o:p></font></span></p>
    1 v- g! s$ ?  P% [3 {1 _; F( O1 w

  3. / @7 u: H0 D+ s  e: M( @
  4. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">{<o:p></o:p></font></span></p>/ D( m; M1 u- H; ~  W9 \+ t/ c

  5. 0 O; ]- D4 ~% V2 a* j- E2 z
  6. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">  LDR R0, =0xE000ED0C<o:p></o:p></font></span></p>
    , c' a5 A1 p$ A8 z0 K; d
  7. , w" I4 N; l) v- V
  8. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">  LDR R1, =0x05FA0004<o:p></o:p></font></span></p>; P* i1 f# h0 z: x. k* Y$ V

  9. / z4 l2 V! e5 N; d' |
  10. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">  STR R1, [R0]<o:p></o:p></font></span></p>
    3 ?0 C) _2 L" h( ~& |) a8 g

  11. 6 E2 e7 b  Y+ h9 r* W
  12. <p class="MsoNormal"><span lang="EN-US"><font color="#000000"> </font></span></p>: {# n, G6 f4 e: B
  13. " p7 @) L" o: ~; g
  14. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">deadloop_Sys<o:p></o:p></font></span></p>( o1 u7 K, a4 a8 k

  15. ' z0 E5 ^1 \/ ?9 c' s4 }
  16. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">  B deadloop_Sys<o:p></o:p></font></span></p>6 V0 Y3 y( i1 |4 x2 w
  17. 1 s+ Z. M% I4 j1 p
  18. <p class="MsoNormal"><span lang="EN-US"><font color="#000000">}</font></span></p>
复制代码

0 b1 I* b: U8 l: ^* ^
内核复位与系统源代码和相近,差异在于SYSRESETREQ和SYSRESETREQ这两位。
关于复位的知识,在实际项目中应用的比较多。
可以结合上面提供例程理解,以及结合Cortex-M手册理解。
. ~! t" s, V8 ]6 w5 ?
文章出处:strongerHuang

1 b: [3 ?. t: s# k2 M
赞 收藏 1 评论0 发布时间:2020-12-25 17:22

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版