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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:43
以<<STM32H7 开发指南(HAL 库版)>>为导引学习
8 I5 q' q$ W' z: t  a) ?SYSTEM 文件夹介绍
" a; V" u: w) i, E  d本章包括如下 3 个小结:2 S; \' l3 o9 U. x! w' j! s
5.1,delay 文件夹代码介绍;
8 }3 M: M( c1 C  D0 _2 _5.2,sys 文件夹代码介绍;
* N$ z" x  ], c' y2 B5.3,usart 文件夹代码介绍;
0 ?! i6 U; M. y& ?- k! d4 B1 B: _9 C0 m# M% @7 Y$ s# k# |6 p
delay文件
1 b5 E+ }) t7 M6 ~$ L是利用 STM32 的内部 SysTick 来实现延时的,这样既不占用中断,也不占用系统定时器。" x3 A: v& U, r$ J; y' v
HAL 库延时函数 HAL_Delay :只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时1 c8 B- w6 z* h. p; k& G
sys 文件夹" h- w# A: \  x5 A# {
在 sys.h 里面除了函数申明外主要是定义了一
5 l2 d. K( B0 Z& Y3 m些常用数据类型短关键字。sys.c 里面除了定义时钟系统配置函数 Stm32_Clock_Init 外主要是一% H* v* U% N0 j$ Z& I
些汇编函数以及 Cache 相关操作函数,
4 T7 o! c" f' _: Y3 Y) o* x: e8 f/ U" c+ B1 S1 O8 b
USART文件夹" b4 K) }, f& ~
跑马灯实验和按键实验(GPIO的输入和输出)

4 K9 _5 V( o6 @! J, }7 F/ f外设的编程一般流程
, y* r/ i1 R  q! q4 J' }1.新建.C文件和.H文件(如led.c),保存在HARDWARE文件下新建子文件(如LED)2 s) L8 W8 s! _6 D1 `. S& j
2. 20200110133616480.png 点击三色品字图标
( T6 G: E, f- s1 s) x  M1 r% ?
# h# d  j$ L2 X5 Y
20200110133717505.png

9 ]9 \) B$ V+ D* G; @, s& ^, D6 T3 g& K
把新建的HARDWARE文件和.c文件和.h文件添加# e( T/ z* W. N" s& A; B
3.h文件定义,.c文件配置,使能外设# G  @, J% K! W7 T7 X. O! v
4.外设:1)时钟使能
4 f+ v8 n' a7 C7 R1 E; }$ Z" F, Z          2)IO口模式设置* R9 Z* _# i2 I6 Z2 O) V2 `/ j; Z7 U
          3)其他设置
; `: e+ N% S- a, @  i6 M8 \# ~串口通讯
8 m" s7 x/ m7 W* F5 P6 W7 A本节点以及下面的外部中断,等节点都可以用STM32CubeMX来配置,简单清晰
. I  _* R: u# ]& V" n8 w1 j0 [7 F' S3 n: l/ T
外部中断
3 X% C: j3 ]4 ?$ C! D因为我们这里初始化的是 PA0,调用该函数后中断线 0 会自动连接到 PA0。如果某个时间,我们又同样的方式初始化了 PB0,那么 PA0 与中断线的链接将被清除,而直接链接 PB0 到中断线 0。(就是说最好不要用数字相同的IO口做外部中断)* R- |( n6 |: x* i5 a2 E
下面我们再总结一下配置 IO 口外部中断的一般步骤:  H/ U3 T( N* g& b8 N2 L7 X
1)使能 IO 口时钟。
5 Y5 Y% g, ~6 o" ~' x3 G2)调用函数 HAL_GPIO_Init 设置 IO 口模式,触发条件,使能 SYSCFG 时钟以及设置 IO
# B. @- L8 G/ i( l- j口与中断线的映射关系。
, s2 M4 P8 @# A3)配置中断优先级(NVIC),并使能中断。
. U+ D+ `  b8 v# G/ C/ o6 O4)在中断服务函数中调用外部中断共用入口函数 HAL_GPIO_EXTI_IRQHandler。3 F5 c7 x6 \' X# B
5)编写外部中断回调函数 HAL_GPIO_EXTI_Callback 实现控制逻辑。
# p  g3 o, m& ^( Y# B" f5 f" _- B2 Z& S. ^# V; _

