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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:43
以<<STM32H7 开发指南(HAL 库版)>>为导引学习# O  j, j- F- A
SYSTEM 文件夹介绍
; I4 n: E* C$ H6 G8 S3 g8 {本章包括如下 3 个小结:
; N9 _& |* s/ ^+ i8 P5.1,delay 文件夹代码介绍;
) X& M% p" y  o5.2,sys 文件夹代码介绍;
3 i% ^: j6 d7 J/ |% h; `5.3,usart 文件夹代码介绍;
; i# G  H9 J+ \2 M& n- b3 [5 K+ R
2 P- G3 ~2 }6 \4 W4 Y) ddelay文件6 E. a+ C# B7 r* X% W) k
是利用 STM32 的内部 SysTick 来实现延时的,这样既不占用中断,也不占用系统定时器。
4 @1 r# T/ y/ [9 i: i; }; B6 hHAL 库延时函数 HAL_Delay :只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时4 n; T  ?6 w/ r0 j& o) d4 q/ a
sys 文件夹
8 ]; N, O  T( q: l/ T$ H在 sys.h 里面除了函数申明外主要是定义了一
. K5 g# X3 r5 Y  p! G3 `( w/ J些常用数据类型短关键字。sys.c 里面除了定义时钟系统配置函数 Stm32_Clock_Init 外主要是一2 D4 Y4 |, U7 p5 b2 a
些汇编函数以及 Cache 相关操作函数,
1 P/ }; b* _1 o! G% s" n! D& r- h9 q$ F. r4 Z3 J, Z
USART文件夹
" k- e$ ~7 R  B9 Z8 N( G3 C跑马灯实验和按键实验(GPIO的输入和输出)
& s$ u. w* S6 G/ n* C
外设的编程一般流程
) g; B/ v3 H. E! T9 F1.新建.C文件和.H文件(如led.c),保存在HARDWARE文件下新建子文件(如LED)
# ]" B  b6 d1 j: o2. 20200110133616480.png 点击三色品字图标( r9 R3 ?" m. M7 i' e+ K9 f+ ]
6 ^3 a+ ]! t0 m; V! p) J% e
20200110133717505.png
6 T4 M* V2 l9 b3 V

1 ]7 Z7 m* X7 u4 e把新建的HARDWARE文件和.c文件和.h文件添加' K/ j$ y1 }( R& ~9 ^" H2 {
3.h文件定义,.c文件配置,使能外设
$ B0 l2 z) |- d4.外设:1)时钟使能+ F  n4 z( O. I4 ]4 C: |" M
          2)IO口模式设置; [% a' y: e3 V  a5 l# B
          3)其他设置% i6 m0 K" }3 I3 @, J: r) b
