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

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

[复制链接]
STMCU小助手 发布时间:2021-12-18 17:43
以<<STM32H7 开发指南(HAL 库版)>>为导引学习1 i: ]8 o2 @, Y$ Y
SYSTEM 文件夹介绍% o$ j3 c9 e* H- E: n
本章包括如下 3 个小结:; P' ~5 V4 V/ I% Z
5.1,delay 文件夹代码介绍;
9 k7 d+ ?  y( _9 `9 s0 n- T5.2,sys 文件夹代码介绍;+ a/ a& V9 r# w$ K; a
5.3,usart 文件夹代码介绍;
  @5 y% ^) V! Y. W% p$ d% |" |; ~
delay文件- p/ R- d, V. Z2 c, o( n0 g# W" L# ^+ L
是利用 STM32 的内部 SysTick 来实现延时的,这样既不占用中断,也不占用系统定时器。
! l6 t9 C* z, ]; AHAL 库延时函数 HAL_Delay :只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时1 \. k+ j, D/ B5 m( A4 g' o
sys 文件夹
% `) @' F9 P. r在 sys.h 里面除了函数申明外主要是定义了一5 R+ v4 ~7 X( R6 G; y& q
些常用数据类型短关键字。sys.c 里面除了定义时钟系统配置函数 Stm32_Clock_Init 外主要是一
9 D; ^4 }3 q9 R/ e3 |些汇编函数以及 Cache 相关操作函数,
' v2 R, J, G, K( Q% @& m. S# q+ R0 K6 I9 B
USART文件夹0 I+ \3 E7 g; x: C
跑马灯实验和按键实验(GPIO的输入和输出)
, f( E% d$ q/ r: d: D
外设的编程一般流程8 b, B0 r/ O! Q" Y
1.新建.C文件和.H文件(如led.c),保存在HARDWARE文件下新建子文件(如LED)/ d- v  u0 n/ p* a6 P
2. 20200110133616480.png 点击三色品字图标
3 ~" q" ^, P7 ]4 h) u4 [
: U* F0 R% k3 N3 h6 u* R
20200110133717505.png
& P& h" I0 L0 d8 m* Z, n3 \3 e( m
, T, J' A3 m$ P9 @
把新建的HARDWARE文件和.c文件和.h文件添加
7 y7 c" j1 ]. H3.h文件定义,.c文件配置,使能外设
! I. i# ?3 G! g# j. z; n( i8 y  |  ?4.外设:1)时钟使能
8 g0 M" Q. k' [( C! d, r6 _          2)IO口模式设置9 A* ^$ `4 J0 n- k3 L9 a; ]0 ~
          3)其他设置8 O, V6 I% j6 b5 Z$ s( S
串口通讯, h* @8 S* U! g1 a8 G
本节点以及下面的外部中断,等节点都可以用STM32CubeMX来配置,简单清晰
" C3 d5 O" \/ o. s# _% L& m4 w7 E/ ^5 h) b# y7 s2 H& @
外部中断
4 L8 a/ n8 y4 {7 M" s' V7 j  ^因为我们这里初始化的是 PA0,调用该函数后中断线 0 会自动连接到 PA0。如果某个时间,我们又同样的方式初始化了 PB0,那么 PA0 与中断线的链接将被清除,而直接链接 PB0 到中断线 0。(就是说最好不要用数字相同的IO口做外部中断)
* Q& g# P+ N: h; H下面我们再总结一下配置 IO 口外部中断的一般步骤:: J7 U* Z9 p! B+ ]$ G7 L- B# B
1)使能 IO 口时钟。# L# ]# ], K; |% M$ M2 f
2)调用函数 HAL_GPIO_Init 设置 IO 口模式,触发条件,使能 SYSCFG 时钟以及设置 IO
/ L5 d4 n! X  p4 g口与中断线的映射关系。2 u  O1 s. R9 _" l1 y2 h( d) x- d
3)配置中断优先级(NVIC),并使能中断。
$ x+ B) r8 s8 F) I4)在中断服务函数中调用外部中断共用入口函数 HAL_GPIO_EXTI_IRQHandler。' }. B- p# I8 G  j
5)编写外部中断回调函数 HAL_GPIO_EXTI_Callback 实现控制逻辑。
% e9 y! A0 T" J, U
2 \) R- j5 `0 e, w) p6 b& j) S* k& n) u
独立看门狗(IWDG)实验
' N& j; V5 ^& l; o5 i9 x1.含义,功能
. r# k; C2 `" \7 h5 i4 x$ n在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。
9 l" Y. {) i* Z! Q; O& s1 y+ Z% P2 k2 m7 g# r' o0 v; w, t. U
看门狗解决的问题是什么?! V7 ^5 W. f6 N% A/ s, @% O
在启动正常运行的时候,系统不能复位。- P' Y) s3 T% B8 a# J  i0 Q4 M
在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。  Z+ b4 ?, r1 X! B6 T
# d$ S* y7 q+ ]7 ^
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生
+ \+ Q. f* T: o4 m3 e8 c  T( T故障它仍有效。
; u; Y/ Q9 }; U*独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。/ @: x2 ?' K% L3 ^

