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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:43
以<<STM32H7 开发指南(HAL 库版)>>为导引学习
5 y5 l  ?; u6 ESYSTEM 文件夹介绍
2 L* R  L9 H, V! H本章包括如下 3 个小结:8 x% r8 J- V* u1 w' r. _6 t
5.1,delay 文件夹代码介绍;8 N! w" I7 B0 L# h2 Y( w' N
5.2,sys 文件夹代码介绍;& p+ x+ G0 Z* a: L2 t: l$ H  f; s
5.3,usart 文件夹代码介绍;3 V* c' u( L3 s
5 |) X# n- g9 o: T
delay文件
" V9 i2 m0 O) ^是利用 STM32 的内部 SysTick 来实现延时的,这样既不占用中断,也不占用系统定时器。
0 `* U3 s8 A8 d! V) ^- OHAL 库延时函数 HAL_Delay :只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时
5 n2 G/ n6 o, r& x9 ^sys 文件夹: y6 l5 |) }3 ^+ p3 {+ O' S& v  E1 v
在 sys.h 里面除了函数申明外主要是定义了一
" g% b8 m8 h9 k( V些常用数据类型短关键字。sys.c 里面除了定义时钟系统配置函数 Stm32_Clock_Init 外主要是一
: @1 d" V6 @. R* X些汇编函数以及 Cache 相关操作函数,& e$ C( p# M' v

0 b; u# w9 A1 hUSART文件夹) W: J' v. k! }' O6 g
跑马灯实验和按键实验(GPIO的输入和输出)
% w! K2 Q& [( o+ o& E
外设的编程一般流程
- E8 l3 G6 h; n# `+ _' G1.新建.C文件和.H文件(如led.c),保存在HARDWARE文件下新建子文件(如LED)) q% o3 j, W5 \
2. 20200110133616480.png 点击三色品字图标; K! M  n# ]' c
$ s9 s* r7 z& f; w5 B' o( ~
20200110133717505.png
  E" [" i9 G, h2 B# w

0 I/ c, \/ I+ y0 Q* P7 j% I把新建的HARDWARE文件和.c文件和.h文件添加5 M$ g' U( }+ i) O0 H# \: A
3.h文件定义,.c文件配置,使能外设% E9 z; w) t* T6 e
4.外设:1)时钟使能2 R% [0 A$ S9 R' q" Y8 J
          2)IO口模式设置
