单片机(学习)2024.10.11

news2024/11/25 14:59: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;
}

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

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

相关文章

selenium工具的几种截屏方法介绍(9)

在使用selenium做自动化的时候&#xff0c;可以对于某些场景截图保存当时的执行情况&#xff0c;方便后续定位问题或者作为一些证据保留现场。 获取元素后将元素截屏 我们获取元素后&#xff0c;使用函数screenshot将元素截屏&#xff0c;参数filename传入完整的png文件名路径…

最近 3 个 yyds 的开源项目!

01 电脑屏幕、麦克风记录工具 ScreenPipe 是一个开源的全天候本地屏幕与麦克风记录工具&#xff0c;为 AI 应用程序提供全方位上下文数据的支持。 该项目旨在成为 Rewind.ai 的替代方案&#xff0c;支持 Windows、Linux 和 macOS 等多平台应用&#xff0c;并且使用 Rust 语言构…

学习Ultralytics(获取yolov8自带的数据集并开始训练)

今天小编带大家学习一下YOLOv8 配置文件&#xff0c;用来定义不同数据集的参数和配置。这些文件包含了关于每个数据集的路径、类别数、类别标签等信息&#xff0c;帮助模型正确地加载和解析数据集&#xff0c;以便进行训练和推理。 具体来说&#xff0c;这些 YAML 文件的作用如…

AIGC时代的程序员生存法则:如何在AI辅助编程工具普及的背景下保持并提升核心竞争力

随着AIGC&#xff08;AI-Generated Content&#xff0c;如ChatGPT、MidJourney、Claude等&#xff09;技术的迅猛发展&#xff0c;特别是大型语言模型的不断涌现&#xff0c;程序员的工作方式正发生深刻变革。AI辅助编程工具的普及给编程行业带来了前所未有的挑战和机遇。一方面…

SwiftUI 6.0(iOS 18)将 Sections 也考虑进自定义容器子视图布局(上)

概述 在 WWDC 24 新推出的 SwiftUI 6.0 中,苹果对于容器内部子视图的布局有了更深入的支持。为了能够未雨绸缪满足实际 App 中所有可能的情况,我们还可以再接再厉,将 Sections 的支持也考虑进去。 SwiftUI 6.0 对容器子视图布局的增强支持可以认为是一个小巧的容器自定义布…

Wordpress—一个神奇的个人博客搭建框架

wordpress简介 在当今数字化的时代&#xff0c;拥有一个属于自己的个人博客&#xff0c;不仅可以记录生活点滴、分享专业知识&#xff0c;还能展示个人风采。而在众多的博客搭建框架中&#xff0c;Wordpress 以其强大的功能和灵活性脱颖而出。今天&#xff0c;就让我们一起深入…

spring boot项目日志怎么加?

使用源码LoggerFactory&#xff08;日志工厂类&#xff09; 使用方法&#xff1a;getlogger()中间传入1个类 加在过滤里所以需要传入的是过滤这个类&#xff08;reqfilter.class) 用这个对象调info方法 logger.error是打印错误信息 logger.debug打印debug 结果会增加时间名称等…

LQB焊接超声波部分原理图和焊接说明(勘误)

1、自制的板子的原理图&#xff0c;有一个错误的地方&#xff0c;导致超声波不能正常使用。 下图是实物的原理图存在错误&#xff0c;不小心&#xff0c;自我批评一下。 图中的C6电容330pF的一端接到了VCC&#xff0c;是错误的。 蓝桥杯的原理图是下图&#xff0c;接到GND 因…

【机器学习(十三)】机器学习回归案例之股票价格预测分析—Sentosa_DSML社区版

文章目录 一、背景描述二、Python代码和Sentosa_DSML社区版算法实现对比(一) 数据读入(二) 特征工程(三) 样本分区(四) 模型训练和评估(五) 模型可视化 三、总结 一、背景描述 股票价格是一种不稳定的时间序列,受多种因素的影响。影响股市的外部因素很多,主要有经济因素、政治因…

51单片机数码管循环显示0~f

