单片机(学习)2024.10.11
目录
按键
按键原理
按键消抖
1.延时消抖
2.抬手检测
通信
1.通信是什么
2.电平信号和差分信号
3.通信的分类
(1)时钟信号划分
同步通信
异步通信
(2)通信方式划分
串行通信
并行通信
(3)通信方向划分
单工
半双工
全双工
4.USART和UART(串口通信)
(1)串口通信协议
(2)三种逻辑电平标准
1.TTL
2.RS-232
3.RS-485
(3)三种电平协议下的硬件连接
1.TTL电平标准下的硬件物理层——uart
2.RS232电平标准下的硬件物理层
3.RS485电平标准下的硬件物理层
RS-485收发器
RS-485数据链路
5.USART功能框图
发送过程
接收过程
6.串口相关寄存器
(1)串口控制寄存器---数据位长度、校验位、停止位
(2)波特率设置寄存器
(3)中断和状态寄存器
(4)数据发送寄存器
(5)数据接收寄存器
练习:循环发送A-Z到串口助手
7.HAL库函数实现发送和接收
发送
接收
8.printf的重定向
按键
按键原理
当按键未按下,PC9为高电平
当按键被按下,PC9为低电平
1. 先将PC9设置为输入模式
2. 进行输入检测
3. 当检测到PC9为低电平时,将PC13的电平翻转
按键消抖
任何的机械按键都会有抖动,而且人手按下抬起并不是一瞬间的,人抬手是需要反应时间的,所以会导致按下的低电平时间过长,导致多次误进if判断语句,所以会多次切换状态,导致误判。
1.延时消抖
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9)==0)
{HAL_Delay(100);if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9)==0){HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_15);}
}
2.抬手检测
检测到抬手动作后再进行灯的电平翻转
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9)==0)
{while(!HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9));HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_15);
}
通信
1.通信是什么
至少有收发双方,进行信号 数据的交互
2.电平信号和差分信号
1.电平信号:电平信号有一根是参考电平线,信号线的信号值有信号线和参考电平线之间的电压差决定;
2.差分信号:差分信号没有参考电平线,传输一路数据需要两根信号线,信号线的信号值由两根信号线的电压差决定。
区别:
(1)信号值的表示不同:电平信号的信号值是信号线和参考电平线的电压差决定;差分信号的信息值是由两条信号线的电压差决定;
(2)传输相同路数的信号,电平信号用的数据线根数比差分信号少。比如传输3路信号,电平信号需要1根参考电平+3根数据线;而差分信号需要2x3=6根数据线;
(3)现在通信大部分是差分信号,因为差分信号的抗干扰性更强,可以在更短的周期传输一个数据。
3.通信的分类
(1)时钟信号划分
同步通信
通信双方根据同步信号通信,比如双方有一个共同的时钟信号(SPI全双工 I2C半双工)
异步通信
通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同步(UART)
(2)通信方式划分
串行通信
串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。
串行传输:数据一位一位串起来,逐个传输,数据按位顺序传输。
优点:占用引脚资源少
缺点:速度相对较慢
并行通信
并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行
并行传输:使用多根线同时传输一个字的多个位,如 8 根线一次传输 8 个位。
优点:速度快
缺点:占用引脚资源多
(3)通信方向划分
单工
要么收,要么发,只能做接收设备或者发送设备。比如收音机
一根信号线只能单向发送或单向接收
半双工
可以收,可以发,但是不能同时收发, 比如对讲机
一根信号线可以接收数据也可以发送数据,但是两者不能同时进行
全双工
可以在同一时刻既接收,又发送。 手机
两根信号线,一根发送数据,另一根接收数据,真正实现同时收发数据,速度快
4.USART和UART(串口通信)
USART: 支持同步\异步通信、全双工、串行
UART :没有时钟线,只支持异步通信、全双工、串行
实际上他们是一种被包含的关系,当USART选择放弃其时钟线的时候就是UART
(1)串口通信协议
波特率:衡量通信速度,它表示每秒钟传送的bit的个数。码元/s 9600 115200 4800 bit/s
数据位:表示通信中实际数据位的个数,一般为5、7和8位。
起始、停止位:数据包从起始位开始,到停止位结束。停止位典型的值为1,1.5和2位。
奇偶校验位:在串口通信中一种简单的检错方式。
(2)三种逻辑电平标准
1.TTL
TTL电平标准:逻辑1:2.4V--5V
逻辑0:0V--0.5V
2.RS-232
RS-232电平标准:逻辑0:+3V~+15V
逻辑1:-3V~-15V
rs232 的逻辑电平和TTL 不一样但是协议一样
3.RS-485
RS-485仅是一个电气标准,描述了接口的物理层,像协议、时序、串行或并行数据以及链路全部由设计者或更高层协议定义。
RS-485定义的是使用平衡多点传输线的驱动器和接收器的电气特性。
RS-485能够进行远距离传输主要得益于使用差分信号,通过共模抑制进行传输,当有噪声干扰时仍可以使用线路上两者差值进行判断,使传输数据不受噪声干扰。
RS-485是半双工、电气协议,二线制差分信号
RS-485电平标准:逻辑1:+2V–+6V
逻辑0: -6V— -2V
实际传输的数据是通过判断这两条信号线上的电压差来实现的,RS-485总线弥补了RS-232通信距离短,速率低的缺点,RS-485的速率可高达10Mbit/s,理论通讯距离可达1200米;RS-485和RS-232的单端传输不一样,是差分传输,使用一对双绞线
(3)三种电平协议下的硬件连接
1.TTL电平标准下的硬件物理层——uart
现在的Soc都内置了串口控制器,串口数据线一般都是两根线,一根发送(TX)一根接收(RX),用的TTL电平,当然也会有一根地线;
需要注意的是:
有的串口还有CTS、RTS接口,这是和自动流控相关,不是必要功能,用于保证数据传输的正确性,现在基本不用了,因为串口常用作打印输出或者用于连接低速的设备,对数据正确性没有太高要求;
因为uart外设本来输出的就是TTL电平,所以也称这种连线方式叫UART
uart特点:
因为是异步通信,所以通信速度较慢
不需要进行电平协议的转换,所以电路简单
为什么还要有RS-232、RS-485
(1)串口协议只是规定了数据传输时的协议,也就是规定了先传输1还是先传输0的问题,但是什么电压表示数据1,什么电压表示0,这并没有做规定;
(2)UART是相对于Soc这端来说的,Soc端集成了串口控制器,控制器支持串口协议(比如开始位、停止位、数据位、校验位等),用的是TTL电平;
(3)实际中两个设备的串口控制器要通信,中间是有一段距离的,Soc的引脚一般电平都比较低,数据能传输的有效距离很短;并且不同的设备所使用的电压也不一样,不能直接相连;
(4)需要中间电路负责来解决电压不匹配、传输距离等问题,于是有了RS232、RS485;
(5)RS232、RS485都是从电气层面(也就是物理器件)来区分的,具体的通信协议都是串口协议,但是使用的电压范围、是电平信号还是差分信号等不同;
2.RS232电平标准下的硬件物理层
(1)RS232是串口协议在电气层面的实现,RS-232标准接口定义了电压范围,规定逻辑“1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15V;
(2)Soc的串口引脚一般是3.3V或者5V的电压,所以Soc的串口引脚要使用RS232必须添加TTL电平转RS232电平的转换芯片;
(3)RS232的接口有多种(DB9接口、四线接口、三线接口),但是起主要作用的都是TX和RX引脚,可以简单理解成,RS232和UART的区别就是使用的电压范围不一样;
DB9接口有9根线,最主要的就是RXD和TXD,其余的线是用于保证数据传输的正确性
RS232特点
(1)优点:RS232标准接口的传输距离更长,在15米左右;
(2)接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不兼容故需使用电平转换芯片才能与Soc的串口引脚连接;
3.RS485电平标准下的硬件物理层
RS-485收发器
RS-485是差分传输,如果用单片机控制RS-485接口的设备,需要用到收发器,这一点和CAN总线是类似的,如下是一个MCU控制一个RS-485的图示。
RS-485数据链路
上面讲到的RS-485收发器的工作原理,下面简单描述RS-485的数据链路。主机发送给从机或者从机发送给主机,都会占用到A和B线,所以RS-485多用在半双工模式。
TTL到485的转换同样需要电平转换芯片来做,下面是常用的一个MAX485电平转换芯片原理图。
特点
RS485传输距离长,抗干扰能力强、通信速率高
5.USART功能框图
UART数据发送和接收的流程
Tx:数据发送端
Rx:数据接收端
发送过程
由CPU或者DMA往TDR中写入数据
然后由硬件自动检测发送移位寄存器中是否有数据正在移位,
如果此时有数据正在移位,则数据等待当前移位寄存器移位完成后再往移位寄存器中放,此过程也是硬件执行。当TDR中的数据放到移位寄存器中的那一刻,TDR空,这时候标志位TXE置1,它来表示发送数据寄存器空。
如果此时没有数据正在移位,则直接由硬件将TDR中的数据放到发送移位寄存器中。
需要注意的是当TDR中的数据在等待往移位寄存器中放的时候,如果此时CPU或者DMA继续向TDR中写入数据,会将TDR中的数据覆盖掉。
接收过程
首先数据线通过RX口连到接收移位寄存器
接收移位寄存器对紫色线的电平进行读取,将读取到的数据放到最高位,读下一位数据时,先把已有的位整体往右移一位,然后再将读到的数据放到最高位,以此往复,直到读满8位。
读满八位以后整体往RDR中放,此时RDR非空,标志位RXNE置1,它来表示RDR非空。
6.串口相关寄存器
(1)串口控制寄存器---数据位长度、校验位、停止位
字长设置由M1\M0共同决定
校验位设置
停止位设置
(2)波特率设置寄存器
(3)中断和状态寄存器
USART_ISR
第七位:发送数据标记,当发送数据寄存器为空,这个位置为1,也就是数据写入到发送数据寄存器之后,发送数据移位寄存器,从发送数据寄存器中将数据全部移走之后ISR第七位置1
第五位:接收数据标记,当接收数据寄存器非空,这个位置为1,数据被接受数据移位寄存器搬到接收数据寄存器中以后,ISR第五位置1
(4)数据发送寄存器
USART_TDR 决定发送的数据:将要发送的数据写入
(5)数据接收寄存器
USART_RDR决定接收的数据:将要接收数据的读取
练习:循环发送A-Z到串口助手
void sendChar(char ch)
{
while(USART1->ISR);
USART1->TDR=ch;
}int main(void)
{HAL_Init();SystemClock_Config();SystemPower_Config();MX_GPIO_Init();MX_USART1_UART_Init();char ch='A';while (1){sendChar(ch);ch++;if(ch >'Z'){ch='A';}}}
出现乱码的原因:
数据往TDR中写入的速度过快,导致数据还没来得及往移位寄存器中放,就被覆盖了。
解决方法:
在CPU往TDR中写入数据之前,先判断TDR是否为空
因为TXE标志位置1时标志着TDR空。
所以在往TDR中写入数据之前用while卡死,退出的条件为,检测到TXE置1
void sendChar(char ch)
{while(!(USART1->ISR & (1<<7)));//等待TXE置1,即TDR空USART1->TDR=ch;
}
7.HAL库函数实现发送和接收
发送
HAL_UART_Transmit(&huart1,buf,32,100)
&huart1:句柄
buf:要发送的字符串或数组名
32:要发送的数据的大小
100:超时时间
接收
HAL_UART_Receive(&huart1,buf,32,100)
&huart1:句柄
buf:接受的容器
32:容器的大小
100:超时时间
8.printf的重定向
int printf(const char * format,...)
printf函数底层调用的是fputc函数,fputs是将要发送的数据写入到标准输出流stdout
int fputc(int /*c*/, FILE * /*stream*/)
因此如果想让printf将数据输出到串口,需要重写fputc
WEAK弱符号
weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。
加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,
那么编译器就会执行__weak 修饰的函数,并且编译器不会报错。
自己写个重定向函数
int fputc(int ch, FILE * p)
{while(!(USART1->ISR & 1<<7));//等待TDR为空,即TXE置1,跳出while,然后往TDR中放数据USART1->TDR=ch;
}
相关文章:

