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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:43
以<<STM32H7 开发指南(HAL 库版)>>为导引学习2 m! Z0 s- O. K: U/ x* d
SYSTEM 文件夹介绍
+ m( k+ y7 H/ p' X1 N3 W* m  p本章包括如下 3 个小结:& `4 E, }! I0 B) p1 K
5.1,delay 文件夹代码介绍;+ [9 u' [5 B; _1 \5 l
5.2,sys 文件夹代码介绍;# t  Q( Z' u. H1 y3 m
5.3,usart 文件夹代码介绍;
7 L$ D; |& a/ E, e% R! c$ H  @2 x& C% Q& `( [/ d+ N
delay文件
( W7 s3 X, h. Q$ O5 e4 r) g是利用 STM32 的内部 SysTick 来实现延时的,这样既不占用中断,也不占用系统定时器。
/ ^! A8 r* h9 k4 V& r1 PHAL 库延时函数 HAL_Delay :只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时
# G$ f" d- X( |; P9 R6 x; p8 Ysys 文件夹
! ^; T; C& o: l0 q在 sys.h 里面除了函数申明外主要是定义了一4 _9 r2 S' s8 Q! ^" q
些常用数据类型短关键字。sys.c 里面除了定义时钟系统配置函数 Stm32_Clock_Init 外主要是一
3 ?6 X: K- m3 p2 G+ p些汇编函数以及 Cache 相关操作函数,* E/ q4 N& B& s; y/ T) K" ]

2 {3 M0 j5 \$ P8 gUSART文件夹- b% r; A3 _3 c* {
跑马灯实验和按键实验(GPIO的输入和输出)
; u1 q( k" u' l# v$ h; ?3 L
外设的编程一般流程5 e# d* q! I# R% n. r  E
1.新建.C文件和.H文件(如led.c),保存在HARDWARE文件下新建子文件(如LED)
+ s7 o0 ~& v. w' @  |) m2. 20200110133616480.png 点击三色品字图标: j( }. a/ A. L3 y. _: D! L2 f# x' P

4 `0 L* g( L- z) k- x, `
20200110133717505.png

- Q7 d" [. ?, d' U$ m" b! ?# T8 R
- g) W/ x* O6 N5 G" x把新建的HARDWARE文件和.c文件和.h文件添加; g& r, G1 Y  F; e- F! T( _
3.h文件定义,.c文件配置,使能外设4 m4 G* z' H* k, h
4.外设:1)时钟使能/ f. y- J7 U# T% ]6 v2 C) a
          2)IO口模式设置, ~. M# G. G* I( k; M' I
          3)其他设置, y6 j, {6 T4 j( Y! W) `* O8 r
串口通讯+ c# A5 P4 m# _* X3 l6 B
本节点以及下面的外部中断,等节点都可以用STM32CubeMX来配置,简单清晰4 _) ]1 V3 \, ^6 v, V
1 F5 n2 S. z6 l+ L$ [% T6 z+ y: o
外部中断0 b( {3 k  s0 W8 N% m; F8 m
因为我们这里初始化的是 PA0,调用该函数后中断线 0 会自动连接到 PA0。如果某个时间,我们又同样的方式初始化了 PB0,那么 PA0 与中断线的链接将被清除,而直接链接 PB0 到中断线 0。(就是说最好不要用数字相同的IO口做外部中断). C# d" Z2 L! k: J- m
下面我们再总结一下配置 IO 口外部中断的一般步骤:
* c, C! w6 D; k, x( t2 c1)使能 IO 口时钟。4 R) x5 Q0 W, j" s* _5 H
2)调用函数 HAL_GPIO_Init 设置 IO 口模式,触发条件,使能 SYSCFG 时钟以及设置 IO
; T+ G  G4 {+ R) [! s口与中断线的映射关系。+ X" c1 h2 ?5 q, O& x/ A2 C
3)配置中断优先级(NVIC),并使能中断。4 x& d4 r$ S5 u7 |+ L- q9 k
4)在中断服务函数中调用外部中断共用入口函数 HAL_GPIO_EXTI_IRQHandler。- k/ B- f+ }7 I5 o9 M- b
5)编写外部中断回调函数 HAL_GPIO_EXTI_Callback 实现控制逻辑。0 e' Q3 a5 A. |5 J, Q% b

