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

【经验分享】STM32H7学习继续(STM32H7系列7)含外设的编程一般流程

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:43
以<<STM32H7 开发指南(HAL 库版)>>为导引学习+ a' J- K+ `: P- N: Z
SYSTEM 文件夹介绍
2 ]9 {6 }7 B. H2 j* e% a本章包括如下 3 个小结:
! Q2 q8 ]6 k+ Q( [5.1,delay 文件夹代码介绍;1 r2 L, M" z% t, j
5.2,sys 文件夹代码介绍;
6 e9 ?- J1 `- u$ e5 _, K5.3,usart 文件夹代码介绍;6 N! A5 w. e0 @6 R1 i( s6 T- m

+ n+ g4 _6 J: x% a, I0 Ydelay文件
4 q4 x' K: U' Q% ?) H: A. N$ t是利用 STM32 的内部 SysTick 来实现延时的,这样既不占用中断,也不占用系统定时器。) T( @; f$ {% |! }' B% o9 U, B
HAL 库延时函数 HAL_Delay :只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时/ V4 y4 k  i' D! e' R& ^; A5 f# a
sys 文件夹
; O" {, k! J, Z( p! e% _1 }在 sys.h 里面除了函数申明外主要是定义了一
8 q; K. O4 j; C( a% x些常用数据类型短关键字。sys.c 里面除了定义时钟系统配置函数 Stm32_Clock_Init 外主要是一
! d* N7 D# b! ^7 g些汇编函数以及 Cache 相关操作函数,9 e" D9 ?, g' F4 j9 Y7 e3 }2 X
0 }9 U( B8 t" ?
USART文件夹
- \! m! b) b! a$ }! c& \跑马灯实验和按键实验(GPIO的输入和输出)

  w* B* k3 Q# k# ?! A& s( S0 t' J, j* q& f外设的编程一般流程4 H3 [8 `% v& W( J
1.新建.C文件和.H文件(如led.c),保存在HARDWARE文件下新建子文件(如LED)
( V9 ]7 Y" p4 {2 R% c2. 20200110133616480.png 点击三色品字图标; |9 R' x1 ]) B5 m2 K2 x% m

- }: M, {) X7 ]; p
20200110133717505.png

2 L, H4 z8 ~8 E7 B9 d3 B4 `
2 u$ ]7 |4 B/ q7 q把新建的HARDWARE文件和.c文件和.h文件添加
- g6 Y5 U& I3 y% Z# F3.h文件定义,.c文件配置,使能外设5 B# `) W. \% A" D& a
4.外设:1)时钟使能8 [; U" ]. U  F7 L' |5 K0 _
          2)IO口模式设置# b! C7 A7 J9 U+ T, Y
          3)其他设置
