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

智能推荐

我了解的软件测试基本概念_敏捷环境什么意思-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏23次。题目汇总共293道题目录题目汇总 1一. 技术类型题目: 4二. 测试话术: 91.什么是兼容性测试?兼容性测试侧重哪些方面? 92.正交表测试用例设计方法的特点是什么? 103.简述一下缺陷的生命周期? 103.画出软件测试的V模型图。 104.您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 105.请以您以往的实际工作为例..._敏捷环境什么意思

CESM2:基本框架_clm5_incesm221.tar.gz-程序员宅基地

文章浏览阅读2.1k次,点赞5次,收藏12次。文章目录1. 基本框架2. CESM components3. grid4. compset4.1 命名规范:4.2 分类4.3 options4.4 Examples of simulations using different compsets:1. 基本框架CouplerAtmosphere ModelsCAM,CAM-CHEM,WACCM Community Atmosphere ModelDATM Climatological Data ModelLand Mo_clm5_incesm221.tar.gz

python定时框架APScheduler使用_python如何正确关闭调度器-程序员宅基地

文章浏览阅读674次,点赞2次,收藏2次。文章目录APScheduler安装apscheduler的组成常见调度器配置调度器启动/关闭调度器事件监听作业及作业存储Job是框架承接目前需要执行的工作和任务,我们可以在系统运行过程中进行动态的增加、修改、删除、查询等操作。1.添加作业2.移除作业3.暂停,恢复作业4.获得调度作业的列表作业控制APScheduler安装pip install apschedulerapschedule..._python如何正确关闭调度器

控制Android充电震动的代码,Android手机使用Tasker控制充电-程序员宅基地

文章浏览阅读667次。起因看到网上有人说,备用机长时间插在电源上会导致电池鼓包,虽然不确定真假,但还是“宁可信其有,不可信其无”,安全第一嘛。工具taskeresp8266开发板带光耦的继电器usb公头,母头,线材若干电烙铁(非必需,如果直接截断一根usb线接到继电器上的话,4也可以省了)操作基本流程tasker在电量变化时通知单片机当前电量,单片机收到手机发来的http post包后查看当前电量,并决定是否操作继电器..._tasker 震动

使用 matplotlib 绘制简单图表(折线图、柱形图、条形图、堆积面积图、直方图、饼图、散点图、箱形图、雷达图、误差棒图)_用matplotlib绘制图-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。X轴代表日期,y轴代表温度,由图可以清晰的看出北京市未来15天的最高气温和最低气温都呈现逐步下降后反弹的趋势。————2013-2019财年某电商平台的GMV。中的pyplot模块、numpy模块并设置中文。中的pyplot模块、numpy模块并设置中文。中的pyplot模块、numpy模块并设置中文。中的pyplot模块、numpy模块并设置中文。中的pyplot模块、numpy模块。中的pyplot模块、numpy模块。中的pyplot模块、numpy模块。中的pyplot模块、numpy模块。_用matplotlib绘制图

WebView内存泄漏解决方法_web-view memory access out-程序员宅基地

文章浏览阅读292次。##1.新开进程在WebView所在的activity新开辟一个进程,在onDestroy中杀死WebView所在的进程@Overridepublic void onDestroy() { android.os.Process.killProcess(android.os.Process.myPid()); super.onDestroy();}清单文..._web-view memory access out

随便推点

vc6.0助手简介及vc行号显示、自动注释工具_vc6显示变量注释-程序员宅基地

文章浏览阅读3.6k次。转自:http://blog.sina.com.cn/s/blog_7072d2a101012dz5.htmlVC助手 Visual Assist 6.0的安装与简介阅读:(10442) 评论:(9) 发表时间:2009-03-26作者:凉茶  Visual Assist X是开发环境的辅助工具,使用该工具可以让用户更加轻松地编写代码。下面以Visual Assist 6.0为例,_vc6显示变量注释

几种智能机器人室内定位方法对比_智能定位算法-程序员宅基地

文章浏览阅读4.1k次,点赞8次,收藏29次。NOKOV室内定位技术,主要用于实时准确测量,记录物体在真实三维空间中的运动轨迹或姿态。其光学式动作捕捉系统利用多个高速相机,从不同角度监视和跟踪待捕捉目标上的标志点_智能定位算法

关于vs2013的mysql配置问题说明_vs2013里config里默认的mysql链接删了-程序员宅基地

文章浏览阅读931次。C/C++连接MySql数据库 本文对如何使用MySql的API连接MySql数据库,开发环境为VS2013.一、VS2013工程设置工作首先,建立一个windows应用程序的工程,将C/C++->预处理器->预处理器定义下的_WINDOWS改为_CONSOLE,将连接器->系统->子系统 选择为控制台。由于我们要使用Mysql的API,并且我们_vs2013里config里默认的mysql链接删了

闵可夫斯基引擎Minkowski Engine_minkowskiengine-程序员宅基地

文章浏览阅读4.7k次。闵可夫斯基引擎Minkowski EngineMinkowski引擎是一个用于稀疏张量的自动微分库。它支持所有标准神经网络层,例如对稀疏张量的卷积,池化,解池和广播操作。有关更多信息,请访问文档页面。闵可夫斯基引擎Minkowski Enginepip install git+https://github.com/NVIDIA/MinkowskiEngine.git稀疏张量网络:空间稀疏张量的神经网络压缩神经网络以加快推理速度并最小化内存占用已被广泛研究。用于模型压缩的流行技术之一是修剪卷积网络中_minkowskiengine

LayUI-Table-添加禁止选中-程序员宅基地

文章浏览阅读1.6k次。LayUI这几年比较流行,里面的Table组件也比较强大,但是前面的CheckBox没有禁止选中功能,今天就来试试,看看能不能给添加一个禁止选中功能。Fork LayUI源码LayUI项目地址Clone到本地找到src里面lay下面的modules文件夹里面的table.js添加字段标记参照这里我们也添加一个"IS_DISABLE"的标记添加完如下 config: { ..._layui 行不允许选中

大数问题——26进制_z-26进制数是一个每位都是大写字母的数字。 a、b、c、…、x、y、z 分别依次代表一-程序员宅基地

文章浏览阅读4.3k次。杭电2100LovekeyProblem Description XYZ-26进制数是一个每位都是大写字母的数字。 A、B、C、…、X、Y、Z 分别依次代表一个0 ~ 25 的数字,一个 n 位的26进制数转化成是10进制的规则如下 A0A1A2A3…An-1 的每一位代表的数字为a0a1a2a3…an-1 ,则该XYZ-26进制数的10进制值就为 m = a0 * 26^(n-1) + a_z-26进制数是一个每位都是大写字母的数字。 a、b、c、…、x、y、z 分别依次代表一