RM电控讲义【HAL库篇】

这段代码中do while的作用:

宏定义中的语句块do { ... } while (0) 允许你在宏定义中创建一个语句块,从而可以包含多条语句。这在宏定义中特别有用,因为宏只是简单的文本替换,不像函数那样有作用域和返回类型。因此,如果你想在宏中执行多个操作,你需要将这些操作放在一个语句块中。

保证逻辑在一行内完成:使用 do { ... } while (0) 可以确保宏定义中的所有逻辑都在一行内完成。这有助于避免在宏展开时可能出现的语法错误,特别是当宏在复杂的表达式中被调用时。

免编译器警告或错误:如果宏定义中有多条语句,并且没有使用 do { ... } while (0),编译器可能会产生关于未使用的循环变量的警告或错误。使用 do { ... } while (0) 可以避免这些警告或错误,因为循环条件是常量值“零”,所以循环实际上不会执行。

 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);对引脚电平进行翻转

对两个引脚初始化,推完输出,默认为高电平。

C中的三元运算符(X ? A : B):如果x为真(非0),那么宏BEEP(x)将调用HAL_GPIO_WritePin函数来设置(或打开)蜂鸣器;如果x为假(0),那么宏BEEP(x)将调用HAL_GPIO_WritePin函数来重置(或关闭)蜂鸣器。两个函数之间是冒号。

引脚的输入定义默认为高或低电平的作用:

防止输入端悬空:当输入端处于悬空状态时,即没有外部信号连接,其电平状态容易受到外界干扰而改变。上拉和下拉电阻可以将输入端的电平状态固定在一个确定的状态上,防止其受到外部信号的干扰。

确定电平状态:上拉电阻将不确定的信号通过一个电阻提升为高电平,而下拉电阻将不确定的信号通过一个电阻降低为低电平。这样,无论输入端是否接收到外部信号,都可以保证其电平状态是确定的,从而避免数字信号的传输和控制受到干扰。

按键扫描程序加入delay_ms()去抖动,KEY的值由 HAL_GPIO_ReadPin()所得。

按键扫描+switch判断。

一个外部中断的设置(重点看看gpio_init_struct.Mode = GPIO_MODE_IT_FALLING; ):

注意看下图的最后一行,这里的EXTI4_IRQn与PE4是对应的。

中断回调函数:

注意看这三个函数之间的关系,弄明白HAL外部中断回调函数的使用方法。

外部中断可以绕开主循环,避免影响。

usart的使用:

HAL_UART_Receive_IT开启UART接受中断。

串口的底层初始化:

#define USART_EN_RX  1     这种条件限定值得学习。

在串口中断里处理接收到的数据;

    

单片机中的看门狗(Watchdog Timer,WDT)是一个重要的安全保护机制。它由一个独立的时钟和一个计数器组成,用于检测系统是否运行正常。当计数器达到一个预先设定的值时,看门狗会向系统发出警报,以此来检测系统是否运行正常。如果系统运行正常,单片机会在计数器达到警报值之前给看门狗发出“清除”信号,以此来重置计数器,继续监测系统的运行状态。然而,如果系统运行异常,例如出现程序跑飞、受到干扰或陷入死循环等情况,单片机不会给看门狗发出“清除”信号。这种情况下,看门狗计数器会持续增加,当达到警报值后,看门狗会向系统发出警报,使单片机强制复位,从而使程序重新开始执行。这样,看门狗能够确保系统在异常情况下能够安全停止运行,避免造成重大损失。看门狗定时器的溢出时间越短,其灵敏度越高,系统跑飞后复位的时间也就越短,从而提高了系统的安全性。然而,这也意味着需要更频繁地给看门狗“喂食”,即在程序中定期给看门狗设置值,以防止其溢出。
看门狗初始化和喂狗:

需要再主函数中每一秒执行iwdg_feed(); 狗才不会疯强制系统复位。

窗口看门狗与普通看门狗的区别

