STM32入门学习之USART串口通信:

这篇具有很好参考价值的文章主要介绍了STM32入门学习之USART串口通信:。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.串口通信简介:通用异步收发传输器UART(Universal Asynchronous Receiver/Transmitter)是负责处理数据总线和串口之间的串/并通信的设备。UART通信规定了数据帧的格式:起始位、数据位、校验位、停止位等。UART异步通信只需要通信双方设置好数据帧的格式和波特率即可完成通信。因为是异步通信,所以不需要时钟,只需要两根信号线就可以实习数据通信:接受数据RXD、发送数据TXD。

常见的使用了UASR通信协议的接口标准有:RS232、RS485等。

UART是全双工通信:同一时刻两个设备之间可以同时进行发送和接受数据操作。

(补充:单工通信:任何时刻数据只能从一个方向进行通信,一个设备发送,另一个设备接受。

                半双工通信:两个设备之间可以收发数据,但是不能在同一个时刻进行,即在同一个时刻,只能一个设备发送,另一个设备接受。)

2.设计思路:本文通过串口中断接受来接受发送到串口的数据。主要步骤是使能串口和引脚的时钟、配置引脚和串口以及中断的信息、写串口中断的回调函数。

配置串口通信,需要了解串口状态寄存器USART_SR和数据寄存器USART_DA。

(1)串口状态寄存器USART_SR:

STM32入门学习之USART串口通信:,STM32开发学习,stm32,学习,单片机,USART,串口通信,接受中断

 主要是了解第5位RXNE和第六位TC.

RXNE:为1时,表示数据寄存器中有数据,可以读取数据。为0时表示未接收到数据。当接受到数据时,RXNE由硬件置为1。可以通过对数据寄存器USART_DR执行读操作,将RXNE置为0。或者向此位写入0。

TC:可以通过此位判断数据是否发送完成。可以通过读取USART_SR寄存器,再往USART_DR寄存器写入数据,将TC置为。或者直接往TC位写入0。

(2)串口数据寄存器USART_DR:

STM32入门学习之USART串口通信:,STM32开发学习,stm32,学习,单片机,USART,串口通信,接受中断

 如上图所示,USART_DR只有0-8位是有用的。

3.代码:

(1).usart.h:

#ifndef __USART_H
#define __USART_H

#include "stm32f10x.h"
#include <stdio.h>

#define RX_LEN 100						//Äܹ»½ÓÊܵÄ×î´ó×Ö½ÚÊý

extern u8 RX_BUF[RX_LEN];
extern int len;
extern u8 RX_FLAG;

void usart_init(int bound);

#endif

(2).usart.c:

#include "USART.h"

int len = 0;
u8 data;
u8 RX_BUF[RX_LEN];
u8 RX_FLAG = 0;


//´®¿Ú³õʼ»¯º¯Êý
void usart_init(int bound)
{
	//1.¶¨ÒåÒý½Å¡¢USART¡¢ÖжϽṹÌ壺
	GPIO_InitTypeDef GPIO_Initstruct;
	USART_InitTypeDef USART_Initstruct;
	NVIC_InitTypeDef NVIC_Initstruct;
	
	//2.ʹÄܶ˿ںÍUSARTµÄʱÖÓ£º
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO,ENABLE);

	//3.ÅäÖÃÒý½Å£º
	//PA9£º
	GPIO_Initstruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_Initstruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_Initstruct);
	
	//PA10:
	GPIO_Initstruct.GPIO_Pin = GPIO_Pin_10;
	GPIO_Initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_Initstruct);
	
	//4.ÅäÖÃUSART1:
	USART_Initstruct.USART_BaudRate = bound;
	USART_Initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_Initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_Initstruct.USART_Parity = USART_Parity_No;
	USART_Initstruct.USART_StopBits = USART_StopBits_1;
	USART_Initstruct.USART_WordLength = USART_WordLength_8b;
	
	USART_Init(USART1,&USART_Initstruct);		//½«Ïà¹ØÊý¾ÝдÈëUSARTµÄ¼Ä´æÆ÷
	USART_Cmd(USART1,ENABLE);								//ʹÄÜUSART¼Ä´æÆ÷
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);		//ʹÄܽÓÊÕÖжÏ
	
	//5.ÅäÖÃÖжϣº
	NVIC_Initstruct.NVIC_IRQChannel = USART1_IRQn;
	NVIC_Initstruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority = 3;
	NVIC_Initstruct.NVIC_IRQChannelSubPriority = 3;
	NVIC_Init(&NVIC_Initstruct);
	
}

void USART1_IRQHandler(void)
{
	//uint16_t x[] = {1,2,3};
	//ÅжÏÊÇ·ñ²úÉú´®¿ÚÊý¾Ý½ÓÊÜÖжÏ
	if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
	{
		data = USART_ReceiveData(USART1);
		RX_BUF[len++] = data;
		RX_FLAG = 1;
	}
}

//Öض¨Ïòfputcº¯Êý£º
int fputc(int ch,FILE *f)
{
	//1.Åжϴ®¿ÚÊÇ·ñ·¢ËÍÍê³É£º
	while((USART1->SR & 0x40) == 0);
	
	//2.·¢ËÍÒ»¸ö×Ö½Ú£¬½«Êý¾ÝдÈëµ½¼Ä´æÆ÷£º
	USART1->DR = (u8) ch;
	return ch;
}

(3).main.c:

#include "stm32f10x.h"
#include "USART.h"
#include <stdio.h>

extern u8 data;

