USART串口协议
通信接口
全双工:指通信双方能够同时进行双向通信,一般来说,全双工的通信都有两根通信线,发送线路和接收线路互不影响;
半双工:数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输;
单工:指数据只能从一个设备到另一个设备,不可以反着来;
时钟的作用:如果输出了一段高电平的波形,就是依靠时钟来判断波形是两个高电平信号还是一个高电平信号,即告诉接收方什么时候需要采集数据,I2C和SPI都有单独的时钟线,接收方可以在时钟信号的指引下进行采样,其他的没有时钟线,所以需要双方约定一个采样频率,为异步通信;
电平:单端:引脚的高低电平都是对GND的电压差,所以单端信号通信的双方都必须要共地,即把GND接在一起;差分:靠两个差分引脚的电压差来传输信号的,在通信时可以不需要GND,差分信号可以极大地提高抗干扰特性,所以差分信号的传输速度和距离都会非常高。
设备特性:多设备:可以在总线上挂载多个设备,还需要寻址的操作 ;点对点:两个设备直接传输数据;
串口
硬件电路
电平标准
串口参数及时序
USART简介
USART框图
引脚处只需要注意TX(发送)和RX(接收)引脚即可
发送数据寄存器和接收数据寄存器共用一个地址DR的,TDR是只写的,RDR是只读的,当我们想要写入DR时,写入的是TDR,读出DR时,读出的是RDR。
发送移位寄存器工作方式:当我们给TDR写入一个数据时,此时硬件检测到写入数据了,就会检查当前移位寄存器是否有数据正在移位,如果没有,那么我们输入的数据就会立刻全部移动到发送移位寄存器中,准备发送,在数据从TDR移动到移位寄存器时,会置一个标志位TXE,发送寄存器空,我们就可以检查这个标志位,如果置1了,我们就可以给TDR写入下一个数据了。然后发送移位寄存器就会在发生器控制的驱动下,向右一位一位地把数据输出到TX引脚(低位先行),当移位完成后,新的数据就会再次自动地从TDR转移到发送移位寄存器中来;如果移位寄存器中的数据还未移位完成,那么TDR就会进行等待,一旦移位完成就会立马把数据转移过来。(双重缓存)
接收移位寄存器同理。置的标志位位RXNE
SCLK:作用1可以兼容别的协议,作用2可以做自适应波特率
硬件数据流控制:用得少,不解释
唤醒单元:可以用来实现多设备通信的功能
波特率发生器部分:实际上就是分频器,USART1挂载在APB2,所以就是PCLK2的时钟,一般是72M,其他的USART都挂载在APB1,所以是PCLK1的时钟,一般是36M,之后这个时钟进行一个分频,除一个USARTDIV的分频系数,之后分频完之后再除个16,的带发送器时钟和接收器时钟,通向控制部分。如果TE为1,则发送部分的波特率有效,RE为1,则接收部分的波特率有效。
USART基本结构
数据帧
字长设置
停止位
起始位侦测(排除噪声)(P26-25:36)
数据采样
波特率发生器
DIV分为整数部分和小数部分,可以实现更细腻的分频
代码实操
串口发送
根据引脚定义,我们计划使用USART1的TX和RX引脚,所以要接到PA9和PA10上,注意接收脚和发送脚要交替相接;
介绍相关函数
老朋友
void USART_DeInit(USART_TypeDef* USARTx);
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
void USART_StructInit(USART_InitTypeDef* USART_InitStruct);
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
配置同步时钟输出(时钟是否需要输出,时钟的极性相位等)
void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct);
void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct);
开启USART到DMA的触发通道
void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState);
发送数据和接收数据(即写DR寄存器和读DR寄存器)
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
四个标志位函数(完成和中断)
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
按照下图流程编写初始化函数
1、开启时钟,把需要用到的USART和GPIO的时钟打开
//开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
2、GPIO初始化,把TX配置成复用输出,RT配置成输入
//GPIOGPIO_InitTypeDef GPIO_InitStructure;//TX是USART外设控制的输出脚,使用复用推挽输出//RX是USART外设数据输入表,使用输入模式//因为串口波形空闲状态时高电平,所以一般使用浮空输入或者上拉输入//此代码只需要发送GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
3、配置USART
//USARTUSART_InitTypeDef USART_InitStructure;//波特率(直接写我们需要的波特率即可,函数可以帮我们算好相对应的分频系数USART_InitStructure.USART_BaudRate = 9600;//硬件流控制(只使用RTX或者CTX、或者不用、或者都用)USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//USART模式(TX或者RX,当两者都想用时就可以使用|符号,类似GPIO选择两个引脚)USART_InitStructure.USART_Mode = USART_Mode_Tx;//校验(Odd奇校验,Even偶校验,No无)USART_InitStructure.USART_Parity = USART_Parity_No;//停止位USART_InitStructure.USART_StopBits = USART_StopBits_1;//字长USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_Init(USART1, &USART_InitStructure);
4、开启开关(如果需要接收信息,还需要配置中,这样就需要再加上ITConfig和NVIC的代码)
USART_Cmd(USART1, ENABLE);
5、创建一个发送数据的函数
void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1, Byte);//判断TDR的数据是否转移到移位寄存器//第二个参数:传输数据寄存器TDR空标志//在数据手册25.6.1中对TXE描述为再次对DR进行写操作时,即再次调用SendData函数时//标志位会自动置0,所以我们不用手动清零了while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);}
再在主函数中调用试一下
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"int main(void)
{OLED_Init();Serial_Init();Serial_SendByte(0x41);while(1){}
}
得到
相关文章:

