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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:43
以<<STM32H7 开发指南(HAL 库版)>>为导引学习! z1 f. h2 [$ k+ O* I8 L
SYSTEM 文件夹介绍
% ]/ F: O! E: }2 `5 C! G- J本章包括如下 3 个小结:
  i; Q: s& m' I( h: Y5.1,delay 文件夹代码介绍;! t- P+ T. ^: f7 W3 N. t
5.2,sys 文件夹代码介绍;# L7 b) s. A+ ~- B
5.3,usart 文件夹代码介绍;
8 X# \1 K. j0 d6 E# S" S% ~, C' N% j
delay文件
4 e& T# B% \1 Q/ r是利用 STM32 的内部 SysTick 来实现延时的,这样既不占用中断,也不占用系统定时器。
; Y2 l0 o* h" K) ]! M/ q2 C6 oHAL 库延时函数 HAL_Delay :只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时5 l) F( C0 H$ E2 l& k
sys 文件夹+ Z& J- u' g9 @- ]
在 sys.h 里面除了函数申明外主要是定义了一
! Q; ~1 H0 {: N7 @; ~0 j7 i些常用数据类型短关键字。sys.c 里面除了定义时钟系统配置函数 Stm32_Clock_Init 外主要是一
6 J. S% o0 d: j/ ^6 I些汇编函数以及 Cache 相关操作函数,
& }' [- i3 ?0 d& t$ g
8 c3 C: Y/ p2 `& Z+ m( p4 [4 yUSART文件夹
  ]3 |' T* h2 g7 @" M6 _跑马灯实验和按键实验(GPIO的输入和输出)

2 [# ~  r, N! h" U7 f( ~5 u外设的编程一般流程
) C' q( {* [! P4 q% s8 m1.新建.C文件和.H文件(如led.c),保存在HARDWARE文件下新建子文件(如LED)
6 e& n) ~2 d- f! n' N# `6 u" m& F2. 20200110133616480.png 点击三色品字图标  h! g/ Y2 p+ U( J
" P! V" A9 r% d% ~  F0 D
20200110133717505.png