串口通讯
3 C1 K5 j% I% f. q6 F本节点以及下面的外部中断,等节点都可以用STM32CubeMX来配置,简单清晰3 m# [" R! t* f2 [
% N2 h: r4 A4 I" C& W
外部中断
# h! S# d9 i  \# ]( y+ j因为我们这里初始化的是 PA0,调用该函数后中断线 0 会自动连接到 PA0。如果某个时间,我们又同样的方式初始化了 PB0,那么 PA0 与中断线的链接将被清除,而直接链接 PB0 到中断线 0。(就是说最好不要用数字相同的IO口做外部中断)$ {- _' e% J! a" a
下面我们再总结一下配置 IO 口外部中断的一般步骤:
. ^4 w4 f+ z/ c8 P/ H$ E9 T' H; }6 X$ q. H1)使能 IO 口时钟。4 O) l3 `3 f. s2 e; e
2)调用函数 HAL_GPIO_Init 设置 IO 口模式,触发条件,使能 SYSCFG 时钟以及设置 IO
6 E- h0 t! M9 x9 q+ g口与中断线的映射关系。
6 Z, F- E# `( k! O. e8 J; u3)配置中断优先级(NVIC),并使能中断。
6 P+ ~) q1 J, }- P1 P" S  b4)在中断服务函数中调用外部中断共用入口函数 HAL_GPIO_EXTI_IRQHandler。
# d0 v0 d$ Z$ B1 d% e5)编写外部中断回调函数 HAL_GPIO_EXTI_Callback 实现控制逻辑。
2 }3 [  Z" \" S+ g7 Y
6 H  k& T5 r, R. N  c
6 o# |3 n# `; k6 d3 ^4 e, A7 ^独立看门狗(IWDG)实验
' n+ o& m1 e: n& S( h1.含义,功能
3 b9 J  ~5 ^2 F, \4 r/ p在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。. K& @+ I; I/ `( s( Q

. l! u) u: p+ V+ p/ V$ ^看门狗解决的问题是什么?/ y( @  k& ]% K  D( v' w
在启动正常运行的时候,系统不能复位。& g! Q1 D$ Z9 {: G& W
在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。- |- y; e7 O5 |+ e) P

  T2 T2 F7 ]! Y% P$ S& I独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生3 b4 T% d! f; G" x
故障它仍有效。) K" t: ]" }9 o! n% C  J! M! e
*独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
, s7 O1 e+ E1 |: r1 p5 J- P* l8 f1 ^) @; o' n6 k
窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。
9 O1 s& D! m* K5 f: R" E+ Z" S窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。
$ T4 c2 `* m+ Y( r7 k0 }& n% ~$ Q$ i( g: M$ ~$ x5 ?# \

) j: o: d* z* D3 C2.
, o9 F2 }: }6 Y4 z* ~! h* ZSTM32H743 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故" R* W- z) g" J, F3 Q1 B9 j! ^; W
障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的/ @$ l/ O! R6 Q# P$ ?% v0 `
32Khz,而是在 17~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频; w# {8 p5 Z7 d: I' B! I* Z
率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。2 Y% P! B) s* u4 ^0 b9 }# q
1 o* V$ O( j' a! f1 J6 X
3 .相关寄存器5 r, q% t# b0 J, s# D
(IWDG_KR)* P% Q+ o: C4 ?+ t& J+ ?
(IWDG_PR)
8 U8 e$ z- F; A( `$ Z6 ]1 J(IWDG_RLR)
, L, p. r. w3 h: _
% S- v9 U) W% W& d1)看门狗溢出时间,该时间的计算方式为:
& L* g* v2 W# y+ E7 v1 ?5 dTout=((4×2^prer) ×rlr) /32
" T9 Q9 ^8 E3 T9 k2 A其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),& ]. ^' t7 J# d$ R. B
范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);
5 p) L6 w; x' y  @( @' u6 i9 d比如我们设定 prer 值为 4(4 代表的是 64 分频,HAL 库中可以使用宏定义标识符
) q* ]% u# w% C% hIWDG_PRESCALER_64),rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,这样,看
- h5 [+ U6 A: J$ V3 N1 J门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会. M3 H) y4 ~6 ~# `/ {
导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确
! e5 G+ b: ^* u5 X9 A的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。
5 a) Z1 q$ ^. {. u3 m; Q& B- j( e# P9 x9 ^
2)接下来我们讲解一下通过 HAL 库配置独立看门狗的步骤:2 ~5 j2 }$ D. ^$ j4 \7 O
1)取消寄存器写保护,设置看门狗预分频系数和重装载值
0 S4 q8 w+ _0 g1 L5 V0 U2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)! u* E: r4 Y8 W  i
3) 启动看门狗(向 IWDG_KR 写入 0XCCCC)2 ^6 }8 V5 o: B5 d. _) T! ?' K) V
: {- Q7 W  i2 ?, a6 E, B: x$ z
窗口看门狗(WWDG)实验
% D; Q% D* Y" }/ `2 ^1 Z) \两个看门狗的区别
  ~' s$ w3 M0 z1 ASTM32有2个看门狗:独立看门狗和窗口看门狗。
8 v6 E1 O% {( r! Q3 _9 Z) H- T
; n3 K( c# B% r1 g4 x1.+ W/ @% D0 L2 f. D& I+ H; [# v0 B
独立看门狗IWDG–独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。
/ q8 M5 P2 R1 H4 g, f* t7 M; w& G+ A# ^; u/ D! v
窗口看门狗WWDG----系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。
. v& D& o* A4 G7 u8 N5 ]' D& i7 m0 Z) j% W( f

% _0 ?: E# H- P  P1 c# J3 F( W2.
, }. L( H' }# n8 A  n$ p8 y% C上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保2 D/ J; ~9 F/ w4 Q( v7 B7 o
窗口值大于 0X40,否则窗口就不存在了。: Y+ d* q: d) T) J
窗口看门狗的超时公式如下:
3 Z9 g; `% X1 e4 N( s( e9 C6 }; Q8 ^Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /RCC_PCLK3;7 ]8 w. H9 S. y9 K; ?
其中:/ @! ]" N8 Z" T% d+ [
Twwdg:WWDG 超时时间(单位为 ms)
! q+ e4 r7 ^8 O: k4 x4 uRCC_PCLK3:PCLK3 的时钟频率(单位为 Khz)
! l5 f* G4 s1 E, t  x+ `WDGTB:WWDG 的预分频系数
/ P! e' a2 N5 N6 a9 FT[5:0]:窗口看门狗的计数器低 6 位
% E% H6 g5 @1 b8 k
- }0 v) _. Z" ?2 U3. 相关寄存器# i- R( Q  i- _- W7 V
WWDG_CR! V: j' {( T* g7 L& M: G$ P" _
WWDG_CFR
# j9 m% L3 \! E, S! H& u0 fWWDG_SR  j' j9 T$ F" y, |
4 Q1 t) g' z+ {, C# L. [
4.步骤如下:
1 g, v7 p8 U/ Y0 V8 u: x2 H, i1)使能 WWDG 时钟& U! x% r! U+ j5 K& H# m
2)设置窗口值,分频数和计数器初始值. m$ o1 l0 g  C- X7 j
3)开启 WWDG0 b3 I% {; M' y& n! t8 b
4)使能中断通道并配置优先级(如果开启了 WWDG 中断)
' w- K/ O' R; z3 s5)编写中断服务函数
, b- l/ B# v0 P( E: O1 G! ?6) 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_EarlyWakeupCallback
( w4 q5 G# [$ r% k2 X# m* k6 H% P& T* A/ v9 K( d1 y
) j& ^! w; }6 A" S* [
0 U* Q2 n6 E: x
收藏 评论0 发布时间:2021-12-18 17:43

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版