USART串口协议
通信接口 •通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 • 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 全双工:指通信双方能够同时进行双向通信,一般来说,全双…...

picoctf_2018_shellcode
picoctf_2018_shellcode Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments32位,啥都没开 这个看着挺大的,直接来个ROPchain,…...

Apache Derby的使用
Apache Derby是关系型数据库,可以嵌入式方式运行,也可以独立运行,当使用嵌入式方式运行时常用于单元测试,本篇我们就使用单元测试来探索Apache Derby的使用 一、使用IDEA创建Maven项目 打开IDEA创建Maven项目,这里我…...
leetcode 图相关的题
图 图相关知识有leetcode207课程表1(有环判断)以及210 课程表2(拓扑排序). 链表遍历 def dfs(n):print(n)dfs(n)二叉树遍历 def dfs(n):print(n)dfs(n.left)dfs(n.right)多叉树遍历 dfs(root) def dfs(n):for node in n.nodes:dfs(node)图遍历 visited [False] * n_node…...

程序员们,我们能工作到65岁吗?
软件开发人员的职业生涯可以持续多久?这是大多数认真考虑成为专业程序员的人不禁想知道的事情。 在谈论这样一个要求很高的职业时,这是一个非常自然的问题。没有人愿意花费数年时间学习一项技能,这些技能将在几年内不再相关,或者当…...
【洛谷 P1996】约瑟夫问题 题解(队列+模拟+循环)
约瑟夫问题 题目描述 n n n 个人围成一圈,从第一个人开始报数,数到 m m m 的人出列,再由下一个人重新从 1 1 1 开始报数,数到 m m m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。…...

字符串函数与内存函数讲解
文章目录 前言一、字符串函数1.求字符串长度strlen 2.长度不受限制的字符串函数(1)strcpy(2)strcat(3)strcmp 3.长度受限制的字符串函数(1)strncpy(2)strncat(3)strncmp 4.字符串查找(1)strstr(2)strtok 5.错误信息报告(1)strerror(2)perror 二、内存函数1.memcpy2.memmove3.me…...