单片机(学习)2024.10.11
目录 按键 按键原理 按键消抖 1.延时消抖 2.抬手检测 通信 1.通信是什么 2.电平信号和差分信号 3.通信的分类 (1)时钟信号划分 同步通信 异步通信 (2)通信方式划分 串行通信 并行通信 (3)通信方向划分 单工 半双工 全双工 4.USART和UART(串口通信&a…...

Java创建型模式(二)——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式、工厂模式扩展等完整详解,附有代码——案例)
文章目录 五.工厂模式5.1 概述5.2简单工厂模式5.2.1 概述5.2.2 结构5.2.3 实现5.2.4 优缺点5.2.5 扩展—静态工厂 5.3 工厂方法模式5.3.1概述5.3.2 结构5.3.3 实现5.3.4 优缺点 5.4 抽象工厂模式5.4.1 概述5.4.2 结构5.4.3 实现5.4.4 优缺点5.4.5 使用场景 5.5 工厂模式扩展 五…...

C++学习,容器类 <set>
C 标准库中的 <set> 是一个关联容器,它存储了一组唯一的元素,并按照一定的顺序进行排序。<set> 提供了高效的元素查找、插入和删除操作。它是基于红黑树实现的,因此具有对数时间复杂度的查找、插入和删除性能。 声明集合&#x…...