普通看门狗通常只设定一个时间阈值,系统需要在这个时间阈值内“喂狗”以重置看门狗。如果系统因故障或死锁无法在规定时间内“喂狗”,看门狗会触发复位操作,强制重启系统。这种看门狗方式相对简单,但缺乏灵活性,因为它只有一个固定的时间阈值。

窗口看门狗则设定了两个时间阈值:窗口上限和窗口下限。在这个窗口时间内,系统需要至少“喂狗”一次以重置看门狗。如果系统在这个窗口时间内没有“喂狗”,或者“喂狗”的时间超出窗口上限或下限,看门狗会触发复位操作。这种方式提供了更大的灵活性,因为它允许系统在一定时间范围内“喂狗”,而不是固定在一个时间点。

wwdg_init(0X7F, 0X5F, WWDG_PRESCALER_8);/* 计数器值为7f,窗口寄存器为5f,分频数为8 */

窗口看门狗可以设置中断处理函数,在窗口看门狗需要喂狗的时候调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/696533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordPress后台自定义登录和管理页面插件Admin Customizer

WordPress默认的后台登录页面和管理员,很多站长都想去掉或修改一些自己不喜欢的功能,比如登录页和管理页的主题样式、后台左侧菜单栏的某些菜单、仪表盘的一些功能、后台页眉页脚某些小细节等等。这里boke112百科推荐这款可以让我们轻松自定义后台登录页…

2.20日学习打卡----初学Vue3

2.20日学习打卡 目录: 2.20日学习打卡Vue是什么?安装vue模板语法条件渲染列表渲染事件处理表单输入绑定组件基础Props组件交互自定义事件组件交互组件生命周期Vue引入第三方Axios网络请求Axios网络请求封装网络请求跨域解决方案路由配置路由传递参数嵌套路由配置Vue…

js设计模式:单例模式