c语言系统编程之多进程
程序与进程的区别? 程序是静态的未运行的二进制文件,存储在磁盘中 进程是已经运行的二进制文件,存储在内存中 进程的内存划分图有哪几部分? 堆(存储malloc和calloc出来的空间)、栈(局部变量…...
前端还是后端:探讨Web开发的两大街区
前端还是后端:探讨Web开发的两大街区 一、引言二、两者的对比分析技能要求和专业知识职责和工作内容项目类型和应用领域就业前景和市场需求 三、技能转换和跨领域工作四、全栈开发结语 一、引言 Web开发领域涉及到前端开发和后端开发这两个不同而又互为补充的领域。…...

JavaScript中如何确定this的值?如何指定this的值?
🎀JavaScript中的this 在绝大多数情况下,函数的调用方法决定了this的值(运行时绑定)。this不能在执行期间被赋值,并且在每次函数呗调用时this的值也可能会不同。 🍿如何确定this的值: 在非严格…...

ubuntu下源码编译方式安装opencv
基础条件 ubuntu 20.04 opencv 3.4.3 opencv 源码编译的安装步骤 第一步, 首先clone源码 git clone https://github.com/opencv/opencv.git第二步,依赖包,执行下面的命令 sudo apt-get install build-essential sudo apt-get install cmak…...

spring boot整合常用redis客户端(Jedis、Lettuce、RedisTemplate、Redisson)常见场景解决方案
Java操作redis有三种客户端供选择:Jedis、Lettuce、Redisson。 在实际项目中运用最多的客户端还是Redisson、RedisTemplate;其中RedisTemplate并非是一个新的redis客户端实现,RedisTemplate是Spring Data Redis中提供的封装好的redis操作模板…...
HarmonyOS之运行Hello World
目录 下载与安装DevEco Studio 配置环境 创建项目 认识DevEco Studio界面 运行Hello World 了解基本工程目录 工程级目录 模块级目录...
postgresql数据库|wal日志的开启以及如何管理
一, wal的基本概念 WAL即Write Ahead Log预写式日志,简称wal日志,相当于oracle中的redo日志。只是oracle中redo是固定几个redo日志文件,然后轮着切换去写入。pg中wal日志是动态切换,单个wal日志写满继续写下一个wal日志,连续不断生成wal日志。…...

小波变换学习笔记【1】
【声明】本博客为学习B站视频小波分解与重构所做笔记,供自己和大家查阅学习,想查看 up 原视频请移步 B 站,侵删。 1.1 小波变换的由来 傅里叶变换基本思想:将信号分解成一系列不同频率的连续正弦波的叠加。 其缺点是,…...

雷柏mv20鼠标使用体验
用了1年多,第一次用竖着的鼠标,现在已经很习惯了,感觉还不错。说说使用感受: 1、 仍然是长时间使用鼠标,但是很少出现手腕痛的情况,确实是有一定效果的。 2、使用场景是有限制的,我是配合笔记…...

【分布式云储存】Springboot微服务接入MinIO实现文件服务
文章目录 前言技术回顾准备工作申请accessKey\secretKey创建数据存储桶公共资源直接访问测试 接入springboot实现文件服务依赖引入配置文件MinIO配置MinIO工具类 OkHttpSSLSocketClient兼容ssl静态资源预览解决方案资源上传预览测试测试结果 前言 上篇博客我们介绍了分布式云存…...

机器人中的数值优化|【四】L-BFGS理论推导与延伸
机器人中的数值优化|【四】L-BFGS理论推导与延伸 往期内容回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化,拟牛…...

ThemeForest – Canvas 7.2.0 – 多用途 HTML5 模板
ThemeForest 上的 HTML 网站模板受到全球数百万客户的喜爱。与包含网站所有页面并允许您在 WP 仪表板中自定义字体和样式的 WordPress 主题不同,这些设计模板是用 HTML 构建的。您可以在 HTML 编辑器中编辑模板,但不能在 WordPress 上编辑模板࿰…...
本地部署 川虎 Chat
本地部署 川虎 Chat 1. 川虎 Chat 项目概述2. Github 地址3. 部署 川虎 Chat4. 配置 config.json5. 启动 川虎 Chat 1. 川虎 Chat 项目概述 为ChatGPT等多种LLM提供了一个轻快好用的Web图形界面和众多附加功能。 支持 GPT-4 基于文件问答 LLM本地部署 联网搜索 Agent 助理…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...