stm32uart_stm32 uart-程序员宅基地

技术标签: stm32  嵌入式硬件  单片机  

  • USART

1、USART概念

USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步串行接收/发送器

USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备

处理器与外部设备通信的两种方式:

并行通信(八车道)

    -传输原理:数据各个位同时传输。

    -优点:速度快

    -缺点:占用引脚资源多

串行通信(单车道)

   -传输原理:数据按位顺序传输。

    -优点:占用引脚资源少

    -缺点:速度相对较慢

 

串行通信按传送方向分:

a.单工:

           数据传输只支持数据在一个方向上传输(收音机、遥控器)

b.半双工:

           允许数据在两个方向上传输,但是,在某一时刻,只允许数

           据在一个方向上传输,它实际上是一种切换方向的单工通信;(对讲机)

c.全双工:

           允许数据同时在两个方向上传输,因此,全双工通信是两个

           单工通信方式的结合,它要求发送设备和接收设备都有独立

           的接收和发送能力。(电话机)

2、STM32串口

USART习惯叫为串口,串口为全双工通信

串口信号线分析

TXD 发送数据 Transmit(tx) Data 简写形式 (TX  T  TD)

RXD 接受数据 Receive(rx) Data 简写形式 (RX  R  RD)

连接方式

MCU                       MCU

TXD-------------------------------------->RXD

RXD<-------------------------------------TXD

STM32串口异步通信定义的参数传送格式:

起始位

数据位(8位或者9位)

奇偶校验位(第9位)

停止位(1,1.5,2位)

波特率设置

 

  1. 起始位:发送器是通过发送起始位而开始一个字符的传送。起始位使数据线处于“space”状态
  2. 数据位:起始位之后就传送数据位。在数据位中,低位在前(左),高位在后(右)。由于字符编码方式的不同,数据位可以是5、6、7、8、9位。
  3. 奇偶校验位:用于对字符传送作正确性检查,因

    此奇偶校验位是可选择的,共有3种可能,即奇校验、偶校验和无校验,由用户根据需要选定。

  1. 停止位:停止位在最后,用以标志一个字符传送的结束,它对应于mark状态。停止位可能是1、1.5或2位,在实际应用中根据需要确定

  1. 串行通信的传送速率:在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送格式位的数目来表示,称之为波特率(band rate)。每秒传送一个格式位就是1波特。

bps:每秒传输多少比特位数据

9600bps:每秒传输9600位数据,波特率参考值

                                         

 

注意:两个MCU之间进行通信,数据帧格式及波特率必须是相同的。

3、USART1配置流程

串口1配置流程所需要的库函数:stm32f4xx_usart.c

  1. 理解电路原理图

PA9  ---- USART1_TX(发送端)

PA10 ---- USART1_RX(接收端)

 

2、 串口时钟使能,GPIO 时钟使能。

3、设置引脚复用器映射:调用 GPIO_PinAFConfig 函数。

4、GPIO 初始化设置:要设置模式为复用功能。

5、串口参数初始化:设置波特率,字长,奇偶校验等参数。

6、开启中断并且初始化 NVIC,使能中断(如果需要开启串口中断才需要这个步骤)。

7、配置为接收中断(表示有数据过来,CPU要中断进行接收)

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

  1. 使能串口。

USART_Cmd(USART1, ENABLE);

9、编写中断处理函数:函数名格式为 USARTx_IRQHandler(x 对应串口号)。

接收数据

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

发送数据函数

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

  1. 串口使用方法
  1. 安装串口驱动:ch341ser.exe(路径:D:\GZ2162文件\GZ2162期\14-STM32\006\资料\stc-isp-15xx-v6.88J\USB to UART Driver\CH340_CH341)
  2. 软件使用

查看设备管理的COM口

 

 

6、函数说明

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)

函数功能:USART初始化

返回值:无

USART_TypeDef* USARTx:哪个串口

USART_InitTypeDef* USART_InitStruct:串口结构体

typedef struct

{

  uint32_t USART_BaudRate;            //波特率

  uint16_t USART_WordLength;          //字长

  uint16_t USART_StopBits;            //停止位

  uint16_t USART_Parity;              //奇偶校验位

 

  uint16_t USART_Mode;                //模式

  uint16_t USART_HardwareFlowControl; //硬件控制流

} USART_InitTypeDef;

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)

函数说明:UASRT中断配置

返回值:无

USART_TypeDef* USARTx:哪个串口

uint16_t USART_IT:选择中断类型

FunctionalState NewState:是否使能

void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)

函数说明:UASRT使能

返回值:无

USART_TypeDef* USARTx:哪个串口

