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,一经查实,立即删除!

相关文章

JBOSS EPA 7.X 接入Oracle数据源

获取Oracle JDBC驱动程序: 访问Oracle官方网站,下载适用于您的操作系统和Oracle数据库版本的JDBC驱动程序文件(通常为一个JAR文件)。您可能需要一个Oracle账户来访问这些文件。将下载的JAR文件保存到您的计算机上。 将驱动程序文件…

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战报…

Linux Driver | 设备树开发之初识设备树

Linux Driver | 设备树开发之初识设备树 时间:2024年2月22日20:35:13 文章目录 **Linux Driver** | 设备树开发之初识设备树参考1.设备树开发2.`Linux`设备树的由来3.`Linux`设备树的由来-为什么会有设备树4.设备树的由来5.快速编译设备树---**DTC** (`device tree compiler`)…

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

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

2.21号qt

1.QMainWindow中常用的类 继承于QMainWindow类,原因该类提供了QWidget没有提供的成员函数。 菜单栏、工具栏、状态栏、浮动窗口(铆接部件)、核心部件 1.1 菜单栏 QMenuBar //创建菜单栏 QMenuBar 最多只能有一个 QMenuBar *mbar menu…

Hutool简介和常用类

Hutool简介 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 Hutool中的工具方法来自每个用户的精雕细琢&…

【鸿蒙 HarmonyOS 4.0】数据持久化

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

android 全局异常处理封装

app出现了问题,尤其是多线程问题,某个线程出了问题,很不好找,那是不是可以搞一个统一的处理类,将所有的异常信息都统一到一个地方呢,原本只是一个知识点,但我发现这里还可以 保存异常信息到本地…

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

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

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

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

COCI2015-2016#1 RELATIVNOST

P6533 [COCI2015-2016#1] RELATIVNOST 题目大意 小 L L L在卖画。这些画分为彩色画和黑白画,小 L L L希望有至少 c c c个人会买走他至少一张彩色画。 第 i i i个人至多会购买 a i a_i ai​张彩色画或者 b i b_i bi​张黑白画,且每个人至少购买一张画。…

Android---Jetpack Compose学习007

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

单例模式的介绍

单例模式(Singleton)是一种创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。其核心思想是通过限制类的实例化次数,防止多个实例同时存在,从而避免了多线程竞争和资源浪费,提高了代码…

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

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

vue、thinkphp实现腾讯云对象存储COS图片上传

环境&#xff1a; thinkphp6 vue2 vant2.12 composer安装qcloud-sts-sdk composer require qcloud_sts/qcloud-sts-sdk获取COS临时id、key的sts接口 <?php declare (strict_types 1);namespace app\index\controller; use QCloud\COSSTS\Sts;class CosController {//h…

如何为PostgreSQL设置自增主键?

在 PostgreSQL 中&#xff0c;自增主键通常是通过使用 SERIAL 类型或在新版本中使用 IDENTITY 列来实现的。 1. 使用 SERIAL 类型 SERIAL 是一个自动增加的整数&#xff0c;常用于主键。当插入新的行时&#xff0c;PostgreSQL 会自动为这个列生成一个新的值。   例如 CREAT…

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…