" c  w0 i3 {: a. e( D( e7 Z. y6 w, B
4 X" [* S" k( U( I, A0 Y独立看门狗(IWDG)实验
+ q" p/ B# M, X/ ^1.含义,功能
9 ~$ X: t( V7 n. H$ K在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。
: c4 b8 }' t, J. Y3 _1 `1 L. `% [; ?" Y) o) a  v! S" N$ V
看门狗解决的问题是什么?% `" ?" E7 b: X5 c4 l5 c, l
在启动正常运行的时候,系统不能复位。% n* w0 T; T$ K' q4 `
在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。
- A& }' I% x8 W  @( g5 a% l6 P- }& h) J. @  F" g8 v
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生
6 V* e+ T+ @0 h1 H- ]故障它仍有效。; c- y! w* E- y- q
*独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
" |) O& |. V$ P4 O( w2 R" X2 l  W' c2 y+ p9 t
窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。1 k9 y* q4 O# t* D4 n, p9 A
窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。. g; @% `. l- z" T; I
, U( B, Z3 L3 D. }
" x6 h; w# Z2 C2 `, ~6 z; R
2.3 X6 I$ C+ C& O! ]- x
STM32H743 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故
7 I) L9 Z! h7 N障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的* l3 b! L, h+ r" ^" r; R5 f2 i
32Khz,而是在 17~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频2 @# p7 q8 ?# u* |- B5 z8 c- w
率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。
2 r( W0 j3 `: N2 g3 _  R* ^0 w  u
3 .相关寄存器4 w% W  B: \# p% E) J* Q* B2 x
(IWDG_KR)
3 f$ q# F+ s2 D5 j" q) F& W(IWDG_PR)* N: M" S% E3 V: n7 U. J% {
(IWDG_RLR). a/ i' l6 }5 u. ~1 K9 V

. q9 t, w* `; |$ j3 v  p1)看门狗溢出时间,该时间的计算方式为:* ~+ Q2 i- ?6 @$ M
Tout=((4×2^prer) ×rlr) /32
- \& K* K- r0 u% h其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),5 _, ~# K1 x! P5 X
范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);0 T2 ^' T; i! N" k' |( j9 A
比如我们设定 prer 值为 4(4 代表的是 64 分频,HAL 库中可以使用宏定义标识符( P. \, c0 ^. }, b/ |: p6 O* N+ j
IWDG_PRESCALER_64),rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,这样,看! C; C& H6 O4 P8 e+ ~' G
门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会9 I7 a! f, |, N* C/ }  }1 ?
导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确
& S; {, L- v- }& {/ N的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。  C% X! v/ [6 n( g( }$ o

/ d4 K7 T% b6 T! y- [; R2)接下来我们讲解一下通过 HAL 库配置独立看门狗的步骤:1 D7 s" m! E% ^: E
1)取消寄存器写保护,设置看门狗预分频系数和重装载值2 f  h6 `7 r7 A" F
2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)
* `$ j1 }9 k$ \* D' W' L9 E8 n3) 启动看门狗(向 IWDG_KR 写入 0XCCCC)
4 C& s- t; y/ y2 ]5 B7 N% ^3 p
4 _) U8 f) r3 \5 p3 a窗口看门狗(WWDG)实验- d; V0 }9 {9 u, K' J9 ?% x( W
两个看门狗的区别
: h( X$ \9 u' q. @4 q& ZSTM32有2个看门狗:独立看门狗和窗口看门狗。0 F; f$ y( k; p' N" L  O! b/ O

5 {& C! l5 V/ @9 E8 A2 ]( {1.3 H1 B' ~0 s1 H7 k7 O
独立看门狗IWDG–独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。
# q! v! O# E1 g0 E3 J8 _, Z
$ X; k5 f6 m. r( L& _窗口看门狗WWDG----系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。4 F# S+ X8 F$ G, K( K  B* \
" ^0 s7 l* }! u. d- S( N. i
$ A6 p) |1 I7 m- W: i# E4 p
2.
+ v2 L5 U+ a) v0 j% j上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保5 b) d, y5 A% ~- B
窗口值大于 0X40,否则窗口就不存在了。5 S; Z/ s- ^( M6 w
窗口看门狗的超时公式如下:0 c, ^$ K" p9 V5 l
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /RCC_PCLK3;) o  m' m; h. @
其中:
) ?1 ]* L1 n/ |7 B1 K2 q/ |Twwdg:WWDG 超时时间(单位为 ms)
3 P3 Y) Y. {% ^: GRCC_PCLK3:PCLK3 的时钟频率(单位为 Khz)7 ?2 v" ~' U' S4 Q2 o/ p+ K; v
WDGTB:WWDG 的预分频系数- B8 {' u. ^- H4 w
T[5:0]:窗口看门狗的计数器低 6 位
4 W" Q  _4 ^9 U8 C* s6 g; ^# @8 E
2 E3 G/ T+ Q; v# L2 T( G: ^. K4 G! {3. 相关寄存器
" a7 _. a7 h% c3 t0 OWWDG_CR
8 M/ J4 V: L% HWWDG_CFR- e; k) D: {* J4 Z3 h! l# r
WWDG_SR
* R& d5 ], n- m6 f7 ?8 J3 J
" ]. j. L6 z' j$ V: y4.步骤如下:- P  K+ u) a- l+ t& D2 ^
1)使能 WWDG 时钟
5 u- `( s3 {1 A2)设置窗口值,分频数和计数器初始值4 z- j+ @  M" M2 _6 B6 b
3)开启 WWDG
$ u8 D; ~+ v) a. V" U4)使能中断通道并配置优先级(如果开启了 WWDG 中断). z2 v8 V- J& I
5)编写中断服务函数1 f/ L# i- v2 A9 O
6) 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_EarlyWakeupCallback% g* ^" l( p, C

6 H7 F( ~' K. e+ E# J9 h! w
0 M- q; V+ S! C
# }: e7 R. p6 x: q0 k3 W$ ?* @  s
收藏 评论0 发布时间:2021-12-18 17:43

举报

0个回答

所属标签

相似分享

官网相关资源

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