" U2 T6 H4 |) B' T5 N) X5 g窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。
6 W" a! }" v( U* G窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。3 j3 O4 `( d* ~" m2 o7 U

* o1 o/ V/ f2 L( Z# ^6 I
; l, N6 m: W$ F9 s" F! w* g0 L2.( s( u4 l0 O2 \# |
STM32H743 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故
5 t3 X% a8 B. j/ C, _障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的  K! [; D0 L+ `
32Khz,而是在 17~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频
0 f& a  e* V. V- e8 q率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。
9 V- \6 h. n4 a) |/ V. y, J( \
" b+ b4 U/ |1 w, n/ M3 .相关寄存器
/ H  G2 \* `" A  e5 N) C(IWDG_KR)
5 W- p" c! {9 |# B; Q1 |, [(IWDG_PR)8 a6 g1 z# Q( J( G6 `
(IWDG_RLR)
# n( S$ M! `! u+ ]% G6 R
0 J. Z8 n7 ~! l6 x5 T, k1 \1)看门狗溢出时间,该时间的计算方式为:6 O+ y4 Z3 f8 e8 i4 U  H
Tout=((4×2^prer) ×rlr) /32) g. t5 }( r- \* ?: L
其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),
( m9 U: Y5 F4 M( `0 K& f, J0 z范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);* v' k! }( l# T/ Z. B
比如我们设定 prer 值为 4(4 代表的是 64 分频,HAL 库中可以使用宏定义标识符
! y  ?- N4 p! y/ q; j* AIWDG_PRESCALER_64),rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,这样,看
/ V$ Z  k6 m. Y" F门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会1 }8 W4 n9 S$ f' L- Y' d4 w  x  v
导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确: \9 U1 N* i% k0 N9 M1 [% g
的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。
6 p: s4 o) ]9 R! m' y
+ X4 V3 L" X/ {: i( J2 a2)接下来我们讲解一下通过 HAL 库配置独立看门狗的步骤:
# H( T: A( r; Y" v8 r6 G1)取消寄存器写保护,设置看门狗预分频系数和重装载值/ P. a8 f8 J& S& O4 m0 p
2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)  j8 J3 G# M3 s' g" e' T/ V
3) 启动看门狗(向 IWDG_KR 写入 0XCCCC)' h+ x8 b5 ^" U' A
5 F8 n8 Y# _  j6 ^
窗口看门狗(WWDG)实验* V- j9 [9 ?! q# \* T, Z( B
两个看门狗的区别
3 n* e; t5 x1 M7 uSTM32有2个看门狗:独立看门狗和窗口看门狗。
! w- v5 G% R! u0 j3 a
% l3 F% Q! I- h1.
) V( O9 p! R2 v9 q' y独立看门狗IWDG–独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。, v8 k0 _" b9 p" D2 I1 m4 [1 j
, f& D( M3 a8 w0 _& j
窗口看门狗WWDG----系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。
  H9 E; B2 x, d% @% M! r& C( ^0 R0 A; T! |) i( y8 ?

  C% J) c) |1 o# s3 {& k2 A2 y2.
: @4 \' W: }3 `: f上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保
$ U1 }7 c; a( f2 `; k" }" T0 u窗口值大于 0X40,否则窗口就不存在了。
4 {4 M: A& p2 R窗口看门狗的超时公式如下:% |: v9 L& H: T1 n+ z( ^
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /RCC_PCLK3;
& U  Y' ~7 |) c6 W( c& c; d# I3 q: H其中:# w+ {( }; W/ A6 c& _. A6 m) Y+ S
Twwdg:WWDG 超时时间(单位为 ms)% |( x5 _' Y* r
RCC_PCLK3:PCLK3 的时钟频率(单位为 Khz)1 m5 n  W: c) @" w0 m5 a
WDGTB:WWDG 的预分频系数
. y# s1 o! n4 J2 _3 C. \# dT[5:0]:窗口看门狗的计数器低 6 位# k/ q( c- w3 P

: @/ {. b# f  L) R  m8 n- G1 N+ y3. 相关寄存器
4 {# A. }0 D8 c" H9 mWWDG_CR5 }! l, ?( Z5 d' I
WWDG_CFR
$ O3 d/ F# X; `! ^+ T5 NWWDG_SR$ e+ c. t/ S0 P9 x3 l9 k
/ ~" g/ G$ J: `# ~, e0 c( z# L
4.步骤如下:/ O5 {/ J2 q' b+ n
1)使能 WWDG 时钟
4 d$ o- `( o/ `! B2)设置窗口值,分频数和计数器初始值- Z: y4 x5 Z. i9 B$ O% R, i, T: v
3)开启 WWDG2 I4 u, {- Y! Z+ q0 u* u+ |
4)使能中断通道并配置优先级(如果开启了 WWDG 中断)
0 E; p- m0 P" U5)编写中断服务函数7 x) a" Q/ j& F" w
6) 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_EarlyWakeupCallback
9 v9 I9 C  D) D0 ^! G. Y* a& ]
" m' Q6 V, @) T3 [+ U2 N4 W( P2 x) \

+ D8 Z- w5 K$ f) ]- a5 {
收藏 评论0 发布时间:2021-12-18 17:43

举报

0个回答

所属标签

相似技术帖

官网相关资源

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