单片机(学习)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;
}

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

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

相关文章

计算机毕业设计 基于Python的食品销售数据分析系统的设计与实现 Python毕业设计 Python毕业设计选题 数据分析 Vue【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

安装R和RStudio:开始你的数据分析之旅

数据分析是当今世界中一个非常热门的领域&#xff0c;而R语言是进行数据分析的强大工具之一。R是一种编程语言和软件环境&#xff0c;用于统计计算和图形表示。RStudio是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;它为R语言提供了一个更加友好和高效的工作环境。…

从commit校验失效问题探究husky原理

一、背景 之前创建的项目&#xff0c;发现代码 commit 提交的时候没有了任何校验&#xff0c;具体表现&#xff1a; 一是 feat fix 等主题格式校验没有了二是代码 lint 不通过也能提交 尝试解决这个问题&#xff0c;并深入了解husky的实现原理&#xff0c;将相关的一些知识点…

【Canvas与诗词】要做一棵树,站成永恒

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>要做一棵树站成永恒</title><style type"text/css&quo…

tauri开发Mac电脑Safari浏览器一个很奇怪的问题:在 input 输入框输入的是全小写英文字母,会自动将首字母转换为大写解决办法

问题原因 在 Mac 系统中默认使用 Safari 的内核 WKWebView 作为渲染引擎&#xff0c;而 Safari 浏览器的一些 “人性化” 机制&#xff1a;如果输入框中输入的是全小写英文&#xff0c;会自动将首字母转换为大写。 解决办法 我只需要禁止这个默认的行为&#xff0c;即可解决这…

STM32(十八):实时时钟

时间戳 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒。 时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64位的整型变量。 世界上所有时区的秒计数器相同&#xff0c;不同时…

项目_C_Ncurses_Flappy bird小游戏

Ncurses库 概述 什么是Ncurses库&#xff1a; Ncurses是一个管理应用程序在字符终端显示的函数库&#xff0c;库中提供了创建窗口界面、移动光标、产生颜色、处理键盘按键等功能。 安装Ncurses库&#xff1a; sudo apt-get install libncurses5-dev 头文件与编译&#xf…

ECCV`24 | 新加坡国立华为提出Vista3D: 实现快速且多视角一致的3D生成

文章链接&#xff1a;https://arxiv.org/pdf/2409.12193 gitbub链接&#xff1a;https://github.com/florinshen/Vista3D 亮点直击 提出了Vista3D&#xff0c;一个用于揭示单张图像3D darkside 的框架&#xff0c;能够高效地利用2D先验生成多样的3D物体。开发了一种从高斯投影到…

初级学习:Python实现AI并搭建

随着人工智能(AI)的迅猛发展,越来越多的人希望能够学习如何通过编程实现AI应用。Python,因为其简洁易用,被广泛认为是AI开发的理想编程语言。本文将介绍Python在AI开发中的基础应用,帮助初学者入门并构建自己的AI项目。 为什么选择Python 在了解如何用Python实现AI之前,…

十、kotlin的协程

协程 基本概念定义组成挂起和恢复结构化并发协程构建器作用域构建器挂起函数阻塞与非阻塞runBlocking全局协程像守护线程 Job的生命周期 常用函数延时和等待启动和取消启动取消 暂停 协程启动调度器启动方式启动模式线程上下文继承的定义继承的公式 协程取消与超时取消挂起点取…

HTMLCSS练习

1) 效果如下 2) 代码如下 2.1) HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" conte…

Windows系统编程(三)线程并发

进程与线程 进程&#xff1a;直观的说就是任务管理器中各种正在运行的程序。对于操作系统来说&#xff0c;进程仅仅是一个数据结构&#xff0c;并不会真实的执行代码 线程&#xff1a;通常被称作但并不真的是轻量级进程或实际工作中的进程&#xff0c;它会真实的执行代码。每…

设计模式之适配器模式(Adapter)

一、适配器模式介绍 适配器模式(adapter pattern )的原始定义是&#xff1a;将类的接口转换为客户期望的另一个接口&#xff0c; 适配器可以让不兼容的两个类一起协同工作。 适配器模式是用来做适配&#xff0c;它将不兼容的接口转换为可兼容的接口&#xff0c;让原本由于接口…

2024年1月Java项目开发指南18:自定义异常输出

一般情况下&#xff0c;报错信息一大堆&#xff0c;值得注意的只有三个地方&#xff1a; 哪个文件发生了错误哪一行发生了错误错误原因是什么 只要知道这三个东西就能快速的定位到错误发生的位置并且根据提示解决。 如果你也喜欢我的这种异常输出(如文章顶部图) 那么可以参考以…

[M数学] lc3164. 优质数对的总数 II(因数分解+倍增+推公式+思维+好题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;3164. 优质数对的总数 II 2. 题目解析 挺不错的一道 因数分解、倍增 的题目&#xff0c;需要一定的思维和推公式的能力才能解决。灵神的题解已经非常清晰易懂了&#xff0c;可以直接去看。 倍增思路&#xff…

大数据分析案例-基于逻辑回归算法构建抑郁非抑郁推文识别模型

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集

(十八)、登陆 k8s 的 kubernetes-dashboard 更多可视化工具

文章目录 1、回顾 k8s 的安装2、确认 k8s 运行状态3、通过 token 登陆3.1、使用现有的用户登陆3.2、新加用户登陆 4、k8s 可视化工具 1、回顾 k8s 的安装 Mac 安装k8s 2、确认 k8s 运行状态 kubectl proxy kubectl cluster-info kubectl get pods -n kubernetes-dashboard3、…

如何启动一个OpenSearch

创建两个集群&#xff0c;标注 不含备用节点 选择集群版本和配置集群版本 冷热存储和专用主节点这个按需开启 然后是网络&#xff0c;是否使用自定义域名&#xff0c;集群开在VPC还是公网上。 选择是否开启认证&#xff1a; 访问策略&#xff0c;其实就是资源策略 维护时段…

Oracle 数据库安装和配置详解

Oracle 数据库安装和配置详解 Oracle 数据库是一款功能强大、广泛使用的企业级关系数据库管理系统 (RDBMS)&#xff0c;适用于处理大型数据库和复杂事务。本文将介绍如何在 Linux 和 Windows 环境下安装 Oracle 数据库&#xff0c;并对其进行基本配置&#xff0c;帮助开发者快…

理解计算机系统_程序的机器级表示(特别篇):对比move和leaq看汇编语言中数据的传递,变量和指针的映射,指针的实现

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 汇编代码传递数据的机制令人费解.而这部分内容又是比较基础的,需要…