作用: 保证一个类只有一个实例,并且提供一个全局的访问位置。 可以用来实现全局的一些状态管理或者独一无二的数据 示例: class Wjt{constructor(name,idNumber,gender){this.name namethis.idNumber idNumberthis.gender gender}//可以直接使用Wjt调用的静态方法static …

性能测试概述

1.性能测试介绍 好处: 有效的性能测试能给研发、运维团队提供有效的容量规划能力、系统风险识别、系统瓶颈识别、性能调优指导,保障尽量避免这些问题的发生。 例如: 假设:以下场景,不可用10分钟,带来的经济损失 天猫双十一峰值处理订单58.3万笔每秒 京东金融618战报…

C#,入门教程(29)——修饰词静态(static)的用法详解

上一篇: C#,入门教程(28)——文件夹(目录)、文件读(Read)与写(Write)的基础知识https://blog.csdn.net/beijinghorn/article/details/124231282 static 是编程高频词之一。 读了一…

【鸿蒙 HarmonyOS 4.0】数据持久化

一、数据持久化介绍 数据持久化是将内存数据(内存是临时的存储空间),通过文件或数据库的形式保存在设备中。 HarmonyOS提供两种数据持久化方案: 1.1、用户首选项(Preferences): 通常用于保存应用的配置信息。数据通…

Vue 进阶系列丨实现简易reactive和ref

Vue 进阶系列教程将在本号持续发布,一起查漏补缺学个痛快!若您有遇到其它相关问题,非常欢迎在评论中留言讨论,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧! 2013年7月28日,尤雨溪第一次在 GItHu…

计算机网络Day02--物理层(一)

计算机网络Day02–物理层 物理层基本概念 物理层考虑的是怎么才能在连接各种计算机的传输媒体上传输比特流,而不是具体的传输媒体 作用:尽可能屏蔽掉不同传输媒体和通信手段的差异 用于物流层的协议也称为物流层规程 主要作用:解决计算机…

Android---Jetpack Compose学习007

Compose 附带效应 a. 纯函数 纯函数指的是函数与外界交换数据只能通过函数参数和函数返回值来进行,纯函数的运行不会对外界环境产生任何的影响。比如下面这个函数: fun Add(a : Int, b : Int) : Int {return a b } “副作用”(side effe…

【蓝桥杯单片机入门记录】静态数码管

目录 一、数码管概述 (1)认识数码管 (2)数码管的工作原理 (3)LED数码管驱动方式-静态显示 二、数码管电路图 三、静态数码管显示例程 (1)例程1:数码管显示某一位&a…

PYQT5-自定义事件

from PyQt5.QtCore import QEvent, QObject from PyQt5.QtWidgets import QApplication import sys# 自定义事件类 class CustomEvent(QEvent):# PYQT5 预留给用户自定义事件类型的起点为 QEvent.User1000custom_event_type QEvent.registerEventType()# 也可以这样写# custom…

2024.2.22

P1162 #include<map> #include<vector> #include<iostream> #include<math.h> #include<algorithm> #include<string> using namespace std; const int N 1020; int n; int g[N][N];//标记数组 int a[N][N];//储存数组 int dx[] { -1…

webstorm光标变成方块解决办法_webstorm光标变粗不能换行

webstorms光标变了 键盘上的insert是切换的快捷键&#xff0c;敲insert就可以来回切换了

双通道并行网络,想用哪个网络用哪个,MATLAB代码

本期可谓是宝藏篇&#xff01;学会本期的思想&#xff0c;帮助你分分钟找到创新点&#xff0c;且不与别人重复&#xff01; 本期采用MATLAB代码&#xff0c;实现一种“基于格拉姆角场与并行CNN的故障诊断方法”。该方法的具体实现可以参考文献&#xff1a; [1]李宗源,陈谦,钱…

普中51单片机学习(EEPROM)

EEPROM IIC串行总线的组成及工作原理 I2C总线的数据传送 数据位的有效性规定 I2C总线进行数据传送时&#xff0c;时钟信号为高电平期间&#xff0c;数据线上的数据必须保持稳定&#xff0c;只有在时钟线上的信号为低电平期间&#xff0c;数据线上的高电平或低电平状态才允许…

分享WebGL物体三维建模

界面效果 代码结构 模型素材类似CT (Computed Tomography)&#xff0c;即电子计算机断层扫描&#xff0c;它是利用精确准直的X线束、γ射线、超声波等&#xff0c;与灵敏度极高的探测器一同围绕物体的某一部位作一个接一个的断面扫描。 坐标系统 渲染流程 渲染流程是个将之前准…

Sora:OpenAI引领AI视频新时代

Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技术&#xff0c;引领着AI视频领域的创新发展。让我们将一起探讨…

【SpringCloud】使用 Spring Cloud Alibaba 之 Sentinel 实现微服务的限流、降级、熔断

目录 一、Sentinel 介绍1.1 什么是 Sentinel1.2 Sentinel 特性1.3 限流、降级与熔断的区别 二、实战演示2.1 下载启动 Sentinel 控制台2.2 后端微服务接入 Sentinel 控制台2.2.1 引入 Sentinel 依赖2.2.2 添加 Sentinel 连接配置 2.3 使用 Sentinel 进行流控&#xff08;含限流…

如何将cocos2d-x js打包部署到ios上 Mac M1系统

项目环境 cocos2d-x 3.13 xcode 12 mac m1 big sur 先找到你的项目 使用xcode软件打开上面这个文件 打开后应该是这个样子 执行编译运行就好了 可能会碰到的错误 在xcode11版本以上都会有这个错误&#xff0c;这是因为iOS11废弃了system。 将上面代码修改为 #if (CC_TARGE…

Java 面向对象进阶 16 接口的细节:成员特点和接口的各种关系(黑马)

成员变量默认修饰符是public static final的原因是&#xff1a; Java中接口中成员变量默认修饰符是public static final的原因是为了确保接口的成员变量都是公共的、静态的和不可修改的。 - public修饰符确保了接口的成员变量可以在任何地方被访问到。 - static修饰符使得接口…