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

【经验分享】STM32复位源判断

[复制链接]
STMCU小助手 发布时间:2022-3-21 13:41
在项目中有时候会遇到单片机莫名奇妙复位的情况,为了判断是那种原因引起复位,就需要对单片机的复位源进行判断。现用STM32F103C8T6单片机进行测试。
3 G; z, R( e6 K; P2 v先看看单片机复位源都有哪些?
2 b; Q% j2 c' G3 }8 P& C* Z' e, Z0 A 2Q2]Y(B`I4%R767XDN]C7ZF.png   E! r7 B7 g! ~

* m- [; [1 l! _+ o, l- P在STM32中文参考手册中可以看到,复位源可以通过状态寄存器来读出。( S( U# U& s& l  [4 x# s
于是写一段程序来读取复位状态寄存器:
: @( V/ y4 J* s* W
5 D, I2 m8 n0 [
  1. void Check_Rst(void)
    " x' I% l& |5 _4 ?& r
  2. {0 M+ X" B4 S5 I" a% E
  3. printf(" CSR = %x\r\n", RCC->CSR);7 @! l& @/ f' v6 D9 b/ ]
  4. if(RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET ) // NRST 引脚复位# v- ~1 [6 e* Q1 N, }/ \6 c0 y
  5. {
    ' g* c$ Z+ a2 W* b6 v; w
  6. printf("PIN reset \r\n");
    " _! E1 ]$ a9 Z' ~0 I  R9 _
  7. }6 I9 ?+ o3 }( }3 p% g" N4 ]
  8. if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET ) // 上电掉电复位
    & v! c% H4 y4 N# I$ ^" @' l
  9. {
    + Y2 |# H) ]* b" v
  10. printf("POR/PDR reset \r\n");! |. j9 r/ P" g8 O
  11. }0 M7 G6 J& z& E! ?
  12. if(RCC_GetFlagStatus(RCC_FLAG_SFTRST) != RESET ) //  软件复位
    0 D  s; ^* u- F3 c
  13. {4 V* t; O5 L1 ^# u% f
  14. printf("Software reset  \r\n");: A& U6 s- v& J4 r
  15. }% B, G$ I4 x: w: \
  16. if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET ) // 独立看门狗复位' R7 R  H5 h! F. R6 F
  17. {
    / b3 j$ o; _& m- A3 z
  18. printf("Independent watchdog reset \r\n");" `8 D7 |* M! I1 g! \
  19. }
    ! w# M( {  O$ g
  20. if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET ) // 窗口看门狗复位$ H3 T5 v1 L5 ]8 X& I; `( B
  21. {
    . J) ?4 Z$ _7 S' k- {
  22. printf("Window watchdog reset \r\n");
    ) a" ~6 o8 E& a! L  ~2 M
  23. }
    ! K( w. T9 I0 g1 m
  24. if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST) != RESET ) // 低功耗复位6 Q2 w0 U8 D+ P- P$ m
  25. {
    ; B! L' h7 E7 v0 p$ m
  26. printf("(Low-power reset \r\n");" p  P8 [5 }" D5 O# C! m6 @  h
  27. }: P' K$ R, b4 o2 b# L
  28. RCC_ClearFlag();                        //清除复位标志
    / I8 H& K6 A/ M
  29. printf("\r\n");3 D5 Q/ H# v& e) p* Q

  30. & \/ c9 z  g8 M
  31. }
