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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:43
以<<STM32H7 开发指南(HAL 库版)>>为导引学习3 N- L% M; s4 o5 ]
SYSTEM 文件夹介绍
0 B& V: \( C0 r. t. v# ~本章包括如下 3 个小结:: v. u, p# k7 [4 g
5.1,delay 文件夹代码介绍;+ o) Z# c$ Z# ]# Z" l
5.2,sys 文件夹代码介绍;; K1 g2 q6 q1 Q
5.3,usart 文件夹代码介绍;
' J! ^" j6 }7 }8 u. l: M; z4 |! ~$ M9 A. n
delay文件' z9 o) {, O. _' A
是利用 STM32 的内部 SysTick 来实现延时的,这样既不占用中断,也不占用系统定时器。
7 V& X. y* B2 dHAL 库延时函数 HAL_Delay :只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时* z& l4 \7 ~/ K( v; V3 i: U
sys 文件夹9 V! I1 j) Y( E! B
在 sys.h 里面除了函数申明外主要是定义了一/ ]% t1 s7 S+ Z; V. K5 G
些常用数据类型短关键字。sys.c 里面除了定义时钟系统配置函数 Stm32_Clock_Init 外主要是一% j9 f) G  Z1 }  I+ f1 z1 E" q3 _
些汇编函数以及 Cache 相关操作函数,
- C  f( J& d7 G5 U# }/ g$ m6 Z3 j7 E; C0 G& Q8 d
USART文件夹
! `; [" N" E8 N8 ^' H跑马灯实验和按键实验(GPIO的输入和输出)

6 J* }5 V5 N/ @  V外设的编程一般流程0 V" B) j/ p) H# K5 m$ o
1.新建.C文件和.H文件(如led.c),保存在HARDWARE文件下新建子文件(如LED)- S4 ~" y& G6 d( Z3 p+ X
2. 20200110133616480.png 点击三色品字图标
4 |/ ?* q" `0 n; P: w/ n. F8 g1 Y6 K/ D3 p5 T! B' W: \
20200110133717505.png

6 X# z0 g  y) n1 L3 a
5 R# G0 l' a/ j  ~8 J# W$ R把新建的HARDWARE文件和.c文件和.h文件添加
6 w3 e3 u) S7 _9 K) V3.h文件定义,.c文件配置,使能外设. \- V6 m. B4 c! M  g
4.外设:1)时钟使能% k! B4 W1 `& t7 k0 W- q. h6 x6 |; {
          2)IO口模式设置5 u& B( T3 s* d
          3)其他设置
3 s: N+ }. }! E. }! K" D5 d& ^串口通讯& k+ l2 s( D0 U! l, i7 o
本节点以及下面的外部中断,等节点都可以用STM32CubeMX来配置,简单清晰
! K! D8 i. S. m) H1 ~
4 k5 \2 z, V8 l! q1 b% C5 h外部中断2 _1 E) Z1 L  N* {' m5 f' p
因为我们这里初始化的是 PA0,调用该函数后中断线 0 会自动连接到 PA0。如果某个时间,我们又同样的方式初始化了 PB0,那么 PA0 与中断线的链接将被清除,而直接链接 PB0 到中断线 0。(就是说最好不要用数字相同的IO口做外部中断)
# f& i7 R" R$ x下面我们再总结一下配置 IO 口外部中断的一般步骤:* x/ M- @3 a4 M4 N$ F5 Q+ Q
1)使能 IO 口时钟。1 F7 E6 c( z$ I
2)调用函数 HAL_GPIO_Init 设置 IO 口模式,触发条件,使能 SYSCFG 时钟以及设置 IO$ F6 J* z& A2 R8 u
口与中断线的映射关系。! |9 `: a! u$ ]3 Z$ j
3)配置中断优先级(NVIC),并使能中断。
7 _. C1 o* X8 v% X4)在中断服务函数中调用外部中断共用入口函数 HAL_GPIO_EXTI_IRQHandler。& K# V0 m0 t0 L$ `
5)编写外部中断回调函数 HAL_GPIO_EXTI_Callback 实现控制逻辑。
' r: U: c2 Q8 Y* S& m$ j9 z  ^! e$ ?

: _9 P' }7 e  f1 R, m5 A; _2 n* Q独立看门狗(IWDG)实验
3 L4 J. ~6 ~/ v5 s2 w6 t/ K* E1.含义,功能
7 F+ {9 n% q, s在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。7 ^( o) e/ U7 T& ~8 c. }+ b

  E8 y5 q7 k4 l看门狗解决的问题是什么?6 R" s- e' m/ g: h0 v+ Q; G: `/ f
在启动正常运行的时候,系统不能复位。
9 x! ^  j: H, g0 V1 B8 m9 o% i. N0 ^+ b; S在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。" ]7 P* ^  L/ s' n: F7 }9 _

