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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:43
以<<STM32H7 开发指南(HAL 库版)>>为导引学习
6 x$ X( c4 Y) d. V1 y) YSYSTEM 文件夹介绍
! ^8 Y  e( j* K, z' F6 u/ s本章包括如下 3 个小结:
1 \  n- Z; @; b& B, h4 u% A5.1,delay 文件夹代码介绍;9 O. ^  H* C) b1 q0 Y
5.2,sys 文件夹代码介绍;
, ?7 [$ g0 q; p, I9 j% J5.3,usart 文件夹代码介绍;
1 N% K2 T- k1 [0 z( r5 V& l. D' w) T; ^9 ~- @. c, v( |  v+ ^9 D9 g+ C+ E
delay文件  ]3 D* E2 X: `, |' \/ E
是利用 STM32 的内部 SysTick 来实现延时的,这样既不占用中断,也不占用系统定时器。
9 o- ^2 o5 y, Y. h' @% w7 CHAL 库延时函数 HAL_Delay :只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时2 R$ L3 X. l# u+ n, O, X
sys 文件夹# B* k8 z8 @8 @  w
在 sys.h 里面除了函数申明外主要是定义了一
* T" c4 D4 K( [0 r2 V些常用数据类型短关键字。sys.c 里面除了定义时钟系统配置函数 Stm32_Clock_Init 外主要是一
& G; v+ C# ]8 [# D- }) f* `些汇编函数以及 Cache 相关操作函数,
4 ~; j7 A5 W4 R$ r+ V0 M% l8 @; E; [4 Y  z4 i
USART文件夹9 ?: |% }- j% C! e* f% M
跑马灯实验和按键实验(GPIO的输入和输出)

7 }* B0 w# K4 Y7 |5 X外设的编程一般流程/ @4 M) L/ d" h+ w7 ?& G4 K0 v/ C
1.新建.C文件和.H文件(如led.c),保存在HARDWARE文件下新建子文件(如LED)
2 x# D) r" U9 P7 Y/ h2. 20200110133616480.png 点击三色品字图标
: V# G9 M& `+ ?0 s+ q( L% S4 z
$ Z' T7 M, M, a4 b1 z2 r
20200110133717505.png
/ h6 m. `* ?" B! k
5 t6 w/ r6 ^# e1 _, Z4 l  }
把新建的HARDWARE文件和.c文件和.h文件添加: L! z6 S$ w. q. y. Y$ Q% |
3.h文件定义,.c文件配置,使能外设
* o% r# i8 O* T$ ?4.外设:1)时钟使能
0 m: n# w/ U/ a4 \( h. N6 S          2)IO口模式设置- [. o1 j2 j) ?8 A+ d) H
          3)其他设置& A  M8 k# R, M; }/ O
串口通讯0 r. W, M. o* R7 A9 H- A0 c
本节点以及下面的外部中断,等节点都可以用STM32CubeMX来配置,简单清晰
, \2 K( a6 H( }, D0 G& T8 u
% [& L: M0 p6 ^/ K" Z外部中断9 t+ _/ _8 `- w) Y" G8 a
因为我们这里初始化的是 PA0,调用该函数后中断线 0 会自动连接到 PA0。如果某个时间,我们又同样的方式初始化了 PB0,那么 PA0 与中断线的链接将被清除,而直接链接 PB0 到中断线 0。(就是说最好不要用数字相同的IO口做外部中断)/ b/ u4 ~; d6 [6 m0 {
下面我们再总结一下配置 IO 口外部中断的一般步骤:
! P$ M" Y( _8 G8 b' j' D, z1)使能 IO 口时钟。
- j, W/ t3 U: T0 P7 f: e* u2)调用函数 HAL_GPIO_Init 设置 IO 口模式,触发条件,使能 SYSCFG 时钟以及设置 IO
7 B* y* o/ ]7 _, k口与中断线的映射关系。0 a; C0 l1 G. K7 b1 x2 c
3)配置中断优先级(NVIC),并使能中断。0 Y8 h: T" |% Q
4)在中断服务函数中调用外部中断共用入口函数 HAL_GPIO_EXTI_IRQHandler。! D* N" f; v1 Z* o( c. @
5)编写外部中断回调函数 HAL_GPIO_EXTI_Callback 实现控制逻辑。
( D& J: ~) }% \. _! g. e& f6 C
* ]% {6 z. l8 p+ t9 S# f5 R& a8 ~0 p- {& `
独立看门狗(IWDG)实验* P2 c* x/ X4 T8 v' o* Y7 L0 s
1.含义,功能+ N3 O6 w  N  z
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。
8 W! U. }1 _+ p. ]! N2 [" M. B. s
* M. y, L: E3 u/ n( d3 P看门狗解决的问题是什么?+ Y9 {* T3 _8 S  Z- ~
在启动正常运行的时候,系统不能复位。; ^) F! h# ?" A8 t0 S8 N5 G
在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。
8 b6 D) Z) T& C- V9 c! j. h' Q4 H2 C1 C. t- t5 ]
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生5 H/ T( L6 H. D: _; \* N
故障它仍有效。, a- S3 L: s0 ]0 [4 O2 i, O; k/ q
*独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
8 }) t" i5 w) B
* j* I4 U; K' J' D- k) S窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。
3 A) l1 m, D/ f+ K窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。
- g2 W" W# ~7 A3 T5 i0 m, i/ C6 J/ _5 J4 g& N# D
8 l) m8 c- S  Z% G
2.
" s5 w3 w' y" [% pSTM32H743 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故
0 m+ C6 G% {: r. x: h3 F7 ?5 x7 a+ W障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的( M; }3 ?$ ~& h- h
32Khz,而是在 17~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频7 a9 f* ?% L4 @( d9 |8 j
率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。- d5 Z- T% E; }% a: I* z# n7 a

5 A# O) h' I3 V4 A3 .相关寄存器
. n* D' e! Q5 d% Q$ c# I. ~(IWDG_KR)/ W: K1 q: X/ a& A; t$ O
(IWDG_PR)! D' m4 c+ P* k% O& v8 [1 c
(IWDG_RLR)
! D# N/ y; o' B% w' P* D
' P! c5 u& m0 I9 j! k& a0 D1)看门狗溢出时间,该时间的计算方式为:
  I. I- @. K, K7 c! sTout=((4×2^prer) ×rlr) /322 l2 B! e$ J8 d
其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),
# C6 \& j+ m4 T& [' z范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);& b/ k5 g% A3 R0 Q. a  ~: b# \: m
比如我们设定 prer 值为 4(4 代表的是 64 分频,HAL 库中可以使用宏定义标识符
# r' J/ n7 c7 J8 g! w3 `+ ?  dIWDG_PRESCALER_64),rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,这样,看- U7 b6 o& X& B7 _4 V
门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会' `" {2 M, L/ u5 j( W9 g7 U0 N
导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确& S: z$ M; B! p+ R! k3 e$ R+ ]
的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。
* d% f$ b! L. U+ g
" R: |8 ^1 @0 T$ c5 c0 D5 X; s2)接下来我们讲解一下通过 HAL 库配置独立看门狗的步骤:! `' ?' H  V" ]$ `1 X
1)取消寄存器写保护,设置看门狗预分频系数和重装载值
( F* Y* w5 i+ W2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)* I1 o. T. u0 {- M! E. ]' {+ v
3) 启动看门狗(向 IWDG_KR 写入 0XCCCC)
. u9 s( K5 a! b6 \' j, M; U0 L* o, p3 q1 {4 `
窗口看门狗(WWDG)实验
# l1 r+ W/ B4 M5 K9 l两个看门狗的区别$ R. l0 q& U; B: r2 k0 k: l- T4 p
STM32有2个看门狗:独立看门狗和窗口看门狗。
9 R3 E8 L8 ]5 I1 f9 b' g) @
6 H/ J. s, o& d2 l* M# j7 A  Q1.1 J( B6 r1 }. N- x% i0 `
独立看门狗IWDG–独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。
- A6 K. o5 u/ G( y, f+ `( W- u4 `$ R8 Z
窗口看门狗WWDG----系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。5 `3 V4 f& Y1 \6 u; ^! i: l

% ]) R! e, ^- c2 c: g- k) o- O; S* E; x/ G9 n
2.8 W  F- h& n8 P& l* A9 m, E% {
上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保- Z' H. k9 `! h! X
窗口值大于 0X40,否则窗口就不存在了。% p( B+ w9 h7 {( a% w
窗口看门狗的超时公式如下:
9 h9 W7 `7 T+ R  ^Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /RCC_PCLK3;
/ Y) v4 E% Y) |7 S1 f其中:$ M* y; m9 R  a  j; Z0 E
Twwdg:WWDG 超时时间(单位为 ms). r1 o4 ?, A0 i4 o* X
RCC_PCLK3:PCLK3 的时钟频率(单位为 Khz)  r! O; a+ A7 b6 w0 [! X3 o8 A
WDGTB:WWDG 的预分频系数- N! Y3 |$ H9 f
T[5:0]:窗口看门狗的计数器低 6 位$ T9 ~' I3 R1 D' A2 l: T4 G

9 B& A. b& @" c2 I3. 相关寄存器- a- _/ p" {# g5 ~" [7 b" e0 Y
WWDG_CR
# K4 b6 g! ~  l0 [WWDG_CFR; f, B) v6 q$ ~0 q4 {/ t) H
WWDG_SR7 \, Y5 l/ Y- Y/ K1 T

; y' S, T3 u3 q4.步骤如下:
0 T8 O/ d5 J) S  h0 a9 }1 w% m1)使能 WWDG 时钟+ K+ a% Y% z( y- x; J
2)设置窗口值,分频数和计数器初始值+ r! c- W) Q% n5 j6 ?  x" Z
3)开启 WWDG
. M2 Z8 q7 d7 H2 I; n( T9 @- R4)使能中断通道并配置优先级(如果开启了 WWDG 中断)4 y0 l* U" i' h
5)编写中断服务函数
$ R7 @" _4 u% S4 p, D8 K6) 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_EarlyWakeupCallback
. c8 O4 z' ]& \' ^! f% A8 ~: W3 l" w+ H  b

. @  m5 x7 f/ E5 N% [; x; J9 V$ o( W
赞 收藏 评论0 发布时间:2021-12-18 17:43

举报

0个回答

所属标签

相似技术帖

官网相关资源

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