int main(void)
{
	int i;
	
	//ÖжÏÓÅÏȼ¶·Ö×飺
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	//³õʼ»¯´®¿ÚUSART1:
	usart_init(9600);
	
	//char *x = "h";
	while(1)
	{
		if(RX_FLAG)
		{
			printf("½ÓÊܵ½µÄÊý¾Ý:\r\n");
			for(i = 0;i < len;i++)
			{
				USART_SendData(USART1,RX_BUF[i]);
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);		//¼ì²éÊÇ·ñ·¢ËÍÍê³É
			}
			RX_FLAG = 0;
			len = 0;
			printf("\r\n\r\n");
		}						
	}
}


上图中的注释会出现乱码,将代码复制到keil中就可以正常显示了。

4.运行结果:

STM32入门学习之USART串口通信:,STM32开发学习,stm32,学习,单片机,USART,串口通信,接受中断

5.总结:配置串口通信需要使能引脚、串口时钟,配置rx、tx引脚 ,配置串口寄存器,配置中断。虽然,这些都可以通过STM32提供的库函数完成。但是,我们还是应该是大概的了解一下对应寄存器的功能。比如USART_SR和USART_DR。

使用异步收发传输器UART的通信双方需要设置好数据帧格式、波特率,通过接受数据RXD和发送数据TXD即可完成通信。UART数据通信的方式为全双工。UART具有通信简单,易实习的优点,其缺点是传输速率低、传输距离较短、容易被干扰。

UART与通用同步/异步串行收发器USART(Universal Synchronous/Asynchronous Receiver/Transmitter)的区别在于:UART只有异步通信,而USART有同步和异步通信。

同步和异步最大的区别在于:同步通信中双方需要时钟线进行同步,而异步通信不需要时钟线。文章来源地址https://www.toymoban.com/news/detail-603307.html

到了这里,关于STM32入门学习之USART串口通信:的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMX实现USART串口通信

    硬件:stm32f103c8t6核心板 软件:STM32CubeMX 6.6.1 keil5 mdk 这里就不再详细介绍了,详细请参考上一篇博客: https://blog.csdn.net/qq_55894922/article/details/127232999?spm=1001.2014.3001.5501 若点击 Manage embedded software packages 后,出现失败,则需要随便点击其它任一选项,进行下载一些文件,比如点

    2023年04月17日
    浏览(52)
  • stm32中常见的通信协议之USART(串口)

    USART是一种通用的串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收。 串口的通信速度用波特率来表示,其单位为bps(bit per second)即每秒钟传送bit的数量。 串口规定,数据线在空闲的状态下,必须是置为高电平的状态。 起始信号为低电平,因为串口

    2023年04月08日
    浏览(46)
  • STM32F4 基于USART串口的蓝牙通信

    目录 一、硬件资源 连接方案 其他配置 二、实验原理 基本定义 USART介绍 USART工作原理 数据发送 数据接收 蓝牙HM-10配置 三、代码部分 usart.c usart.h Serial.c Serial.h main.c 结语 STM32F401,OLED,蓝牙hm10 连接方案 设备1的TX与设备2的RX连接,这样设备1发送的数据可以被设备2接收到。

    2024年01月17日
    浏览(46)
  • STM32 串口通信USART1的配置和使用

    UART:universal asynchronous receiver and transmitter通用异步收发器 USART:universal synchronous asynchronous receiver and transmitter通用同步异步收发器 上图是利用寄存器配置的步骤,下面我用官方库函数配置USART1 1、要配置串口usart1,先查看数据手册以及开发板原理图的芯片管脚 根据上图可以看

    2024年02月05日
    浏览(46)
  • STM32串口通信中的USART_RecieveData函数分析

    拿这个中断函数为例         很多人可能注意到了接收数据函数的返回类型为无符号短整型,疑惑这里为什么用了一个无符号字符类型变量rec接收。 先看看这个函数的定义         其实,是因为串口设置的字长为8,所以数据寄存器中第八位为0,第0~7位为数据有效位,

    2024年02月11日
    浏览(35)
  • 【STM32】STM32学习笔记-USART串口协议(25)

    按数据传送的方式,通讯可分为串行通讯与并行通讯,串行通讯是指设备之间通过少量数据信号线(一般是8根以下), 地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式。而并行通讯一般是指使用8、16、32及64根或更多的数据线进行传输的通讯方式, 它们的通

    2024年01月19日
    浏览(45)
  • 【STM32】STM32学习笔记-USART串口数据包(28)

    串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式, 电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和

    2024年01月18日
    浏览(40)
  • 江科协STM32教程——STM32 使用串口助手进行LED灯的点亮熄灭灭控制全代码过程(USART串口通信的简单应用)

            使用USART串口通信,通过上位机串口助手发送符串给STM32执行LED灯点亮熄灭操作的流程。         基本的配置如下所示,GPIO口配置的为PA9推挽输出,用于LED灯的操作。其余注意USART_ITConfig和USART_Cmd开启USART接收中断和使能USART运行。         接下来要进行发送字

    2024年03月21日
    浏览(58)
  • stm32学习笔记-9 USART串口

    注:笔记主要参考B站 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。 注:工程及代码文件放在了本人的Github仓库。 从本节开始,将逐一学习STM32的通信接口。首先介绍以下stm32都集成了什么通信外设。 为了控制或读取外挂模块,stm32需要与外挂模块进行通信,来扩

    2024年02月14日
    浏览(42)
  • STM32F103C8T6的USART串口通信及中断

    一、串口通信 (一)串口协议和RS-232标准 1.串口通信协议 串口通信是指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。 串口通信协议是指规定了数据包的内容,内容包含了起始位、主体

    2024年02月02日
    浏览(81)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包