复制代码

  T" h  \- ~& v' B$ y* U3 W通过串口将信息打印出来。& E* G- a( h" o3 j( z
现在写个程序测试,引脚复位、掉电复位、看门狗复位都比较好测试。就是软件复位要用代码实现。通过查找资料发现软件复位可以分为系统复位和内核复位。系统复位会复位所有硬件电路,包括IO口状态。内核复位只复位内核,不影响硬件电路。( X1 V* d' F4 K4 E9 a" t! u
系统复位实现代码如下:
, j9 u& _  N+ E$ \! K7 R
, v4 v+ B4 K! p- f! F
  1. //系统复位  所有电路都会复位& u) ~7 C; w0 L) d% c. ?8 ?
  2. void mcuSysRestart(void)
    9 H" x/ ?% C8 `' f8 j6 S" K
  3. {3 U9 \- m) ~7 E& n" T" V# e
  4. __set_FAULTMASK(1);         //关闭所有中断+ X8 f0 s% b/ K4 U$ O
  5. NVIC_SystemReset();  //系统复位   源码见 core_cm3.h 文件 static __INLINE void NVIC_SystemReset(void) 函数3 t% w- h; ^0 O: r4 w: `

  6. 1 H3 s4 J1 }* [; \! @. f* z
  7. }
复制代码
& {( Z, _+ s3 ~, s8 t
内核复位代码如下:
9 x# R' n* \8 h& s1 K- y$ X% T
  1. //内核复位  不会影响外设和其他电路
    5 j; S- r! U; S) {2 @8 D4 E- }8 t
  2. void mcuCoreRestart(void)
    % E* t$ z$ E3 v2 F  H
  3. {
    5 ]. t2 U2 E  V
  4. __DSB();
    - E, [. C8 U$ ~( @: L0 s0 ^
  5. //置位VECTREST
    ( ~  i2 o. Z6 L/ I
  6. SCB->AIRCR = ((0x5FA AIRCR & SCB_AIRCR_PRIGROUP_Msk) |+ D7 g  ?2 D, `. a8 M
  7. SCB_AIRCR_VECTRESET_Msk);% b9 h  G. F1 Q3 O! j. M2 N, D
  8. __DSB();
    . O9 j- U3 M- K. [
  9. while(1);' Q9 Z1 S5 {/ G
  10. }
复制代码

/ J7 |5 k' F4 V$ m; V) F0 @( v在程序中通过不同的按键控制不同复位情况,打印信息如下:! h+ H* l9 D: Y8 N; M5 ?7 k' N
上电复位:% A* {& X8 I4 ^% v( [% n! N
# f( i& m8 o% \! D
}HTUVN4ZMC(8)U8(7_)H{~O.png 4 Y; Z. H  `/ V. K
1 j" Q! @% m+ F+ }& W7 `/ O; O6 d
按复位键复位:
  l" a' C1 u' o6 h" E7 {
4 {2 A5 r; u6 P4 Q0 B0 z9 | []_3S{MMA0{VU8W{M$TTD$D.png
0 D2 C' L) M; T4 ?* @  J# ]5 U4 J5 m" F. \; o
独立看门狗复位:' B. i1 H' r5 ?2 I

; r! A, ^2 e  d8 Q/ `/ f3 X/ {9 d( M O9]%X%(LA5[1]5F0XG[5][U.png 8 r( h* e1 v) B" J! X0 e) X2 a

/ e9 ?, X4 x8 [, x% R) c, K0 T窗口看门狗复位:
3 I# |& Y0 ?$ G; O- n
" E: Y, u/ Q) B) v) x PRCM{}U`83$D)%5$SVL8VRG.png 4 k4 M. A/ c0 t+ c  O: W- \

% {0 G9 k& R. p/ i; m9 ~0 U. V系统复位:; x- s+ U8 x* F5 P

% Y- I3 F9 q9 O" b" Z9 E$ y T1){}7J7TF~%U_U)T[1G8{W.png
; k; h. K& f/ K) |( P( n0 W4 D' y! l6 p% ^' }4 b: k) ~
内核复位:7 _7 k2 S8 Z$ @

1 e0 o# h4 k. W 6N@61AY`TTTH[$NW23GHM.png . f  M6 S7 F  [8 L( E, a1 I

. U6 [' \/ _7 R9 A通过上面复位测试可以发现,每种复位都会检测到NRST 引脚复位,难道每种复位都会将复位引脚电平拉低吗?通过示波器看看复位引脚电平:1 B) E+ i3 w+ _3 q4 t8 k  o
( F: W% M( [5 q7 L
25BIO2`Z_$D3$CD4$]9JHES.png 6 u2 p4 Y# L) h

1 S" M  d1 ?0 K$ y通过复位引脚波形可以看出,在其它复位情况发生时,复位引脚会有一个很短的负脉冲。说明其他复位源产生时,复位引脚电平也会变化。看来上面程序检测是正确的。
- v1 v2 J$ G1 A1 A0 g, M/ s( S. _1 D4 [0 \+ K& k( s% m, `" W

; ^" f9 n0 h& B2 ^; I$ |: Q
收藏 评论0 发布时间:2022-3-21 13:41

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版