" A; ^: {; _5 E' F+ A% K/ b* w5 O  \7 A
把新建的HARDWARE文件和.c文件和.h文件添加3 ]3 {7 a9 b- l" c/ l+ [6 \8 t9 ^; C  Y
3.h文件定义,.c文件配置,使能外设
4 }  [( W: @6 k6 k; K4.外设:1)时钟使能7 p0 k2 q/ D- Z& W2 Z$ P" ^  F
          2)IO口模式设置  U5 b& l. x- H* ^( E, P
          3)其他设置0 K8 W5 {9 p1 `; B& U
串口通讯  ^1 W2 S! L( g+ M4 l
本节点以及下面的外部中断,等节点都可以用STM32CubeMX来配置,简单清晰8 q3 C7 N+ }1 D: q; `9 f, G
4 V; b  u5 h0 t; @# `0 u
外部中断
# n5 r# F* F& _$ k. ]因为我们这里初始化的是 PA0,调用该函数后中断线 0 会自动连接到 PA0。如果某个时间,我们又同样的方式初始化了 PB0,那么 PA0 与中断线的链接将被清除,而直接链接 PB0 到中断线 0。(就是说最好不要用数字相同的IO口做外部中断)
( l5 W8 |" v" Z* @0 e: a/ h0 E- g* Z下面我们再总结一下配置 IO 口外部中断的一般步骤:
! V+ [" I; v4 ~$ [& x1 x8 n" L+ T1)使能 IO 口时钟。
9 T# s6 n# s8 h; C2)调用函数 HAL_GPIO_Init 设置 IO 口模式,触发条件,使能 SYSCFG 时钟以及设置 IO
1 L* E5 Y( g2 X' }8 h/ F! M+ W口与中断线的映射关系。
! Q  y# \( p2 O4 y! j3)配置中断优先级(NVIC),并使能中断。9 N" I1 D, @- A
4)在中断服务函数中调用外部中断共用入口函数 HAL_GPIO_EXTI_IRQHandler。- S; }9 j  Y+ [; k  _
5)编写外部中断回调函数 HAL_GPIO_EXTI_Callback 实现控制逻辑。
5 Z5 ~" E/ j: t; r5 x/ n/ Q3 Q, e  s

6 M2 V2 j( ]6 A" e  F% P8 z独立看门狗(IWDG)实验1 a3 Q9 Y" ^5 J
1.含义,功能
: H: F2 Q4 O9 Y7 |7 E& S% C在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。
6 p, O1 F- C: b3 h9 Y3 q$ Y: H) `( R, w  I+ v) p- o
看门狗解决的问题是什么?
' U$ S9 @1 @4 G  Q9 k' s在启动正常运行的时候,系统不能复位。
: c# _/ o; w& }在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。
  h) ]' ^- T8 Q) B* m, d& Y
* R2 h3 t# i- M- E; o& s独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生) S5 y9 @$ e0 B& _" j! f
故障它仍有效。6 X1 o" W3 O% p7 r. {- ~
*独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。3 z- C  ^3 ^. K4 G
8 M2 ^2 s# T$ C. s# Y$ _( b
窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。; ]: K8 {% @( X  u4 G6 d
窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。7 U1 C8 [% B3 q; l- @

. R8 X6 g9 a  m0 \# b, j% Q. A2 M9 _# r3 a# |" l
2.
5 @1 l( b' V9 n, L- w3 r' ASTM32H743 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故  h! \  i4 K0 \) \: G4 B
障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的9 M) e% n# o* o3 }
32Khz,而是在 17~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频1 ^: P, ]0 U4 x+ c
率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。
, [) x' Z! D& R' j) k! ^+ p/ [2 ^* w" K# Y& g& k' W
3 .相关寄存器& e# ~* L4 }1 f9 a. b- E7 K! `
(IWDG_KR)0 _/ D8 _' E6 L. z
(IWDG_PR)4 L& C& j+ [: W- A& K# D
(IWDG_RLR)
( }! v0 m; O- p$ y9 O7 L9 [' o
3 F3 q9 H8 F- b, @% U1)看门狗溢出时间,该时间的计算方式为:
# g+ S2 L  |0 l. X; rTout=((4×2^prer) ×rlr) /32
5 A& x, u: T0 d1 n8 [其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),
4 q$ \% o8 P6 K3 _3 Q! X6 z范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);
7 {1 V6 L: l0 o  z" j  b8 f比如我们设定 prer 值为 4(4 代表的是 64 分频,HAL 库中可以使用宏定义标识符( {# P6 G/ M3 o% ]( x
IWDG_PRESCALER_64),rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,这样,看
' O* x! N: G* u/ w4 k门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会& m  m: D' U6 ]) D/ R- g% H
导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确+ n& L9 N" M/ ~6 l. Y2 Q& o. n* h4 w
的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。
' t! Q. L% d7 N; ?- r: [9 X8 Q2 y# Q6 T9 f- Y; x
2)接下来我们讲解一下通过 HAL 库配置独立看门狗的步骤:
& I9 s9 S' r! k1 R# X% O1)取消寄存器写保护,设置看门狗预分频系数和重装载值+ O! ?* n9 L+ W+ x( f9 z& G3 O7 X7 p& C
2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)4 A; r5 h5 U% |6 b0 P
3) 启动看门狗(向 IWDG_KR 写入 0XCCCC)
) ?2 E3 P% p- n' U) [3 M: O/ V9 {+ o7 x( h" v" y
窗口看门狗(WWDG)实验
. `1 [' Z9 g& k+ n9 t( `2 u; ~' H两个看门狗的区别" Z# v4 v+ ]$ W' t
STM32有2个看门狗:独立看门狗和窗口看门狗。( t3 j3 R" I/ O: E3 ]
- C, v6 J7 h5 w* d
1.* b  a3 W" y' X5 p+ ?7 D, _
独立看门狗IWDG–独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。
* @+ H9 z% O: P$ Q( @
0 d$ M) n* h) W: m( q窗口看门狗WWDG----系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。; A+ S3 z: H: q8 ^" z) Q8 s9 ^  c
4 U4 p' _' c# Y) }; J
. ~6 D- Z& J+ R" I' b5 P% }
2.
- b" t. ^# Z! i" O9 Q: t1 B; n上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保* [+ l4 S8 A+ f% v" p
窗口值大于 0X40,否则窗口就不存在了。8 B  R1 Y7 E7 ?. f
窗口看门狗的超时公式如下:* J6 L  e* T. o
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /RCC_PCLK3;
* S: J% A* l: M6 z其中:6 l2 e# q( X3 ^$ ?
Twwdg:WWDG 超时时间(单位为 ms)1 k4 o0 D) g1 l7 y* `
RCC_PCLK3:PCLK3 的时钟频率(单位为 Khz)
3 E. b0 R7 v: L6 U# A5 z- j7 yWDGTB:WWDG 的预分频系数
' c7 q' c5 A9 M! d4 o4 ]  P" kT[5:0]:窗口看门狗的计数器低 6 位( R" J2 a; k1 l) K" K' R
/ `9 ], T% k+ ~! q) }  O0 X
3. 相关寄存器
  T) J( q0 ^! {  CWWDG_CR0 A. E9 x4 J" `; V! d8 w3 q2 i
WWDG_CFR
6 ?# _, S6 K* G# Z/ A. u# gWWDG_SR
7 A! X% z! N' ^# U$ O) a0 {. a3 s! F
4.步骤如下:
, G6 r% R  {5 O2 A. L3 J$ Y/ M1)使能 WWDG 时钟
- M2 Y4 g/ N- I8 M' }& F2)设置窗口值,分频数和计数器初始值
# C6 y  K; o6 M+ h* P$ r, H) n3)开启 WWDG
+ R9 B) d# O6 ?4)使能中断通道并配置优先级(如果开启了 WWDG 中断)
0 V( n6 L' b- W4 b( S5)编写中断服务函数& h8 p, X. T2 p$ G. O( U
6) 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_EarlyWakeupCallback
+ Z( F9 d& P8 z9 a
% R+ @9 a+ r8 f
4 J" R) |- z  U: Z+ s" g1 h/ D- j1 s2 L2 b' H) Z2 X5 S% l
收藏 评论0 发布时间:2021-12-18 17:43

举报

0个回答

所属标签

相似分享

官网相关资源

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