原理图&#xff1a; #include <reg52.h>sbit dulaP2^6;//段选信号 sbit welaP2^7;//位选信号unsigned char num;//数码管显示的数字0~funsigned char code table[]{ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//定义数码管显…

CDN服务支持多种应用场景,包括图片、大文件下载、流媒体等

中国联通国际公司产品之 CDN&#xff08;内容分发网络&#xff09; 在当今这个信息爆炸的时代&#xff0c;内容分发网络&#xff08;CDN&#xff09;已成为提升用户体验和保障数据快速传输的重要工具。中国联通国际公司凭借其全球领先的通信技术和广泛的网络覆盖&#xff0c;推…

Qualitor checkAcesso.php 任意文件上传漏洞复现(CVE-2024-44849)

0x01 漏洞概述 Qualitor 8.24及之前版本存在任意文件上传漏洞,未经身份验证远程攻击者可利用该漏洞代码执行,写入WebShell,进一步控制服务器权限。 0x02 复现环境 FOFA:app="Qualitor-Web" 0x03 漏洞复现 PoC POST /html/ad/adfilestorage/request/checkAcess…

第十一章 RabbitMQ之消费者确认机制

目录 一、介绍 二、演示三种ACK方式效果 2.1. none: 不处理 2.1.1. 消费者配置代码 2.1.2. 生产者主要代码 2.1.3. 消费者主要代码 2.1.4. 运行效果 2.2. manual&#xff1a;手动模式 2.3. auto&#xff1a;自动模式 一、介绍 消费者确认机制&#xff08;Consume…

物流大数据底盘建设方案

1、现状及目标 1.1、离线数仓现状及目标 1.2、实时数仓现状及目标 2、建设方向 2.1、建设概览 2.2、数仓架构重建 2.3、数据架构 2.4、作业优化 2.5、具体作业优化-运营 2.6、具体作业优化-财经 2.7、数据血缘依赖重构 2.8、事实表建设思路 2.9、公共维表建设思路 2.10、数据…

springboot-网站开发-使用slf4j实现网站异常错误的及时跟踪定位

springboot-网站开发-使用slf4j实现网站异常错误的及时跟踪定位&#xff01;项目部署&#xff0c;开发好后&#xff0c;部署到远程服务器上面了&#xff0c;运行过程中&#xff0c;难免会遇到一些错误和异常情况&#xff0c;我们需要借助一些插件来帮助我们及时捕捉这类错误和异…

【中文版】深度学习 deep learning 花书 pdf下载 2017.09.04

中文版pdf&#xff1a;https://pan.baidu.com/s/1s93yluQGSly5uBDAIVAlNg?pwdx6xy github&#xff1a;https://github.com/exacity/deeplearningbook-chinese 目录 第一章 前言第二章 线性代数第三章 概率与信息论第四章 数值计算第五章 机器学习基础第六章 深度前馈网络第七…

一道Fortran题(Fortran)

题目 代码 选择排序法 结果 我勒个&#xff01;

【项目管理】如何根据 PV、EV、AC 计算 CPI 和 SPI?

【项目管理】如何根据 PV、EV、AC 计算 CPI 和 SPI&#xff1f; 一、PV&#xff08;计划价值 - Planned Value&#xff09;二、EV&#xff08;挣值 - Earned Value&#xff09;三、AC&#xff08;实际成本 - Actual Cost&#xff09;四、CV&#xff08;成本偏差 - Cost Varianc…

C# WPF 仿 Android Toast 效果

转载请注明出处: https://blog.csdn.net/hx7013/article/details/142860084 主职Android, 最近需要写一些WPF的程序作为上位机&#xff0c;目前WPF的MessageBox过于臃肿&#xff0c;且想找一个内置的非阻塞的简单提示一直找不到&#xff0c;想到了Android的Toast所以写了这个扩…

Kafka之生产者

本章内容将整理下Kafka体系结构中的生产者相关的一些知识。 1. 生产者客户端 生产者客户端在Kafka的发展历程当中一共有两个重大版本&#xff1a; 一个是基于Scala语言开发的版本&#xff0c;称为Old Producer或Scala版的生产者客户端。一个是Kafka0.9.x版本之后以Java语言开发…