% a! ^. C  t& M1 C+ q& f! \独立看门狗(IWDG)实验
1 _5 {/ X5 r. |5 J+ v' e2 n0 L1.含义,功能
1 Q! q$ }: K  _) N" \  o/ H% A9 s在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。
$ x1 p) x  ]; l8 I+ X* a8 t: S3 l: K1 F" x$ ^/ H
看门狗解决的问题是什么?
. n7 e$ y$ b" H1 \在启动正常运行的时候,系统不能复位。
0 V2 E2 x7 w2 t' o在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。
% U3 C/ \4 Q% U! H. s& C1 Q2 R& r- X- r
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生
: E7 I* Y, u; X# I4 `- h2 a6 m3 \故障它仍有效。/ |6 m3 S' z& u% ]
*独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。1 ?* q4 e8 n/ [9 S; f

3 z8 @# v6 q+ f, i0 \" k! _窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。
4 k/ x! k8 k1 i  A5 ~$ H窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。, i* f6 w4 T" E$ Q8 G; L
! {) p1 T/ I) F# v- E7 J
" b& I, J' U, `6 e$ x
2.7 T% }* }1 e! q0 w: _! v7 \
STM32H743 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故2 W( H( ?8 Y  {7 Y0 m9 Z
障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的
- N$ |) W/ P+ }5 B% u5 i' g# C% W+ |32Khz,而是在 17~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频1 Y+ x. L  P  G+ H1 k
率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。, _& j5 c! {' d. _# j

( u) }9 Q3 `3 |3 .相关寄存器
1 S6 |( b1 C+ I0 S( m" T7 X(IWDG_KR)+ o2 f* S, N4 h/ ]. z: B
(IWDG_PR)
9 k7 N' f8 B, A, l. u; s(IWDG_RLR)# ~8 J0 q5 d& _* P7 I
# }  p4 V, {+ n
1)看门狗溢出时间,该时间的计算方式为:, y# T% U5 q$ h
Tout=((4×2^prer) ×rlr) /32! L/ t' N8 y1 ?0 l' e6 w
其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),
3 r) h, t" N8 Y范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);) [; _9 h, ~( [  b- p4 t5 n9 S
比如我们设定 prer 值为 4(4 代表的是 64 分频,HAL 库中可以使用宏定义标识符
5 E) ~/ A4 }+ Q/ x4 [( `, k# jIWDG_PRESCALER_64),rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,这样,看) S7 [. t* z) V  ~+ ^6 g
门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会
% ?( j! _3 c8 U. V) J# ~( U导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确
) v# l* L9 n9 B4 K+ k% f, }. Z的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。
% [# l  Q1 V( J: k$ L* X9 C( v& h! l. Q1 p5 w0 e
2)接下来我们讲解一下通过 HAL 库配置独立看门狗的步骤:( R3 D1 p) T& R# s7 j6 j
1)取消寄存器写保护,设置看门狗预分频系数和重装载值+ M0 {; Y( e7 ~6 a
2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)
& K! M$ T$ l) M! |2 Z3) 启动看门狗(向 IWDG_KR 写入 0XCCCC)
2 K6 j) T* \0 X# I6 e# _! e0 B" E8 g4 h
窗口看门狗(WWDG)实验
. k/ O4 H/ e" D/ e+ q. z! C" K两个看门狗的区别- Y* k% x4 Y* i/ e' B
STM32有2个看门狗:独立看门狗和窗口看门狗。
/ _( [* G# q! U6 W2 ?  [2 l# H% I5 m/ a" s, {9 \, n
1.
$ G" i" j' \1 N' _, a! j# g独立看门狗IWDG–独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。
$ x6 g! K( N. {4 }$ [7 m* K/ g1 M* [1 t5 b& h3 }6 h
窗口看门狗WWDG----系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。+ `+ ^( ^3 K  ~% v

+ A; T6 M, I9 j9 Q( h0 j, [7 ^
: v6 P8 H- w' V4 s% p9 z2.
+ v  W# x6 D+ G1 ^1 N上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保
% }6 h! A3 @" @6 F% X窗口值大于 0X40,否则窗口就不存在了。( K! `: }8 O1 c% u1 Z! \+ d, J
窗口看门狗的超时公式如下:7 a! v. x. A. |" X, C6 H* x" Z/ ]# t
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /RCC_PCLK3;5 Z' M! b) X+ ~( ?% a: Z. X$ Y6 z
其中:+ _0 g+ K2 ^) O; h
Twwdg:WWDG 超时时间(单位为 ms)
" {9 l  M7 a( ^. rRCC_PCLK3:PCLK3 的时钟频率(单位为 Khz)- i" d8 ?" O; ^% ~& H6 X7 u
WDGTB:WWDG 的预分频系数0 T$ B  k! a0 [% a
T[5:0]:窗口看门狗的计数器低 6 位
' C; A: p7 E6 c. I, b& y! V. {$ ^* t9 W6 ?; I( `
3. 相关寄存器
; q+ S6 B# @$ h: ZWWDG_CR9 f5 r  e5 a5 j( K5 V' g
WWDG_CFR
5 O0 n) R" d( o$ E  I' J: ?5 NWWDG_SR4 ^8 }' S: o5 A: {! l

6 G% p' T! u3 y5 g4.步骤如下:. o' F% V) m6 L4 d% E
1)使能 WWDG 时钟3 S  |4 a2 P% l- }( w+ g. h
2)设置窗口值,分频数和计数器初始值
, _- n+ y/ ^- u; H9 z3)开启 WWDG* W; E) A/ [0 H5 C% ]( ^# k6 U
4)使能中断通道并配置优先级(如果开启了 WWDG 中断)
1 C, d. u! c7 A$ V2 Q" ^/ y5)编写中断服务函数
' f6 A" D# v  k& c6 A. L6) 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_EarlyWakeupCallback8 t. v5 i  J* L( G2 a5 E& P

8 O  c7 v6 e/ A; l, @6 O: ^& j: Y# Q: R. l
' U4 S, `' E" g+ |: @
收藏 评论0 发布时间:2021-12-18 17:43

举报

0个回答

所属标签

相似分享

官网相关资源

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