FunctionalState NewState:是否使能

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

函数说明:USART接收数据

返回值:接收的数据

USART_TypeDef* USARTx:哪个串口

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

函数说明:USART发送数据函数

返回值:无

USART_TypeDef* USARTx:哪个串口

uint16_t Data:发送的数据

  • 自定义数据协议

自定义数据协议指的是在某类产品当中,定义数据包,通过传输不同的数据包,响应不同的硬件,在不同的公司自定义的数据协议包是不一样。

1.格式

简化版

帧头 - 长度 - 数据 xx xx - 校验 - 帧尾

复杂版

帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾

举例:

HCL11:表示亮LED0灯;HCL10:表示灭LED0灯;

H C L 1 1 :

帧头   命令    硬件类型 第几个灯 灯状态   帧尾

三、技术应用

1、收银机通过串口与下位机进行通信

 

  1. 共享单车、汽车定位器、公交车等

在共享单车、汽车定位器、公交车等相关的电子产品中会GPS模块,GPS模块通过串口方式与MCU进行连接,GPS通过串口将定位的数据发达给MCU,MCU做出运算,并通过GPRS发送的服务器

 

#include "usart.h"

/*****************************************
引脚说明
PA9  ---- USART1_TX(发送端)
PA10 ---- USART1_RX(接收端)

******************************************/
void Usart1_Init(int MyBaudRate)
{
	
	GPIO_InitTypeDef  	GPIO_InitStruct;
	USART_InitTypeDef	USART_InitStruct;
	NVIC_InitTypeDef  NVIC_InitStruct;
	
	//串口时钟使能,GPIO 时钟使能。
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    //使能GPIOA时钟:
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);	
	
	//GPIOA9复用映射到USART1 引脚选定复用的功能
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); 	
	//GPIOA10复用映射到USART1 引脚选定复用的功能
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); 	
	
	//GPIO 初始化设置:要设置模式为复用功能。
	GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_9|GPIO_Pin_10;		//引脚9 10
	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_AF;		//复用模式
	GPIO_InitStruct.GPIO_OType	= GPIO_OType_PP;	//推挽式
	GPIO_InitStruct.GPIO_PuPd	= GPIO_PuPd_UP;		//上拉
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz;	//50MHZ
	GPIO_Init(GPIOA,&GPIO_InitStruct);	


	USART_InitStruct.USART_BaudRate				= MyBaudRate;					//波特率
	USART_InitStruct.USART_Mode					= USART_Mode_Tx|USART_Mode_Rx;	//全双工模式
	USART_InitStruct.USART_Parity				= USART_Parity_No;				//无奇偶校验位
	USART_InitStruct.USART_WordLength			= USART_WordLength_8b;			//数据位
	USART_InitStruct.USART_StopBits				= USART_StopBits_1;				//停止位
	USART_InitStruct.USART_HardwareFlowControl	= USART_HardwareFlowControl_None;//无硬件控制流
	//串口参数初始化:设置波特率,字长,奇偶校验等参数。
	USART_Init(USART1, &USART_InitStruct);
	
	//开启中断并且初始化 NVIC,
	NVIC_InitStruct.NVIC_IRQChannel						= USART1_IRQn; //中断通道,中断通道在stm32f4xx.h文件当中查找
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority	= 2;		 //抢占优先级			
	NVIC_InitStruct.NVIC_IRQChannelSubPriority			= 2;		 //响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd					= ENABLE;	 //使能通道
	//3、启定时器中断,配置NVIC。
    NVIC_Init(&NVIC_InitStruct);		


	//配置为接收中断(表示有数据过来,CPU要中断进行接收)
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	
	
	
	//使能串口。
	USART_Cmd(USART1, ENABLE);

}

 

#ifndef __USART_H
#define __USART_H

#include "stm32f4xx.h"



void Usart1_Init(int MyBaudRate);

#endif
#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "delay.h"
#include "tim.h"
#include "pwm.h"
#include "usart.h"



void USART1_IRQHandler(void)
{
	
	u8 data;

	//判断接收标志位是否为1
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		//清空接受标志位
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);	
		//接受数据
		data = USART_ReceiveData(USART1);
		//把数据通过串口1发送出去
		USART_SendData(USART1, data);
		
	}


}




int main(void)
{
	int key_count = 0;
	//设置NVIC分组(一个工程只能设置一个分组) 
	//第二分组;抢占优先组取值范围:0~3 响应先组取值范围:0~3
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	Led_Init();
	Delay_Init();

	Usart1_Init(115200);
	
	
	while(1)
	{
		
		delay_s(1);
	
	}
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hqb_newfarmer/article/details/129922762

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文