stm32uart

  • 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);
	
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hqb_newfarmer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值