$ E& N7 n, K8 P9 f独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生7 E) D6 z% K( L8 P
故障它仍有效。, t1 T. S7 o( m( G& Y9 \5 a! D
*独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
( _+ P! D7 s( i2 t/ R& g4 |4 n, g' r1 c! Q0 f% i" {/ `
窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。
+ x" ?. u* I% B$ H8 i4 N窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。
: p5 @# A# J$ F3 H) x) T# M* r) B) ~+ _7 C' h( I9 i0 Y5 N

" O5 }8 c6 C% ?# e* }6 R$ L2.2 \6 P8 M6 b5 w$ s5 R
STM32H743 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故
) a# i# z3 s# e+ B0 a障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的, `6 s3 W0 I0 u  n
32Khz,而是在 17~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频7 F& I3 e- S3 D- v
率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。
2 y; l! T, h0 C. U* |3 j* @- L& `* m5 \' i# E7 C! `
3 .相关寄存器: |! L0 {  A+ c3 Z* Z4 Z1 s
(IWDG_KR)" K* F: h' J0 S& _
(IWDG_PR)/ C7 G0 z( h/ E! L5 W
(IWDG_RLR)! {! a1 o% f  Z1 p5 k

. {6 O* X9 H0 c9 D1)看门狗溢出时间,该时间的计算方式为:& ?( ^; F- X) g$ Y- X
Tout=((4×2^prer) ×rlr) /32
( W* Q8 Q' J$ }4 x# S# W其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),7 Y4 Q, }' U9 s; J( @
范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);4 a2 B7 j$ o9 h- F" t
比如我们设定 prer 值为 4(4 代表的是 64 分频,HAL 库中可以使用宏定义标识符
8 W* P& b: A1 J) l" GIWDG_PRESCALER_64),rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,这样,看
7 @; |( W' L3 Q4 V; i: {% j门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会' j4 @6 _+ f: ^' s8 i
导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确3 W0 i* S2 H2 e
的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。; P1 d$ b- @- f5 v
0 n0 A6 ^9 [- s
2)接下来我们讲解一下通过 HAL 库配置独立看门狗的步骤:
% H* T& R0 t$ ]1)取消寄存器写保护,设置看门狗预分频系数和重装载值0 K' f! _0 v' L9 _
2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)5 Z# U4 O& f( d! w# G+ |
3) 启动看门狗(向 IWDG_KR 写入 0XCCCC)
: e) ?7 c/ s; s) V& H7 f% D9 N& l7 K! z( p; U- n2 A6 u
窗口看门狗(WWDG)实验- B# `- f0 m" L3 V4 \& J% w
两个看门狗的区别
: I: \' m% K2 r& t  X4 V2 s7 {STM32有2个看门狗:独立看门狗和窗口看门狗。
0 h6 w) |1 x* s$ U* G' r: W3 H
7 b: S( _. G! y- w  O5 u5 _- k( Z1./ o/ V" I! t; G  k6 B/ n
独立看门狗IWDG–独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。1 v3 W+ l- C4 [4 f* e6 e

" n$ M5 y4 Z% J4 m; o7 o3 @% Q( `窗口看门狗WWDG----系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。% D4 h0 }) ]" }. e- b! [( d" {8 q
( }$ j9 k) `/ X1 }: o/ ?. D
& W! A2 B' L$ Y# B
2.9 g% C6 v- Q- O, s) S5 R/ c
上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保7 G" n6 H+ |; j$ l
窗口值大于 0X40,否则窗口就不存在了。
0 L. }7 N0 R' q8 s# I窗口看门狗的超时公式如下:
! J8 a' {. B2 X1 N7 w4 l. \& G2 `Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /RCC_PCLK3;1 b0 e; V' u4 z2 i, w) E
其中:
: o! ]% V* ^$ N+ i) pTwwdg:WWDG 超时时间(单位为 ms)7 V/ l/ M) g# Y  ~9 g
RCC_PCLK3:PCLK3 的时钟频率(单位为 Khz)
+ E/ p1 w$ A) N/ c/ |" H7 ]- q9 ?WDGTB:WWDG 的预分频系数
9 Y# _8 O2 z/ I6 y' dT[5:0]:窗口看门狗的计数器低 6 位
2 j. l2 s$ l0 y
3 m% M' ]' D8 L4 g7 l3. 相关寄存器
8 A& u) M+ P, |$ q5 F$ j$ {0 oWWDG_CR
% }/ p$ V4 B& V, DWWDG_CFR& R+ S) u1 [5 {- N: ~$ b
WWDG_SR
$ e* Z  n* C  X4 R
. A" B1 o0 n1 a% f1 n* J. `4.步骤如下:% `5 k& W7 f9 `7 T: D; N
1)使能 WWDG 时钟7 N+ B! g2 q( q: E6 m+ u- m
2)设置窗口值,分频数和计数器初始值3 ?& [1 z" p0 N# v+ \$ F; u, h
3)开启 WWDG
# I. r/ N. L4 m4)使能中断通道并配置优先级(如果开启了 WWDG 中断)& [8 A. Y4 q  ?; }; i4 c9 j
5)编写中断服务函数
: R2 X( o% W1 b2 Y6 T+ \  `6) 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_EarlyWakeupCallback8 p: G; z0 U0 S- o1 j& |. \/ I
* p% r( D. H& h& q7 b

! H9 R# y) l; U7 P# g2 g
" t; P) ~5 N1 H
赞 收藏 评论0 发布时间:2021-12-18 17:43

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版