基于STM32标准库的USART串口通信

本文详细介绍了STM32单片机中USART串口通信的基础配置、自动发送字符串方法、以及基于中断的可控发送。包括标准库封装、波特率设置、GPIO配置、中断处理等内容,并提供了实际的代码示例和烧录测试结果。
摘要由CSDN通过智能技术生成

一、USART串口通信简介

  • 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力

  • USART(Universal Synchronous/Asynchronous Receiver/Transmitter)是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里。USART具有以下的参数:

    1. 自带波特率发生器,最高达4.5Mbits/s

    2. 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)

    3. 可选校验位(无校验/奇校验/偶校验)

    4. 支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN

    以下是USART串口通信在单片机内部的流程图

    在这里插入图片描述
    USART主要通过GPIO的TX和RX引脚收发数据。当单片机作为发送端时,系统通过波特率发生器规定发送速度,发送控制器根据波特率将要发送的数据放入发送数据寄存器TDR,TDR再将数据压入发送移位寄存器中,通过TX引脚从低位到高位逐一发送。每次移位发送的数据流有以下特征:

    在这里插入图片描述

    空闲位一直置1,当有数据进入后,起始位置0,随后开始读取数据,数据位共8位或9位,含奇偶校验位或不校验,最后停止位置1,结束该数据流,等待下一个数据流

当单片机作为接收端时也是具有相似的原理,系统将收到的数据先放在接收移位寄存器,再逐一放入接收数据寄存器RDR,接收的速率也是由接受控制器进行配置的,所以串口通信双方必须要保持严格的同步性,才能保证数据无误。

二、标准库封装配置USART1相关函数

我们首先进行标准库中USART1的函数配置

在以前的博客中,我曾详细介绍了新建模板工程的步骤,请不会的友友们去看这篇博客,这次我就不再做过多介绍了,直接开始使用工程开始配置。

链接:利用STM32实现流水灯程序_stm32流水灯程序代码_Constellation_zZ的博客-CSDN博客

我们打开工程模板,在Hardware组里新建“Serial.c"和”Serial.h"两个文件

在这里插入图片描述

注意,新建时请在路径后加上“\Hardware",方便封装与调用

在这里插入图片描述

随后我们按照之前的方式一样,在头文件上给出以下格式

#ifndef __SERIAL_H
#define __SERIAL_H
#include "stm32f10x.h"                 // Device header



#endif

在”Serial.c"函数中写入以下

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Stdio.h"


写入一个“Serial_Init”函数,用于配置基本的USART和GPIO

首先是打开APB使能时钟,

//打开USART1时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	//打开GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

接下来配置GPIO口,打开GPIOA的PA9引脚,作为数据发送。模式设置为复用推挽输出模式

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

接下来是配置USART串口通信,我们选择USART1作为串口,同样建立结构体,设置波特率为9600,模式为仅发送,0校验位,1停止位,8数据位。编写如下:

USART_InitTypeDef USART_InitStruture;
	USART_InitStruture.USART_BaudRate=9600;//波特率设置为9600
	USART_InitStruture.USART_HardwareFlowControl=USART_HardwareFlowControl_None ;//设置无硬件流
	USART_InitStruture.USART_Mode=USART_Mode_Tx;//模式设置为仅发送
	USART_InitStruture.USART_Parity=USART_Parity_No ;///不需要校验
	USART_InitStruture.USART_StopBits=USART_StopBits_1 ;//停止位选择1位
	USART_InitStruture.USART_WordLength=USART_WordLength_8b;//数据位选择8位
	USART_Init(USART1,&USART_InitStruture);
	
	USART_Cmd(USART1,ENABLE);//启用USART外设

这些函数都是配置函数,需要搭建起这样的基本环境才能进行下一步主程序编程,建议在使用这些函数的时候右键看一下定义,自己理解一下。

最后一步,把void Serial_Init(void);放到头文件里声明一下。

至此配置就完成了

三、自动发送字符串

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值