STM32_USART

1、USART简介

        USART,即Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步/异步收发器。USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里 自带波特率发生器,最高达4.5Mbits/s。可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)。可选校验位(无校验/奇校验/偶校验)。支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN等。

        在STM32F103C8T6上的USART资源: USART1、 USART2、 USART3

2、串口通信

        串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力。

        简单的双向串口通信有两根通信线(发送端TX和接收端RX),TX与RX要交叉连接,当只需单向的数据传输时,可以只接一根通信线;当电平标准不一致时,需要加电平转换芯片。

2.1 电平标准

        电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

        TTL电平:+3.3V或+5V表示1,0V表示0

        RS232电平:-3~-15V表示1,+3~+15V表示0

        RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

2.2 串口参数

        波特率:串口通信的速率,单位是码元/s,或者直接叫波特(Baud),在二进制调制的情况下,一个码元就是一个bit,此时可以等于比特率,即每秒发送的比特数,bit/s(bps)

        起始位:标志一个数据帧的开始,固定为低电平

        数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行

        校验位:用于数据验证,根据数据位计算得来

        停止位:用于数据帧间隔,固定为高电平

        串口的时序图在空闲时一直为高电平,当起始位给了个低电平信号,告诉对方我要开始传输数据了,根据约定好的规定,传输8位数据,之后拉高电平,标志数据传输完成停止了。如果是多字节数据传输,则重复上述过程。而波特率是设置数据发送的速度,对方在设置时也设置相同的波特率,那么就会尽量保证大家发送和接收是同一个频率,不会出错。

        无校验位结构图:

         有校验位结构图:

2.3 并行与串行

        并行通信:总线在传递数据时,可以一次性将数据的多个位同时发送

        串行通信:一次只能传递一位数据

 

3、USART框图

        该图来源于STM32F103xxx:

        该图中的发送寄存器TDR(Transmit DR)和接收数据寄存器RDR(Receive DR)在实际中用的是同一个地址,在程序上只表示位一个寄存器,就是数据寄存器DR(Data Register),但是在实际硬件中,是分成了两个寄存器,TDR是只写的,RDR是只读的。

        发送移位寄存器就是将每一个字节的数据一位一位的移出去,接受寄存器类似。

        USART简要结构:

4、发送器/接收器配置

4.1 数据帧格式

4.1.1 不同数据位

4.1.2 不同停止位

4.2 配置过程

4.2.1 发送器配置过程

        (1)通过在USART_CR1寄存器上置位UE位来激活USART

        (2)编程USART_CR1的M位来定义字长。

        (3)在USART_CR2中编程停止位的位数。

        (4)如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中的描述配置DMA寄存器。

        (5)利用USART_BRR寄存器选择要求的波特率。

        (6)设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。

        (7)把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。在只有一个缓冲器的情况下,对每个待发送的数据重复步骤7。

        (8)在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输。

        清零TXE位总是通过对数据寄存器的写操作来完成的。TXE位由硬件来设置,它表明:数据已经从TDR移送到移位寄存器,数据发送已经开始;TDR寄存器被清空;下一个数据可以被写进USART_DR寄存器而不会覆盖先前的数据。

        如果TXEIE位被设置,此标志将产生一个中断。

4.2.2 接收器配置过程

        (1)将USART_CR1寄存器的UE置1来激活USART。

        (2)编程USART_CR1的M位定义字长

        (3)在USART_CR2中编写停止位的个数

        (4)如果需多缓冲器通信,选择USART_CR3中的DMA使能位(DMAR)。按多缓冲器通信中要求的配置DMA寄存器。

        (5)利用波特率寄存器USART_BRR选择希望的波特率。

        (6)设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。

        当一字符被接收到时:

                RXNE位被置位。它表明移位寄存器的内容被转移到RDR。换句话说,数据已经被接收并且可以被读出(包括与之有关的错误标志)。

                如果RXNEIE位被设置,产生中断。

                在接收期间如果检测到帧错误,噪音或溢出错误,错误标志将被置起。

                在多缓冲器通信时,RXNE在每个字节接收后被置起,并由DMA对数据寄存器的读操作而清零。

                在单缓冲器模式里,由软件读USART_DR寄存器完成对RXNE位清除。RXNE标志也可以通过对它写‘0’来清除。RXNE位必须在下一字符接收结束前被清零,以避免溢出错误。

5、输出重定向

        因为c库中的printf默认是输出到屏幕的,单片机没有屏幕,在这里是将数据输出到串口,因此需要对printf进行重定向。在printf中,putc函数是其底层,printf函数执行过程中就是不断调用putc函数,所以对putc函数进行重写。

int fputc(int ch, FILE *f)
{Serial_SendByte(ch);return ch;
}

        在编译的时候,还要勾选魔术棒- Target中的USE MicroLIB。

6、示例代码