$ N6 p8 J2 m3 A$ E          3)其他设置! b7 ]3 X( {" S% h' f9 v
串口通讯; @$ K9 @! s1 J2 U
本节点以及下面的外部中断,等节点都可以用STM32CubeMX来配置,简单清晰* Q* K. y5 `/ L' Q) a8 ?$ |% B
/ v/ ?: x* P' |0 d$ _4 M" n% X
外部中断) E- W6 p- Y/ e* S/ N
因为我们这里初始化的是 PA0,调用该函数后中断线 0 会自动连接到 PA0。如果某个时间,我们又同样的方式初始化了 PB0,那么 PA0 与中断线的链接将被清除,而直接链接 PB0 到中断线 0。(就是说最好不要用数字相同的IO口做外部中断)2 F& h8 V1 n4 p. O  z9 y
下面我们再总结一下配置 IO 口外部中断的一般步骤:
% |3 V& [4 b! x1 R- y( N+ l1)使能 IO 口时钟。
" G& {' r$ W4 Z7 f5 h  q2)调用函数 HAL_GPIO_Init 设置 IO 口模式,触发条件,使能 SYSCFG 时钟以及设置 IO
+ ]% w$ _2 E5 D. T口与中断线的映射关系。! }. i) T' Y- E8 t/ Z
3)配置中断优先级(NVIC),并使能中断。
: n, I1 L) Y9 ~' v' L4)在中断服务函数中调用外部中断共用入口函数 HAL_GPIO_EXTI_IRQHandler。  W9 F6 h# I0 J3 }% }( R. t
5)编写外部中断回调函数 HAL_GPIO_EXTI_Callback 实现控制逻辑。/ w3 k" X; J7 N2 k- @6 f$ k
2 s) D% L/ H3 m+ |! G/ S! `5 c
; R+ x! K. Y- D2 Y% D0 o
独立看门狗(IWDG)实验
5 B. x" W- X7 L, ]7 f  s; @2 B1.含义,功能" f$ O6 H+ X+ `  j4 |* k
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。
) C1 Y4 w" }5 E' b% @& `1 R# ~5 U) M# g+ ^7 m( A
看门狗解决的问题是什么?- Z1 X, g- {1 w! y4 d
在启动正常运行的时候,系统不能复位。
& N; A4 x- M9 q1 J( x: O, }" H( }4 q在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。1 i# s4 U! V$ S# f
) [% Q$ x1 W, c+ Y6 l, K$ X
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生
; Z. s8 m5 `$ s2 a故障它仍有效。! ~6 s7 W' i1 a) T( E" f. g4 ~
*独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。9 O6 |- E& F" W  J" h

7 ]; {  n% L' X" C" z" c窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。
3 u! O( Z  W9 C' i2 J& {窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。
% {3 O6 g& J) K, O4 C% D8 G! l
3 H. i" W; `1 Y2 ?
# `/ O) X0 L" V& |9 B8 N. [0 t  I2.$ R4 L( F, z7 C& p
STM32H743 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故: c8 Z! e; {$ K! L1 Z9 a' }
障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的! F2 P+ u1 F% v0 d8 L0 R% x, G) v  X
32Khz,而是在 17~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频
1 o3 g: w2 `: r0 ~( z. |. c率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。+ G9 P2 r, E3 o. e6 d8 c
! r! b4 Y6 Q9 U
3 .相关寄存器% s- ?- y' K  `' `' T
(IWDG_KR); s# \' ?6 c1 G' ?. Y# |
(IWDG_PR)# T$ x+ g' P! h
(IWDG_RLR)8 o8 h- k( c0 Z
  o9 S$ m" P  A; i2 z: z5 P
1)看门狗溢出时间,该时间的计算方式为:
0 u+ @$ T8 P/ v5 BTout=((4×2^prer) ×rlr) /32
: q% V- S8 f  X: l- s& n- T/ I- p其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),# c. I! C6 w" P$ {' J
范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);! J" N# z$ Q# {% x0 z
比如我们设定 prer 值为 4(4 代表的是 64 分频,HAL 库中可以使用宏定义标识符! z, _$ U; }3 m6 ^( F
IWDG_PRESCALER_64),rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,这样,看
0 N6 I+ c: a7 T  }4 z$ C1 m门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会, w8 e/ W6 }4 y+ s% E
导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确/ G& ^5 B; {  L' e. P3 j! ~
的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。
, `" w  J( S5 L2 P7 e8 V
; ^  C6 F2 j! ]& d7 O2)接下来我们讲解一下通过 HAL 库配置独立看门狗的步骤:# G! a% W4 ?* N% q
1)取消寄存器写保护,设置看门狗预分频系数和重装载值0 Z3 [, n: I9 y  o( ?0 M6 z  V, i
2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)8 x' E3 N  S+ L+ y; ^; w3 Q
3) 启动看门狗(向 IWDG_KR 写入 0XCCCC)
* i; V* j9 g) f; \3 N; _
, R8 t! n9 S2 {& S' ^0 |窗口看门狗(WWDG)实验5 U1 d& n+ T$ _/ {( {
两个看门狗的区别
, \: K* A. x8 C. u" h3 {STM32有2个看门狗:独立看门狗和窗口看门狗。# q$ H) K1 d! h

/ f- L2 d# E4 X- ]1.
7 c6 \. n6 a" e: ]独立看门狗IWDG–独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。
. }: h* W% p3 U  P7 J$ E2 m
3 H# i' O# H* D3 i  \/ M2 \4 k窗口看门狗WWDG----系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。, a  v0 y, k% i8 }& B- j
. g& \. p7 n$ w* b4 J4 J5 ~

4 U4 y& z0 U% p* T2.7 g# \8 ^( o; S0 D% m# f# \
上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保
2 U% s6 {; a2 M1 N窗口值大于 0X40,否则窗口就不存在了。
; T$ X" A  A3 E+ x* _5 A: z' S6 e窗口看门狗的超时公式如下:8 E, A" Z. R: r
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /RCC_PCLK3;
- T& B; m  ]$ n; a# d其中:! I4 c5 Q$ f/ A' p3 p) }
Twwdg:WWDG 超时时间(单位为 ms)
( l7 }5 F0 P3 k- V% lRCC_PCLK3:PCLK3 的时钟频率(单位为 Khz)2 ]4 w" S1 p. l/ j0 R5 {
WDGTB:WWDG 的预分频系数
+ E6 _# k( K8 Q% Y2 j5 B0 uT[5:0]:窗口看门狗的计数器低 6 位: U+ e$ J1 |( m: K
7 }% t1 X8 G1 K: H. A* ]0 A
3. 相关寄存器$ e( T9 I- k3 Z! c' r5 P. j  S
WWDG_CR# ^) P5 \( L5 F/ t$ c+ B, }
WWDG_CFR" ]1 d* k8 n% W- U! C& v; K3 z8 Y
WWDG_SR
0 ?+ D) S% Q' m4 j; h, i$ C, R% \& o7 }& z8 e0 A& ]
4.步骤如下:4 n, ]9 i8 I6 Z: M6 L
1)使能 WWDG 时钟
3 w8 f) U" {& e% A$ x2)设置窗口值,分频数和计数器初始值
4 O  J! J3 _  a3)开启 WWDG3 |) l0 U' Y. c+ I4 H
4)使能中断通道并配置优先级(如果开启了 WWDG 中断)6 S3 u4 x( k( j/ C
5)编写中断服务函数/ K, i# m+ _! k  I
6) 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_EarlyWakeupCallback1 E# y  P+ j; ^* O- @

: s2 \: c1 s) e
0 @6 A5 C2 k4 ?/ l# e( t4 t& d1 v. |  X! o' \1 f" ]$ q3 z* s
收藏 评论0 发布时间:2021-12-18 17:43

举报

0个回答

所属标签

相似分享

官网相关资源

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