您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页STM32的通信接口-USART

STM32的通信接口-USART

来源:化拓教育网

STM32可支持的通信协议

  • 使用USART通信协议需要有两条数据线,分别是TX(数据发送引脚)、RX(数据接收引脚)
  • USART支持全双工,同一时间内即可发送数据也可以接收数据
  • 所谓异步通信设置通信的双方没有时钟线,需要约定采样频率

USB转串口模块

实现计算机USB接口和串口协议之间的转换,实现通信

USART

usart是STM32内部集成的硬件外设,可根据数据寄存器的字节数据自动生成数据帧时序,从TX引脚发送出去,也可以自动接收RX引脚的数据帧时序,拼接为一个字节数据,放在数据寄存器里

USART框图

数据帧的发送

发送数据寄存器和接收数据寄存器在程序上表示一个寄存器USART_DR(数据寄存器),实际上分成两个寄存器,一个用于发送称为TDR,一个用于接收称为RDR。

发送数据的过程由发送器控制。CPU或DMA向发送数据寄存器写入数据,硬件会自动将TDR寄存器的数据移植到发送移位寄存器中,之后,硬件会自动将USART_SR寄存器的TXE置1,然后发送器根据USART_CR1(控制寄存器)的M位发送8位或者9位的数据字,当发送器被使能时(由USART_CR1的TE位控制),发送移位寄存器中的数据在TX引脚上输出。当包含数据的一帧完成后,由硬件将USART_CR1的TC位置1,表示该数据帧发送完成。

数据帧的接收:

首先使能USART和接收器(分别为USART_CR1的UE位和RE位),根据双方约定的数据帧的格式和波特率,接收移位数据寄存器将数据移至RDR寄存器时,USART_CR1的RXNE位被硬件自动置1,表示可以从RDR寄存器中读取数据

波特率的产生

有一个问题是为什么我们通常所用的波特率是115200、9600、2400······,为什么不是其他的数字?

根据设置的波特率计算USARTDIV存储到USART_BRR寄存器中,将整数部分和小数部分都转为16进制,

USART中断

如果设置了各自的使能位,这些事件就可以产生各自的中断,

代码部分

        1.配置USART

配置波特率,字长(8/9),停止位,校验位,接收模式还是发送模式(发送器和接收器)以及硬件流控制

TX引脚配置输出模式,RX引脚配置输入模式,最后使能USART

void USART1_Init()
{
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	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_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;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1, &USART_InitStructure);
}

        2.发送一个字节

发送数据的时候,需要知道发送数据寄存器的值是否被移到移位寄存器,所以需要有一个等待的过程,否则数据会被覆盖。

void USART1_SendByte(uint8_t Data)
{
	USART_SendData(USART1,Data);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==SET);
}

        3.发送一个数组

void USART1_SendArray(uint8_t *Array,uint8_t Lenght)
{
	uint8_t i=0;
	for(i=0;i<Lenght;i++)
	{
		USART1_SendByte(Array[i]);
	}
	
}

        4.发送一个数字

一个无符号字节的表示范围0-255,不能表示大范围的数据,以字符串的形式表示发送的数据

uint32_t USART1_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while (Y --)
	{
		Result *= X;
	}
	return Result;
}


void USART1_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i ++)
	{
		USART1_SendByte(Number / USART1_Pow(10, Length - i - 1) % 10 + '0');
	}
}

5.接收数据

串口接收数据形式

ASCLL码:在计算机中,所有的数据存储时都要使用二进制表示,像a,b,c,d和1,2,3····这样的大写字母以及一些常用的符号都需要使用二进制表示,这些符号的使用有一个统一的标准,统一为ASCLL码。

列如发送0x41,0x41在计算机存储的形式是二进制编码,如果想要以HEX模式接收,结果便是0x41,如果使用字符模式接收,结果是‘A’

发送字符‘A’,存储形式也是0X4二进制编码,hex模式接收,结果为0x41,字符模式结果为‘A’

接收数据

通过不断出查询RXNE标志位判断是否可以接收数据。

if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		Serial_RxData = USART_ReceiveData(USART1);
        //也可以手动清除
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}

关于串口输出的几种方式

1.通过printf()输出参数到串口

使用之前需要将Use MicroLIB勾选,MicroLIB是一个精简库

引入printf()函数的头文件<stdio.h>

接着将printf()重定向到串口

#include <stdio.h>

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

缺点就是只能使用到一个串口上,因为重定向到一个串口上

2.使用<stdio.h>头文件中的sprintf()函数

sprintf()用于将格式化的字符串输出带一个字符数组中,不是将数据输出到控制台,而是将数据输出到指定的字符数组中,

#include <stdio.h> //头文件
int sprintf(char* str, const char* format, ...);


//使用
char * String[100];
sprintf(String,"Num=%d",666);
USART1_SendString(String);
  • str:指向要写入的字符串指针
  • format:用于指定输出的格式,%d %c %s·····
  • ···   :表示可变参数列表

避免了重定向冲突的问题

//对sprintf()封装

void USART1_Printf(char *format, ...)
{
	char String[100];
	va_list arg;
	va_start(arg, format);
	vsprintf(String, format, arg);
	va_end(arg);
	USART1_SendString(String);
}

//调用
USART1_Printf("Num=%d",666);

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务