文章目录
一、USART串口通信简介
-
串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力
-
USART(Universal Synchronous/Asynchronous Receiver/Transmitter)是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里。USART具有以下的参数:
-
自带波特率发生器,最高达4.5Mbits/s
-
可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
-
可选校验位(无校验/奇校验/偶校验)
-
支持同步模式、硬件流控制、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);放到头文件里声明一下。
至此配置就完成了