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 */

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker基础篇(-)

docker 三个要素 镜像容器仓库 CentOS 6.8 安装 docker centos 7.0 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager -y --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo systemctl start docker 启动Docker&…

嵌入式中c语言指针用法详解与分析

今天给大家来讲解一下指针。 我会由浅到深,最后结合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛! 长文预警!全文大约5200多字,学指针看这篇文章就够了! 很多人跟我刚学习c语…

electorn+vue3项目启动后报错unsafe-eval,如何去除提醒

electron项目报错如下: Electron Security Warning (Insecure Content-Security-Policy) This renderer process has either no Content Security Policy set or a policy with “unsafe-eval” enabled. This exposes users of this app to unnecessary security r…

【FreeRTOS基础入门】任务通知

文章目录 前言一、任务通知介绍1.1 任务通知怎么通信1.2 任务通知与其他通信方式的区别1.3 优势及限制任务通知的优势任务通知的限制 1.4 内部原理 二、任务通知的使用2.1 发出与接收通知简化版2.1 发出与接收通知专业版 总结 前言 FreeRTOS 提供了丰富而灵活的任务通知机制&a…

基于51单片机的婴儿看护监测系统[proteus仿真]

基于51单片机的婴儿看护监测系统[proteus仿真] 婴儿看护检测系统这个题目算是课程设计和毕业设计中少见的题目,本期是一个基于51单片机的婴儿看护监测系统[proteus仿真] 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】,赞赏任意文章 2&a…

openGauss学习笔记-226 openGauss性能调优-系统调优-配置LLVM-LLVM适用场景与限制

文章目录 openGauss学习笔记-226 openGauss性能调优-系统调优-配置LLVM-LLVM适用场景与限制226.1 适用场景226.2 非适用场景 openGauss学习笔记-226 openGauss性能调优-系统调优-配置LLVM-LLVM适用场景与限制 226.1 适用场景 支持LLVM的表达式 查询语句中存在以下的表达式支持…

优化设备维修流程:易点易动设备管理系统的设备维修管理策略

在现代企业中,设备是生产运营的核心要素之一。然而,设备故障和维修常常给企业带来诸多困扰和成本。为了提高设备维修的效率和质量,许多企业开始采用先进的设备管理系统。在这方面,易点易动设备管理系统以其卓越的设备维修管理策略…

2023年Q4,SSD出货量下降5%,但存储容量增长9.6%

2023年第四季度(4Q23)的SSD市场表现呈现出单位出货量下降,但存储容量增长的趋势。具体数据显示,该季度SSD总出货量下降5%,降至8820万台; 而存储容量则增长9.6%,达到85.1EB。预计2023全年SSD总容…

前端基于Verdaccio搭建私有npm仓库,上传npm插件包,及下载使用自己的npm插件包

文章目录 一、原理二、常用的仓库地址三、优势四、准备环境六、使用verdaccio搭建私有npm服务1、安装2、运行3、配置config.yaml,使局域网下能共享访问,否则只能本机访问。4、重新运行 七、npm常见操作查看当前用户信息查看源地址切换源地址删除源地址创…

【Linux】Linux调试器-gdb使用

1. 背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 2. 开始使用 gdb binFile 退出: ctrl d 或 quit 调…

【C语言】注释

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

校园公寓管理系统

校园公寓管理系统是一种专为提升高校住宿管理效率而设计的综合性智能解决方案。这一系统利用现代信息技术优化和简化了传统的住宿管理流程,极大地提高了管理工作的透明度和学生的住宿体验。 一、系统组成 校园公寓管理系统一般包括住宿分配、安全监控、费用管理、维…

java面试题之SpringMVC篇

Spring MVC的工作原理 Spring MVC的工作原理如下: DispatcherServlet 接收用户的请求找到用于处理request的 handler 和 Interceptors,构造成 HandlerExecutionChain 执行链找到 handler 相对应的 HandlerAdapter执行所有注册拦截器的preHandler方法调…

树莓派E: You don t have enough free space in /var/cache/apt/archives/.

在树莓派实际使用当中,我们会发现SD卡的存储并没有得到充分的利用,是否有办法让可用空间变的更大,毫无疑问肯定是有的,不然我就不在这里废话了。 使用raspi-config扩容 一、df -h查看可用空间 首先输入"df -h"命令可…

typescrip接口 interface详解,以及ts实现多态

ts 接口 当一个对象类型被多次使用时,一般会使用接口(interface)来描述对象的类型,达到复用的目的 示例如下 当一个对象类型被多次使用时,可以看到,很明显代码有大量的冗余 let personTom: { name: string, age?: number, sayHi(name: string): void } {name: Tom,sayHi(n…

Java Web(七)__Tomcat(二)

Tomcat工作模式 Tomcat作为Servlet容器,有以下三种工作模式。 1)独立的Servlet容器,由Java虚拟机进程来运行 Tomcat作为独立的Web服务器来单独运行,Servlet容器组件作为Web服务器中的一部分而存在。这是Tomcat的默认工作模式。…

一文弄明白KeyedProcessFunction函数

引言 KeyedProcessFunction是Flink用于处理KeyedStream的数据集合,它比ProcessFunction拥有更多特性,例如状态处理和定时器功能等。接下来就一起来了解下这个函数吧 正文 了解一个函数怎么用最权威的地方就是 官方文档 以及注解,KeyedProc…

Observability:使用 OpenTelemetry 和 Elastic 监控 OpenAI API 和 GPT 模型

作者: 来自 Elastic David Hope ChatGPT 现在非常火爆,甚至席卷了整个互联网。 作为 ChatGPT 的狂热用户和 ChatGPT 应用程序的开发人员,我对这项技术的可能性感到非常兴奋。 我看到的情况是,基于 ChatGPT 的解决方案将会呈指数级…

C++实现归并排序题目

目录 例1 例2 例3 例4 例1 912. 排序数组 参考代码 class Solution { public:vector<int> tmpnums;vector<int> sortArray(vector<int>& nums) {tmpnums.resize(nums.size());mergeSort(nums, 0, nums.size() - 1);return nums;}void mergeSort(vector…

如何使用rocketmq实现分布式事务?

什么是rocketmq事务消息 事务消息是 Apache RocketMQ 提供的一种高级消息类型&#xff0c;支持在分布式场景下保障消息生产和本地事务的最终一致性。 RocketMQ的分布式事务又称为“半消息事务”。 事务消息处理流程 RocketMQ是靠半消息机制实现分布式事务 事务消息&#x…