//serial.c
#include "stm32f10x.h"                  // Device header
//使用printf函数,要在keil中勾选USE MicroLIB选项,MicroLIB是Keil为嵌入式平台优化的一个精简库
#include <stdio.h>
#include <stdarg.h>uint8_t Serial_RxData;
uint8_t Serial_RxFlag;void Serial_Init(void)
{//第一步,开启时钟,打开需要用的USART和GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//第二步,GPIO初始化,把TX配制成复用输出,RX配置成输入GPIO_InitTypeDef GPIO_InitStructure;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);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	//上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//第三步,配置USART,直接使用一个结构体USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 9600;	//波特率,系统内部会自动算好该波特率对应的分频系数USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//硬件流控制,这里不使用流控USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;	//串口模式,这里同时开启发送和接收的部分USART_InitStructure.USART_Parity = USART_Parity_No;	//校验位USART_InitStructure.USART_StopBits = USART_StopBits_1;	//停止位,这里选择1位停止位USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//字长,这里不需要校验位,所以选择8位USART_Init(USART1, &USART_InitStructure);//使用中断,如果不使用接收可以不配置这一步USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	//开启RXNE位到NVIC的输出NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);//第四步,如果只需要发送的功能,那么直接开启USART,初始化就结束了USART_Cmd(USART1, ENABLE);//这里标志位置1后,不需要手动清0,系统会自动完成
}//串口发送函数
void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1, Byte);	//调用该函数将变量写入到TDR中,//然后等待TDR的数据转移到移位寄存器了,才能放心,如果没有转移时,就再次写入数据,救护产生数据覆盖while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);	//这里标志位置1后,不需要手动清0,系统会自动完成
}//uint8_t的指针类型,指向待发送数组的首地址
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{uint16_t i;for (i = 0; i < Length; i ++){Serial_SendByte(Array[i]);}
}//对printf函数进行重定向,因为printf默认是输出到屏幕的,stm32没有屏幕,重定向到串口输出
int fputc(int ch, FILE *f)
{Serial_SendByte(ch);return ch;
}//设置一个读取标志位后清除的函数
uint8_t Serial_GetRxFlag(void)
{if (Serial_RxFlag == 1){Serial_RxFlag = 0;return 1;}return 0;
}uint8_t Serial_GetData(void)
{return Serial_RxData;
}//中断函数的名字,从启动文件中找
void USART1_IRQHandler(void)
{//判断标志位if (USART_GetFlagStatus(USART1, USART_IT_RXNE) == SET){Serial_RxData = USART_ReceiveData(USART1);//置一个自己的标志位Serial_RxFlag = 1;//清除标志位USART_ClearITPendingBit(USART1, USART_IT_RXNE);}
}

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

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

相关文章

香橙派 AIpro开发板开箱测评(代码开源)

前言&#xff1a;有幸能够收到一块梦寐以求的 AI 边缘计算开发板 OrangePi AIpro&#xff0c;非常感谢官方大大给予的宝贵机会。OrangePi AIpro是香橙派官方跟华为昇腾合作的新一代边缘计算产品&#xff0c;其使用华为昇腾 AI 技术路线&#xff0c;搭配集成图像处理器&#xff…

【C++题解】1133. 字符串的反码

问题&#xff1a;1133. 字符串的反码 类型&#xff1a;字符串 题目描述&#xff1a; 一个二进制数&#xff0c;将其每一位取反&#xff0c;称之为这个数的反码。下面我们定义一个字符的反码。 如果这是一个小写字符&#xff0c;则它和字符 a 的距离与它的反码和字符 z 的距离…

银行从业资格证初级计算题公式

单利本息和&#xff08;利率固定&#xff0c;利息不叠加计算求和&#xff0c;常用于定期存款&#xff09; 复利本息和&#xff08;利率固定&#xff0c;利率与利息本金叠加计算求和&#xff0c;常用于某段范围内进行投资&#xff09; 复利利率&#xff08;计算利率不用涉及本金…

docker image分析利器之dive

dive是一个用于研究 Docker 镜像、层内容以及发现缩小 Docker/OCI 镜像大小方法的开源工具. 开源地址: dive github 为了有个直观的印象, 可以先看一下repo文档中的gif图: 安装 在Ubuntu/Debian系统下&#xff0c;可以使用deb包安装: DIVE_VERSION$(curl -sL "https:/…

使用虚拟卡注册亚马逊店铺亲测墨西哥、北美都可以亲测~~

这几天测试了使用虚拟信用卡注册墨西哥与北美站的店铺&#xff0c;成功下店&#xff0c;总有人说会被扫&#xff0c;其实去年12月费就有使用卡注册店铺&#xff0c;至今还是好的 当然也不是完全都没有可能店铺不会挂&#xff0c;挂的时候提供账单就好了&#xff0c;直接找客服…

Linux 一键部署alfresco 6

alfresco 前言 Alfresco是一个流行的企业级开源内容管理系统和协作平台。它提供了丰富的功能,包括文档管理、记录管理、协作工具、工作流管理、搜索和版本控制等。Alfresco还具有灵活的部署选项,可以作为本地部署的软件或云服务来使用。 该平台可以帮助组织管理和存储各种类…

服务器数据恢复—EVA存储异常断电重启后虚拟机无法启动如何恢复数据?

