单片机串口uart学习

参考文章

https://blog.csdn.net/Reed_redd/article/details/126098506

https://blog.csdn.net/AriesPIG/article/details/119840979

前言

OK,又是新一期的温故而知新!串口UART想必大家都用过,我记得我最早的时候用它来打印单片机的调试数据,是直接使用printf(经过重定向后的),当时一直搞不懂其中的奥秘,直到前几天终于开始认真学习串口了才发现用了这么多年的串口还有这么多知识不懂的。

串口的简要介绍

通用异步接收器/发送器,通常称为UART,是一种广泛应用于嵌入式领域的串行、异步、全双工通信协议。例如我们常用的485 232 TTL这些电平接口,他们都是串口在不同电平规定下的实现,其本质上还是一样的。

  • 单工:数据传输只支持数据在一个方向上传输。(只收不发或者只发不收,模式固定)
  • 单双工:允许数据在两个方向上传输,但是在某一时刻,只允许数据在一个方向上传输。(能发能收,但不能同时进行
  • 全双工:允许数据同时在两个方向上传输。(能发能收,且能同时进行
  1. 同步通信:带时钟同步信号传输,如SPI、IIC通信等
  2. 异步通信:不带时钟同步信号,如UART(通用异步收发器)、单总线等。

串口的作用

使用串口的作用是什么呢?显而易见,它的作用非常多,像是打印调试信息、设备之间的通信、设备和PC之间的通信……,总之我们可以使用串口来实现的事情非常多。

配置过程

基本参数

基本需要配置的参数

1.起始位

​ 当未有数据发送时,数据线处于逻辑“1”状态;先发出一个逻辑“0”信号,表示开始传输字符。

2.数据位

​ 紧随起始位之后,数据位表示真正要发送或接收的信息,位数一般有8位或9位

3.奇偶校验位

​ 数据位末尾可以选择是否添加奇偶校验位,用于检测数据传输是否正确

4.停止位

​ 代表信息传输结束的标志位,可以是1位,1.5位或2位。停止位的位数越多,数据传输的速率也越慢。

5.波特率设置

波特率表示每秒钟传输码元的个数,是衡量数据传输速率的指标,单位Baud。另外有个名词叫比特率,比特率表示每秒钟传输二进制位bit的个数,单位 bit/s。

代码示例

void atk_ms53l0m_uart_init(uint32_t fu32_Baudrate)
{g_uart_handle.Instance = UART2;g_uart_handle.Init.BaudRate   = fu32_Baudrate;g_uart_handle.Init.WordLength = UART_WORDLENGTH_8B;g_uart_handle.Init.StopBits   = UART_STOPBITS_1;g_uart_handle.Init.Parity     = UART_PARITY_NONE;g_uart_handle.Init.Mode       = UART_MODE_TX_RX;g_uart_handle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;HAL_UART_Init(&g_uart_handle);}

配置好上面的,基本上你就可以使用这个串口了。当然还需要把我们需要对外的串口引脚给使能一下

中断参数

玩了单片机这么久,发现最重要还是需要学会使用中断,就像我上篇文章,使用输入捕获也要使用到中断,所以玩裸机的话中断一定要弄透。

    /* Enable RX and RTI interrupt */SET_BIT(g_uart_handle.Instance->IE,UART_IE_RXI|UART_IE_RTI); /* Clear RXI Status */g_uart_handle.Instance->ICR = UART_ICR_RXI;/* FIFO Enable */SET_BIT(g_uart_handle.Instance->LCRH, UART_LCRH_FEN);/*FIFO Select*/MODIFY_REG(g_uart_handle.Instance->IFLS, UART_IFLS_RXIFLSEL, UART_RX_FIFO_7_8);  

上面主要是接收和发送中断的使能,这两个我们都很熟悉基本上都能懂,但是FIFO中断是个什么东西呢?这个东西之前也用过,但是也一直没有搞懂,在查阅了一些资料以后才懂得了他的大致作用。

首先查阅芯片手册,发现的确是有这个东西的拥有16个字节的FIFO(First In First Out),FIFO我们可以简单理解为一个队列,也就是先进先出的这么一个硬件资源。为什么要使用这个资源呢?我们知道有时候我们数据处理会在中断里面进行,但是中断又是很吃资源的,所以频繁进入中断会增加我们单片机的负担,为了减轻这个负担单片机的设计师想到了使用FIFO这么一个硬件资源来存储我们的到的数据,当数据满了或者空的时候再进中断进行数据处理。查看一下这部分的寄存器,如下所示。

大致就是上面这些,所以我们可以选择一个触发条件,然后在进行处理。

这里我选择的是 RXIFLSEL 100 在接收到14个数据后进入中断,这里大家可能会有一个疑惑,如果我的数据寄存器接收的数量不是所设置的个数的整数倍岂不是会有一部分数据滞留在FIFO中?当然是不会的,单片机设计师显然是要比我们这些使用者考虑的更加周到,这里会有一个超时中断来供我们使用。

所以当几个周期内没有数据传输过来后就会触发这个中断,我们就可以进中断里面取数据进行处理,当然这也可以作为我们准备接收完成的一个标志位。例如下面代码就是从机处理发送完成最后几个字节,然后进入中断处理。

		else if(huart->Instance->RIS & UART_RIS_RTI)                               //长时间未接受到中断{/*clear RTI Status */SET_BIT(huart->Instance->ICR ,UART_ICR_RTI);while(!READ_BIT(huart->Instance->FR, UART_FR_RXFE)){HAL_UART_Receive(huart, &tmp, 1, HAL_MAX_DELAY);           /* UART接收数据 */if (g_uart_rx_frame.sta.len < (ATK_MS53L0M_UART_RX_BUF_SIZE - 1))   /* 判断UART接收缓冲是否溢出* 留出一位给结束符'\0'*/{g_uart_rx_frame.buf[g_uart_rx_frame.sta.len] = tmp;             /* 将接收到的数据写入缓冲 */g_uart_rx_frame.sta.len++;                                      /* 更新接收到的数据长度 */}else                                                                /* UART接收缓冲溢出 */{g_uart_rx_frame.sta.len = 0;                                    /* 覆盖之前接收的数据 */g_uart_rx_frame.buf[g_uart_rx_frame.sta.len] = tmp;             /* 将接收到的数据写入缓冲 */g_uart_rx_frame.sta.len++;                                      /* 更新接收到的数据长度 */}}

好了以上就是我再一次学习串口所获得的收获

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

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

相关文章

【JD-GUI】MacOS 中使用Java反编译工具JD-GUI

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明概念理解一、基础环境说明1.1 硬件环境1.2 软件环境 二、下载与安装2.1 选择对应版本2.2 解压运行排除异常&#xff1a;2.3 关于…

16进制数按位修改

16进制数需要按位修改,特别是在修改寄存器的时候 16进制数转换为2进制 #16进制数转换为2进制 def hex_to_binary(hex_value):return bin((hex_value))二进制数转换为列表 def bin_to_array(bin_str):integer = int(bin_str, 2)array

GuiLite C语言实现版本

简介 本项目是idea4good/GuiLite的C语言实现版本&#xff0c;基于2024-06-20节点的版本&#xff08;提交ID&#xff1a;e9c4b57&#xff09;。 本项目仓库&#xff1a;GuiLite_C 需求说明 作为芯片从业人员&#xff0c;国产芯片普遍资源有限&#xff08;ROM和RAM比较少-都是…

[Vulnhub] wallabysnightmare LFI+RCE+Irssi聊天服务RCE

信息收集 Server IP AddressOpening Ports192.168.8.105TCP:22,80,6667,60080 $ nmap -p- -sC -sV 192.168.8.105 --min-rate 1000 -Pn 基础Shell http://192.168.8.105/?page../../../../../etc/shadow 当再次尝试访问已经关闭 $ nmap -p- -sC -sV 192.168.8.105 --min-rat…

c++实现web服务器数据收发

利用微软标准API实现web服务器数据的发送和接受,遇到的问题点: 1.句柄创建 CString strMsg; int iError 0; HINTERNET hint; HINTERNET hftp; HINTERNET hconnect; HINTERNET Openhconnect; hint InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY/INTERNET_O…

7、广告-用户识别与ID映射

一、用户识别原理 程序化广告生态系统是以数据为核心的生态系统&#xff0c;要实现精准的受众定向&#xff0c;首先需要进行单用户的识别。在PC端&#xff0c;常用Cookie作为用户标识&#xff0c;为用户打上标签的技术被称为“种Cookie”。 Cookie的作用与局限性 生命周期短&a…

ms17-010 ms12-020 ms-08-067

MS17-010是一个由微软发布的安全公告编号&#xff0c;它指代了一个严重级别的安全漏洞&#xff0c;该漏洞存在于Microsoft Windows的Server Message Block 1.0 (SMBv1)协议处理中。这个漏洞被命名为“永恒之蓝”&#xff08;EternalBlue&#xff09;&#xff0c;因为它最初是由…

安装samba服务

说明: 1、根据业务场景需要,要求将linux生成的图片文件,共享到windows服务器。 2、研发从共享文件夹中读取图片并且在应用web页面展示。 3、故要求安装搭建samba服务器,然后将共享文件夹挂载到windows服务器指定路径。 一、安装samba服务 1、安装samba服务 说明:请在linu…

java web中解决浏览器下载后文件中文乱码问题

解决Java Web应用中浏览器下载文件时中文乱码的问题&#xff0c;通常需要在HTTP响应头中正确设置Content-Disposition字段&#xff0c;以指示浏览器如何处理文件名中的非ASCII字符。 以下是一个通用的方法&#xff0c;适用于包括IE、Chrome、Firefox、Safari在内的多种浏览器&…

【PTA】7-1 网红点打卡攻略(C/C++)代码实现 反思

解题细节分析&#xff1a; 0.比较图的两种存储方法&#xff0c;通过邻接矩阵存储更便于查找给定两点之间的关系 1.注意理解清楚题义&#xff1a;“访问所有网红点”中所有不是指攻略中所有&#xff0c;而是存在的全部的网红点 代码见下&#xff1a;// 需要注明的是&#xff…

锦江丽笙酒店稳步拓局海内外酒店市场 签约及意向合作20个新项目

&#xff08;中国上海&#xff0c;2024年6月27日&#xff09;民族品牌的国际化发展已日趋成为推动经济和文化交流的重要力量。作为民族品牌与国际品牌的融合发展&#xff0c;锦江丽笙酒店顺应市场趋势有序推进旗下品牌矩阵的全面布局&#xff1b;2024年上半年&#xff0c;已达成…

简易深度学习(1)深入分析神经元及多层感知机

一、神经元 单个神经元结构其实可以认为是一个线性回归模型。例如下图中 该神经元输入为三个特征&#xff08;x1&#xff0c;x2&#xff0c;x3&#xff09;&#xff0c;为了方便理解&#xff0c;大家可以认为每条线上都有一个权重和特征对应&#xff08;w1&#xff0c;w2&…

11-NumPy遍历数组

NumPy遍历数组 NumPy 提供了一个 nditer 迭代器对象&#xff0c;它可以配合 for 循环完成对数组元素的遍历。 下面看一组示例&#xff0c;使用 arange() 函数创建一个 3*4 数组&#xff0c;并使用 nditer 生成迭代器对象。 示例1&#xff1a; import numpy as np a np.ara…

Java列表转树形结构的工具

不废话&#xff0c;直接上代码 一、工具函数 可以直接使用list2tree()实现列表转树形结构 package com.server.utils.tree;import org.springframework.beans.BeanUtils;import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Bi…

从源码到上线:直播带货系统与短视频商城APP开发全流程

很多人问小编&#xff0c;一个完整的直播带货系统和短视频商城APP是如何从源码开发到最终上线的呢&#xff1f;今天&#xff0c;笔者将详细介绍这一全过程。 一、需求分析与规划 1.市场调研与需求分析&#xff1a;首先需要进行市场调研&#xff0c;了解当前市场的需求和竞争情…

入职必备-Git 2种方式拉取代码

【SSH方式】: 1.复制电子邮箱 2.git bash 打开窗口 ssh-keygen -t rsa -C liuchangprimecare.group 3.一路回车&#xff0c;然后查看C:\Users\LiuChang.ssh里面的文件 打开id_rsa.pub文件&#xff0c;复制代码 4.添加到GitLab的公钥输入框 5.然后 git clone gitgitlab.pr…

使用容器配置文件构建任意应用镜像_并将应用镜像推送到公共仓库共享_应用分享与启动---分布式云原生部署架构搭建012

上面我们编写好了应用,并且,安装好了redis 现在我们把应用打包成镜像. 以前是这样做的,不方便,因为需要在服务器上,安装jdk什么的,现在有了 镜像就不用,给服务器安装镜像什么的了 以后所有机器都安装docker以后,就直接运行就可以了 首先看一下,安装java应用,需要 用到openjd…

指纹浏览器是什么?跨境多账号安全如何保证?

随着电子商务的蓬勃发展&#xff0c;越来越多的商家选择开设多店来扩大经营规模。然而多店运营也带来了一系列的挑战&#xff0c;其中之一就是账号安全。 1. 了解反检测浏览器和代理服务器 在我们开始讨论如何有效地使用反检测浏览器之前&#xff0c;我们首先需要了解这两个工…

openlayer 我的标注功能

背景&#xff1a; 通过openlayer库&#xff0c;可以在地图上实现绘制点、线、面。 并把绘制的结果添加到我的标注的弹框。 我的标注功能&#xff0c;包括&#xff1a;我的标注查询结果的数据展示&#xff1b;添加分组&#xff1b;添加我的标注&#xff1b;编辑分组、删除分组&a…

经典神经网络(13)GPT-1、GPT-2原理及nanoGPT源码分析(GPT-2)

经典神经网络(13)GPT-1、GPT-2原理及nanoGPT源码分析(GPT-2) 2022 年 11 月&#xff0c;ChatGPT 成功面世&#xff0c;成为历史上用户增长最快的消费者应用。与 Google、FaceBook等公司不同&#xff0c;OpenAI 从初代模型 GPT-1 开始&#xff0c;始终贯彻只有解码器&#xff0…