STMCU小助手
发布时间:2021-12-18 17:43
|
以<<STM32H7 开发指南(HAL 库版)>>为导引学习3 N- L% M; s4 o5 ] SYSTEM 文件夹介绍 本章包括如下 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 文件夹代码介绍; : M; z4 |! ~$ M9 A. n delay文件' z9 o) {, O. _' A 是利用 STM32 的内部 SysTick 来实现延时的,这样既不占用中断,也不占用系统定时器。 HAL 库延时函数 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 相关操作函数, / g$ m6 Z3 j7 E; C0 G& Q8 d USART文件夹 跑马灯实验和按键实验(GPIO的输入和输出) 外设的编程一般流程0 V" B) j/ p) H# K5 m$ o 1.新建.C文件和.H文件(如led.c),保存在HARDWARE文件下新建子文件(如LED)- S4 ~" y& G6 d( Z3 p+ X 2.
6 K/ D3 p5 T! B' W: \
把新建的HARDWARE文件和.c文件和.h文件添加 3.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)其他设置 串口通讯& k+ l2 s( D0 U! l, i7 o 本节点以及下面的外部中断,等节点都可以用STM32CubeMX来配置,简单清晰 外部中断2 _1 E) Z1 L N* {' m5 f' p 因为我们这里初始化的是 PA0,调用该函数后中断线 0 会自动连接到 PA0。如果某个时间,我们又同样的方式初始化了 PB0,那么 PA0 与中断线的链接将被清除,而直接链接 PB0 到中断线 0。(就是说最好不要用数字相同的IO口做外部中断) 下面我们再总结一下配置 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),并使能中断。 4)在中断服务函数中调用外部中断共用入口函数 HAL_GPIO_EXTI_IRQHandler。& K# V0 m0 t0 L$ ` 5)编写外部中断回调函数 HAL_GPIO_EXTI_Callback 实现控制逻辑。 $ j9 z ^! e$ ? 独立看门狗(IWDG)实验 1.含义,功能 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。7 ^( o) e/ U7 T& ~8 c. }+ b 看门狗解决的问题是什么?6 R" s- e' m/ g: h0 v+ Q; G: `/ f 在启动正常运行的时候,系统不能复位。 在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。" ]7 P* ^ L/ s' n: F7 }9 _ 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生7 E) D6 z% K( L8 P 故障它仍有效。, t1 T. S7 o( m( G& Y9 \5 a! D *独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。 & g4 |4 n, g' r1 c! Q0 f% i" {/ ` 窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。 窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。 * r) B) ~+ _7 C' h( I9 i0 Y5 N 2.2 \6 P8 M6 b5 w$ s5 R STM32H743 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故 障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的, `6 s3 W0 I0 u n 32Khz,而是在 17~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频7 F& I3 e- S3 D- v 率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。 & `* 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 1)看门狗溢出时间,该时间的计算方式为:& ?( ^; F- X) g$ Y- X Tout=((4×2^prer) ×rlr) /32 其中 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 库中可以使用宏定义标识符 IWDG_PRESCALER_64),rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,这样,看 门狗的溢出时间就是 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 库配置独立看门狗的步骤: 1)取消寄存器写保护,设置看门狗预分频系数和重装载值0 K' f! _0 v' L9 _ 2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)5 Z# U4 O& f( d! w# G+ | 3) 启动看门狗(向 IWDG_KR 写入 0XCCCC) & H7 f% D9 N& l7 K! z( p; U- n2 A6 u 窗口看门狗(WWDG)实验- B# `- f0 m" L3 V4 \& J% w 两个看门狗的区别 STM32有2个看门狗:独立看门狗和窗口看门狗。 1./ o/ V" I! t; G k6 B/ n 独立看门狗IWDG–独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。1 v3 W+ l- C4 [4 f* e6 e 窗口看门狗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,否则窗口就不存在了。 窗口看门狗的超时公式如下: Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /RCC_PCLK3;1 b0 e; V' u4 z2 i, w) E 其中: Twwdg:WWDG 超时时间(单位为 ms)7 V/ l/ M) g# Y ~9 g RCC_PCLK3:PCLK3 的时钟频率(单位为 Khz) WDGTB:WWDG 的预分频系数 T[5:0]:窗口看门狗的计数器低 6 位 3. 相关寄存器 WWDG_CR WWDG_CFR& R+ S) u1 [5 {- N: ~$ b WWDG_SR 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 4)使能中断通道并配置优先级(如果开启了 WWDG 中断)& [8 A. Y4 q ?; }; i4 c9 j 5)编写中断服务函数 6) 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_EarlyWakeupCallback8 p: G; z0 U0 S- o1 j& |. \/ I * p% r( D. H& h& q7 b |
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
微信公众号
手机版