服务器存储数据恢复环境&#xff1a; 某品牌EVA8400&#xff0c;服务器上安装VMware ESXi虚拟化平台&#xff0c;虚拟机的虚拟磁盘包括数据盘&#xff08;精简模式&#xff09;快照数据盘&#xff0c;部分虚拟机中运行oracle数据库和mysql数据库。 服务器存储故障&检测&…

操作系统 - 输入/输出(I/O)管理

输入/输出(I/O)管理 考纲内容 I/O管理基础 设备&#xff1a;设备的基本概念&#xff0c;设备的分类&#xff0c;I/O接口 I/O控制方式&#xff1a;轮询方式&#xff0c;中断方式&#xff0c;DMA方式 I/O软件层次结构&#xff1a;中断处理程序&#xff0c;驱动程序&#xff0c;…

一些硬件知识【九】

STM32CUBEMX配置教程&#xff08;六&#xff09;高级定时器单通道输出互补PWM波&#xff08;带死区和刹车&#xff09;_高级定时器死区刹车怎么与电机模块连接?-CSDN博客 MOS选型关键参数&#xff1a; 额定电压&#xff0c;额定电流&#xff0c;导通电阻&#xff0c;阀值电压…

新型高性能数据记录仪ETHOS 2

| 具有强大CPU性能的数据记录仪 IPETRONIK推出了一款新型高性能数据记录仪——ETHOS 2&#xff0c;作为ETHOS的第二代&#xff0c;它借助新型英特尔i7-9850HE处理器&#xff0c;实现了11,572的性能指数&#xff0c;从而能够快速有效应对CAN FD、LIN和以太网总线测量方面的日益…

假暴力,cf1168B. Good Triple

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1168B - Codeforces 二、解题报告 1、思路分析 一眼没思路&#xff0c;打个暴力试试 因为如果 s[l, r] 是一个好字符串&#xff0c;那么s[i, r]一定也是好字符串&#xff0c;其中i < l 那么…

【生产管理】生产过程中的常见问题及解决方案

在生产管理中&#xff0c;会遇到多种问题&#xff0c;特别是与生产计划、生产进度控制以及品质控制方面&#xff0c;以下是生产过程中常见的问题及解决方案&#xff1a; 问题一&#xff1a;计划不清或无计划导致的物料进度无法保障 解决方案&#xff1a; 建立详细的生产计划&…

[数据集][目标检测]喝水检测数据集VOC+YOLO格式995张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;995 标注数量(xml文件个数)&#xff1a;995 标注数量(txt文件个数)&#xff1a;995 标注类别…

jeecgboot 同一账号只允许一个人登录

1.需求分析 jeecgboot 框架要实现同一个账号只允许一个人登录&#xff0c;就跟游戏账号类似&#xff0c;“我登录了就把你踢下去&#xff0c;你登录了就把我踢下去”&#xff1b;jwt 原理是生成 token 后一段时间内登录都有效&#xff0c;jeecgboot 中 jwt 和 redis 联合使用后…

OpenCV学习(2.1) 初识图像

1.图像对象 图像是由一个个像素组成的&#xff0c;像素越多&#xff0c;体现到图像就是更加清晰&#xff0c;有更多的细节。举个例子&#xff0c;通常来说的分辨率&#xff0c;1080P&#xff0c;720P&#xff0c;480P就是指像素的数量&#xff0c;数量越多就越清晰。 2.打印图…

NV-LIO:一种基于法向量的激光雷达-惯性系统(LIO)

论文&#xff1a;NV-LIO: LiDAR-Inertial Odometry using Normal Vectors Towards Robust SLAM in Multifloor Environments 作者&#xff1a;Dongha Chung, Jinwhan Kim NV-LIO&#xff1a;一种基于法向量的激光雷达-惯性系统&#xff08;LIO&#xff09;NV-LIO利用从激光雷…

vue3主题切换按钮与功能实现

代码: <template><div class"slideThree"><label class"theme-switch"><inputtype"checkbox"class"checkbox"v-model"isChecked"change"setTheme"id"slideThree"name"check…

Day08:CSS 高级

目标&#xff1a;掌握定位的作用及特点&#xff1b;掌握 CSS 高级技巧 一、定位 作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 1.定位模式&#xff1a;position 2.边偏移&#xff1a;设置盒子的位置 leftrighttopbottom 水平方向偏移&#xff1a;left、…

mac下载安装好软件后提示已损坏

mac下载安装好软件后提示已损坏 解决方法&#xff1a; 首先确保系统安全设置已经改为任何来源。 打开任何来源后&#xff0c;到应用程序目录中尝试运行软件&#xff0c;如果仍提示损坏&#xff0c;请在应用图标上&#xff0c;鼠标右键&#xff0c;在弹出菜单中点打开。 如果…

埃及媒体分发投放-新闻媒体通稿发布

埃及商业新闻 大舍传媒近日宣布将在埃及商业新闻领域展开新的媒体分发投放。作为埃及最具影响力的商业新闻平台之一&#xff0c;埃及商业新闻将为大舍传媒提供广阔的市场和受众群体。这一合作意味着大舍传媒将有机会通过埃及商业新闻的平台向埃及的商业精英和投资者传递最新的…