Cisco Catalyst 9000 交换产品系列 IOS XE 17.15.1 发布下载,新增功能概览
Cisco Catalyst 9000 Series Switches, IOS XE Release 17.15.1 ED 思科 Catalyst 9000 交换产品系列 IOS XE 系统软件 请访问原文链接:https://sysin.org/blog/cisco-catalyst-9000/,查看最新版。原创作品,转载请保留出处。 作者主页&…...

Python知识点:基于Python技术,如何使用MMDetection进行目标检测
开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 使用MMDetection进行目标检测的Python技术详解 MMDetection是一个开源的目标检测…...

Chromium HTML Tags与c++接口对应关系分析
一、HTML 标签(HTML Tags) <a> <head> <img>等等这些标签在c中的接口是如何定义和查找的呢? 更多标签参考: HTML <a> target 属性 (w3school.com.cn) 二、html_tag_names.json5 (third_party\blink\renderer\core\html\htm…...

React Fiber 解析:前端性能提升密码
文章目录 背景React 采用 fiber 主要为了解决哪些问题?性能问题:用户体验问题: 为什么在 React 15 版本中性能会差:浏览器绘制原理:react 15 架构和问题 那么 fiber 怎么解决了这个问题?任务“大”的问题递…...

【吊打面试官系列-微服务面试题】微服务架构如何运作?
大家好,我是锋哥。今天分享关于【微服务架构如何运作?】面试题,希望对大家有帮助; 微服务架构如何运作? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 微服务架构是一种将单一应用程序构建为一组小型、独…...

Windows系统编程 - 目录操作、磁盘、卷信息
前言 各位师傅大家好,我是qmx_07,今天继续讲解Windows系统编程的相关知识:目录操作 目录 目录操作 创建目录 通过CreateDirectory函数创建目录 原型: BOOL CreateDirectoryA([in] LPCSTR lpPathName,//目录名称[in, opt…...

搭建SaaS知识库:优化教育机构的在线教学效能
随着信息技术的飞速发展,教育领域正经历着前所未有的变革。在线教学已成为教育机构提供灵活学习体验、扩大覆盖范围、提升教学效率的重要手段。然而,如何在海量资源与复杂教学场景中高效管理知识,确保教学质量,成为教育机构面临的…...

CSS中backdrop-filter详解
文章目录 CSS中backdrop-filter详解一、引言二、backdrop-filter基础1、基本概念1.1、基本语法 2、滤镜函数2.1、代码示例 三、实际应用1、创建模糊背景1.1、代码示例 2、结合其他CSS属性2.1、代码示例 四、总结 CSS中backdrop-filter详解 一、引言 在现代网页设计中…...

AI测试入门:理解 LLM 的基准测试(Benchmark)
AI测试入门:理解 LLM 的基准测试(Benchmark) 1. 基准测试的定义2. 基准测试的目的3. 基准测试的常用指标4. 基准测试的流程5. 常用的AI基准测试框架总结1. 基准测试的定义 LLM 的基准测试是一种评估 LLM 的标准化方法,通过使用预定义的数据集、任务和评估指标,对LLM 在特定…...

InternVid:用于多模态视频理解与生成的大规模视频-文本数据集 | ICLR Spotlight
InternVid 是一个开源的大规模视频-文本数据集,旨在促进视频理解和生成任务的发展,由上海人工智能实验室与南京大学、中国科学院等单位联合发布,相关的工作已经被ICLR2024接收。它包含超过 700 万个视频,总时长近 76 万小时&#…...

Hive数仓操作(十)
一、Hive 分页查询 在大数据处理中,分页查询是非常常见的需求。Hive 提供了 LIMIT 和 OFFSET 关键字来方便地进行分页操作。本文将详细介绍它们的用法。 1. 基本用法 LIMIT:用于限制查询结果的行数。OFFSET:用于指定从哪一行开始检索。 2…...

Android 扩大View的点击区域
文章目录 Android 扩大View的点击区域使用padding属性使用TouchDelegate使用getLocationOnScreen监听 Android 扩大View的点击区域 使用padding属性 通过设置 padding 属性扩大点击区域。 使用: <?xml version"1.0" encoding"utf-8"?&…...

[Qt学习笔记] 解决QTextEdit数据过多UI卡死问题
背景问题 在项目中使用QTextEdit显示软件的日志信息,由于在连续输出日志信息,刚开始QTextEdit显示没什么问题,长时间就会出现UI界面卡死,内存占用变高。晚上查了说QTextEdit的append函数如果不释放会累计增加内存,包括…...

OgreNext高级材质中增加线宽,点大小,虚线模式绘制支持
修改Ogre高级材质系统,增加线宽,点大小,虚线模式,虚线参数的支持,效果如下: 需要修改的代码文件如下: 修改如下 代码文本: //范围[0.2 - 51] 0.2 * [0,255];Ogre::uint8 mLineWidth;//范围[…...

STM32中的DMA数据转运——下篇
STM32中的DMA数据转运——上篇-CSDN博客 在上篇文章中,我们讨论了STM32中的DMA(直接存储器访问)及其工作原理、存储器类型和总线设计。接下来,我们将更深入地探讨DMA的具体配置方法、常见应用场景以及一些实际设计中的注意事项。…...

51单片机的智能小区安防系统【proteus仿真+程序+报告+原理图+演示视频】
1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块时钟模块温度传感器烟雾传感器CO传感器红外感应传感器IC卡蓝牙继电器按键、蜂鸣器、LED等模块构成。适用于智能小区安防、智能家居安防等相似项目。 可实现功能: 1、LCD1602实时显示北京时间、温度、烟雾浓度和CO浓…...

数仓建模流程
数仓建模简介 一句话总结 数仓建模中的“建模”是一个将数据有序组织和存储起来的过程,旨在提高数据的使用效率和降低使用成本。 详细描述 在数仓建模中,“建模”指的是构建数据模型,也就是数据的组织和存储方法。数据模型强调从业务、数…...

Neo4j CQL语句 使用教程
CREATE命令 : CREATE (<node-name>:<label-name>{ <Property1-name>:<Property1-Value>........<Propertyn-name>:<Propertyn-Value>} )字段说明 CREATE (dept:Dept { deptno:10,dname:“Accounting”,location:“Hyderabad” })&#…...

STM32-HAL库 驱动DS18B20温度传感器 -- 2024.10.8
目录 一、教程简介 二、驱动理论讲解 三、CubeMX生成底层代码 四、Keil5编写代码 五、实验结果 一、教程简介 本教程面向初学者,只介绍DS18B20的常用功能,但也能满足大部分的运用需求。跟着本教程操作,可在10分钟内解决DS18b20通信难题。…...

HTML 符号
HTML 符号 HTML(超文本标记语言)是一种用于创建网页的标准标记语言。它使用一系列的标签来描述网页的结构和内容。HTML 符号,通常指的是 HTML 标签,是构成 HTML 文档的基础。本文将详细介绍 HTML 符号的概念、种类、用途以及如何在网页设计中正确使用它们。 HTML 符号的概…...

编译后的MySQL安装
MySQL安装 1.下载网址2.下载方式3.配置配置环境变量修改配置文件初始化安装服务启动服务测试修改 Mysql 默认密码 1.下载网址 https://dev.mysql.com/downloads/mysql/2.下载方式 选择对应版本下载 mysql-xxx-winx64.zip,该压缩包为编译后文件,并非源码…...

Ubuntu安装Apache教程
系统版本:Ubuntu版本 23.04 Ubuntu是一款功能强大且用户友好的操作系统,而Apache是一款广泛使用的Web服务器软件。在Ubuntu上安装Apache可以帮助用户搭建自己的网站或者进行Web开发。为大家介绍如何在Ubuntu上安装Apache,并提供详细的教程和操…...

Nginx跳转模块之location与rewrite
目录 一、location模块与rewrite模块区别 二、location模块的基本介绍 1. location模块是什么? 2. 三种匹配类别 3. 常用的匹配规则 4. 匹配优先级 三、location模块使用实例 1.精准匹配优先级小于一般匹配的特殊情况 2 .解决方法 3. 实际网站使用中的三个匹配…...

oracle col命令
oracle col命令可以对列进行进行格式化,格式:col 列名 for(mat) 格式 例如: col owner for a100 设置owner列格式 col 列名:显示当前列的格式 SQL> col owner COLUMN owner ON FORMAT a100 SQL> clear column:清除所有列的格式 SQL> col o…...

ESP32接入扣子(Coze) API使用自定义智能体
使用ESP32接入Coze API实现聊天机器人的教程 本示例将使用ESP32开发板通过WiFi接入 Coze API,实现一个简单的聊天机器人功能。用户可以通过串口向机器人输入问题,ESP32将通过Coze API与智能体进行通信,并返回对应的回复。本文将详细介绍了如…...

【JVM】如何判断对象是否可以被回收
引用计数法: 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 优点:实现简单,判…...

CloseableHttpResponse 类(代表一个可关闭的 HTTP 响应)
CloseableHttpResponse 类是 Apache HttpClient 库中的一个类,代表一个可关闭的 HTTP 响应。当你使用 HttpClient 发送请求时,你会得到一个 CloseableHttpResponse 实例,它包含了服务器的响应数据和状态。处理完响应后,你应该关闭…...