8 s6 u6 C5 o% [( m+ p串口通讯# S: v3 k! |9 u5 T" T
本节点以及下面的外部中断,等节点都可以用STM32CubeMX来配置,简单清晰0 N% D# P8 s+ F- h
6 Z1 a' e* Y" {$ x% ?7 W8 U
外部中断2 X7 C3 b5 B. l0 t7 i/ a
因为我们这里初始化的是 PA0,调用该函数后中断线 0 会自动连接到 PA0。如果某个时间,我们又同样的方式初始化了 PB0,那么 PA0 与中断线的链接将被清除,而直接链接 PB0 到中断线 0。(就是说最好不要用数字相同的IO口做外部中断)
. v' g$ o( U) D: C# @# k: x下面我们再总结一下配置 IO 口外部中断的一般步骤:
& r  A" \; W0 z1)使能 IO 口时钟。
% A. X6 ?) Q% h4 {% d7 c2)调用函数 HAL_GPIO_Init 设置 IO 口模式,触发条件,使能 SYSCFG 时钟以及设置 IO
' M0 V1 L8 n  E+ B% u/ b0 a口与中断线的映射关系。
8 k1 X" x1 m# C5 W3)配置中断优先级(NVIC),并使能中断。0 Z1 [$ K+ G) ]  q5 t& f
4)在中断服务函数中调用外部中断共用入口函数 HAL_GPIO_EXTI_IRQHandler。+ |- y: @* ]# A6 i8 h
5)编写外部中断回调函数 HAL_GPIO_EXTI_Callback 实现控制逻辑。
) S6 |5 _8 C! K- P2 a
/ _6 K( Y+ B' v( V) v
/ C0 P$ k) |1 f+ R% [' }' l: J独立看门狗(IWDG)实验
; i! x& J$ u; O2 `0 C: n. F7 G1.含义,功能  `0 w; D) `# i$ c+ `  j' U
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。
' I# N; k0 m2 v7 I  i' G( j# a' h
看门狗解决的问题是什么?
9 G9 i6 W2 z2 e% R5 l1 G在启动正常运行的时候,系统不能复位。' `: ^0 t( x3 d6 \4 Q
在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。
* z% D/ U4 b+ M6 j1 T. G% x) B( u7 ]9 h' q% d4 d; Z! w) Y4 y: x
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生
0 \* r% O8 k" h" \: K( m$ Q5 _故障它仍有效。
# r% H. y; B$ E1 d*独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。; l1 n2 {7 Y: A  h- p$ G# \
  S- _* O# z. T: q/ Y, A& N
窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。' k0 X! p$ ~9 j) ^2 T
窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。5 B. S  `8 C7 _( d7 {1 ^2 ?
$ s& V% @$ a( ]1 C0 Y( e; T# r) {
) B& u" [( G1 a0 k
2.
5 D5 S7 ?) _$ J# D$ f7 Z. E2 ySTM32H743 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故. e7 ?& E9 M7 @% _. J2 \% N$ o
障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的
+ H. @8 G# ?, f" }32Khz,而是在 17~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频1 b1 s7 E0 A5 U) R: N- N% [
率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。
% ~7 n& r; g# i0 ^6 M
' l) w/ B! {6 [( u( V! X3 .相关寄存器9 q* ~+ K  i; `# _
(IWDG_KR)  A& y! S0 a6 C, L; F
(IWDG_PR)
' t- g5 i' Z( S, {7 y(IWDG_RLR)8 c6 C  b, F% L, V$ h8 q6 ~
5 x% ~. Q8 \# g" C( a$ B3 B! X
1)看门狗溢出时间,该时间的计算方式为:
, v7 l6 N0 Z3 W3 NTout=((4×2^prer) ×rlr) /32
$ P$ {4 |# _/ n# s3 G3 U1 |& `其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),
8 l4 ?- W* l7 d! o% r范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);
( t7 a) `# I( n1 \9 p比如我们设定 prer 值为 4(4 代表的是 64 分频,HAL 库中可以使用宏定义标识符3 J8 R/ U$ a2 U* s4 g+ _" ^( U
IWDG_PRESCALER_64),rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,这样,看
$ y3 W2 l* F6 R0 Z* n( v6 c门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会4 z  V' V+ ^% _7 X
导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确9 i  V: g2 ~/ a: {' n( M; w# P
的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。* x- P; a: E6 [5 |' ?: V4 \& b

; T! N/ [) \' D5 Q2)接下来我们讲解一下通过 HAL 库配置独立看门狗的步骤:, O7 s% {4 m  `9 k4 {1 g
1)取消寄存器写保护,设置看门狗预分频系数和重装载值" u3 E# I! F3 X; u: H
2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)6 C% b8 L7 u. r3 r
3) 启动看门狗(向 IWDG_KR 写入 0XCCCC)
* k# U  ?4 J8 k% l" O. ?: G& J
$ v; R0 j& {: }% n窗口看门狗(WWDG)实验8 m  ]0 n4 ?; [: e6 f( l9 K2 s
两个看门狗的区别/ Z2 M% j, N' P4 p7 i* m$ [
STM32有2个看门狗:独立看门狗和窗口看门狗。
0 ~- U. S/ D! q5 o$ ~: |' ^! [4 C7 I* {% J2 C  m1 |4 R9 f
1.
2 K# ~% J+ z% X4 ^5 U" l独立看门狗IWDG–独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。. F$ }( {% m  ?1 n3 A" b) G
7 [7 l7 R4 R: |# b2 k$ I4 b
窗口看门狗WWDG----系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。
9 }7 j' |9 `. ?, C# j: K- G! u% Q
. K% ]# J8 O* @/ C+ r9 H
, j* y1 |5 e& o) Z% o3 b2.
: v( C9 B% u1 f上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保0 E- h1 x- t5 U: O) _: |' C: V" z
窗口值大于 0X40,否则窗口就不存在了。" u; ]  u' K$ [/ w# {
窗口看门狗的超时公式如下:
& v  W9 Q& ]# s9 BTwwdg=(4096×2^WDGTB×(T[5:0]+1)) /RCC_PCLK3;
+ j- F0 ^4 R0 ]$ J" a" ]其中:! e7 O( ?( w! D% K" w7 a7 H
Twwdg:WWDG 超时时间(单位为 ms)
. r8 ~( ?& \. W- O+ J9 a, kRCC_PCLK3:PCLK3 的时钟频率(单位为 Khz)
) D: X4 c( E! U( d6 E- x' J6 SWDGTB:WWDG 的预分频系数
8 i+ V0 l- b3 j" H) r6 i- `# V- }T[5:0]:窗口看门狗的计数器低 6 位: A- X) ^0 m, x' i2 }$ b

5 w; D+ G% x. x0 O- L3. 相关寄存器
( Y5 @0 M. g7 T5 b) gWWDG_CR
9 e8 H4 {  E* _  PWWDG_CFR% n) J% B* e; O1 }8 m  \
WWDG_SR0 L. z% p& e- D! y4 X
8 K& o! [( q! ^
4.步骤如下:
2 ^$ v1 p; D( i6 d' [+ ~1)使能 WWDG 时钟
0 Z1 A6 ]7 u: h( _" K2)设置窗口值,分频数和计数器初始值; z- e; x% M  R% j
3)开启 WWDG
4 c) o' w' x% \" [+ Y4)使能中断通道并配置优先级(如果开启了 WWDG 中断)' m( n" L( ]1 K+ }  i9 c& }
5)编写中断服务函数
$ l8 \/ F! |+ t0 w& ^& I* _6) 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_EarlyWakeupCallback
7 g) x/ q' e+ c! H6 U! T" u
# [" N. H7 W' W$ x4 I/ D; R
& T0 O& I/ @$ z4 V! i: I3 ~/ h: n- n' V4 o) M4 A# f" n  Y% F
收藏 评论0 发布时间:2021-12-18 17:43

举报

0个回答

所属标签

相似技术帖

官网相关资源

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