文章目录
-
- 【实验目的】
- 【实验原理】
- 一、USART接口简介
- 二、串口通信分类及原理
- 三、硬件连接和USART库函数介绍
- 四、软件流程图
- 【实验环境】
- 操作系统:
- 设备简介:
- 【实验步骤】
- 一、配置工程环境
- 二、开启时钟,完成端口初始化
- 三、编写main函数实现实验要求
- 四、编译并下载,观察实验现象
- 【实验思考】
- 一、选择题
- 二、简答题
- 附录:USART相关库函数
【实验目的】
掌握USART接口的基本的和主要指标。
掌握USART接口的编程原理和使用方法。
【实验原理】
STM32的串口非常强大,它不仅支持最基本的通用串口同步、异步通讯,还具有LIN总线功能(局域互联网)、IRDA 功能(红外通讯)、SmartCard功能。
一、USART接口简介
本实验使用的为串口中最基本、最常用的全双工、异步通讯方式,其寄存器说明如表1所示。要配置串口通讯,至少要设置以下几个参数:字长(一次传送的数据长度)、波特率(每秒传输的数据位数)、奇偶校验位、还有停止位。在初始化串口的时候,必然有一个串口初始化结构体,这个结构体的几个成员肯定就是存储这些控制参数的。
表1 USART相关寄存器
二、串口通信分类及原理
串口通讯分为并行通信和串行通信。并行通信是通过多条数据线来传输数据,所以传输的速度比较快,缺点是不利于长距离传输,串行通信指将数据字节分成位的形式,在一条线上来传输,相比并行通信可以大幅减少成本,但是控制难度较大,串行通信根据传输方向分为单工、半双工和全双工,根据时钟的特性又可以分为同步通信和异步通信。
一般使用异步通信较多,异步通信的原理是将数据以帧的形式传输,每帧间有固定的传输时间间隔,通信中的波特率、数据位、停止位和奇偶校验的参数设置很关键,必须使两个端口的参数匹配后才可以通信。
串行通信中的波特率和比特率:波特率指数据信号对载波的调制速率,波特率的单位是波特(baud),比特率指单位时间内传输的比特数,单位bit/s(bps),而对于USART来说,波特率和比特率是相等的。总之,波特率越大传输速率越快,通过控制时钟可以改变波特率。
数据位是传输数据的部分,停止位都在一帧数据的最后一位表示数据帧传输的结束,而奇偶校验位是用来纠错的,用于判读数据传输过程中是否发生了错误。
三、硬件连接和USART库函数介绍
图1 电路原理图
STM32芯片有3个同步异步串口和2个异步串口,本实验中使用异步串口的方式进行通讯,连接方式见图1,芯片上的PC10和PC11引脚分别对应异步串口UART4的发送端TX和接收端RX,小车上的电路板已经将这两个引脚引出。
表2 STM32F103xx芯片引脚功能定义
STM32的芯片引脚和串口的对应关系见上表2(芯片手册P34页),可以看出PC10和PC11引脚的功能分别是异步串口UART4的发送和接收端,为了使用串口通信功能,需要对GPIO和UART4的时钟进行配置。
与串口模块有关的结构体USART_InitTypeDef定义在stm32f10x_usart.h中,库函数USART_Init定义在stm32f10x_usart.c中。
USART_InitTypeDef结构体的配置如下:
typedef struct
{
uint32_t USART_BaudRate; // 波特率
uint16_t USART_WordLength; // 字长
uint16_t USART_StopBits; // 停止位
uint16_t USART_Parity; // 校验位
uint16_t USART_Mode; // USART 模式
uint16_t USART_HardwareFlowControl; // 硬件流控制
} USART_InitTypeDef;
库函数USART_Init的作用是初始化串口参数,配置串口的波特率、数据位、停止位和奇偶校验等参数。
四、软件流程图
图2 系统流程图
系统流程图见图2,使用串口模块时同样要先初始化串口所对应的GPIO引脚,这里使用的是异步串口UART4,它所对应的引脚为PC10和PC11,所以先使能引脚的时钟,设置与串口发送端TX对应的PC10为推挽输出,与串口接收端RX对应的PC11引脚设置为浮空输入,然后初始化GPIO,之后再使能串口UART4的时钟,先将其复位,然后设置波特率、停止位、校验位等参数,最关键的是要重定位fputc函数,因为这里要与电脑通信,所以要将该函数的输出重定向到串口上,这样在使用printf语句时,输出的结果可以通过串口传到电脑端,然后再开启串口中断。最后开启串口进行通信,这样电脑端就可以显示从单片机发送来的信息。
【实验环境】
操作系统:
Windows7/8/10,32bit/64bit
设备简介:
1、自平衡小车,如下图3所示,小车所搭载的电路板已经将STM32芯片上的PC10和PC11引脚引出,测试串口时将电路板和电脑端的usb转TTL模块的GND端连接,TX和RX相互交叉连接,则串口通讯的物理连接就完成了。
图3 双轮自平衡车和USB转TTL模块
2、ST-Link下载器(包含USB线与下载线),如下图4所示。
图4 ST-Link下载器与下载线
3、软件:Keil5、串口调试软件。
通过串口功能可以实现STM32单片机和电脑端的异步通讯,例如将单片机的信息输出到电脑端,在电脑端显示通讯结果的软件叫串口调试助手,串口调试助手的参数设置如图5所示。
图5 串口助手参数配置界面
4、实验场地:无
【实验步骤】
一、配置工程环境
1.1 打开已经建立好的工程模板,在新建立的工程模板中已经添加五个文件夹,分别命名为USER、HARDWARE、SYSTEM、CORE、FWLib文件夹,如下图6所示。其中USER文件夹存放的是主函数,HARDWARE文件夹存放的是本实验对应的硬件设备函数,SYSTEM存放的是本课程所有实验通用的函数,CORE文件夹存放的是启动文件,FWLib文件夹存放的是底层驱动函数。
图6 工程模板对应的文件夹
1.2 在SYSTEM文件夹下新建两个文件,分别为usart.c和usart.h。分别存放串口USART模块的初始化及配置函数与USART头文件,如图7所示。
图7 在SYSTEM文件夹下新建usart.c和usart.h文件
二、开启时钟,完成端口初始化
2.1 GPIO时钟使能:调用库函数RCC_APB2PeriphClockCmd()初始化UART4和GPIOC的时钟。
/*声明一个GPIO初始化结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*使能USART4对应的GPIOA时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
2.2设置GPIO端口模式:这是使用GPIOC的PC10和PC11的默认复用UART4的功能,在使用复用功能的时候,要开启相应的功能时钟UART4。
/*USART4_TX对应引脚PC10*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*复用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
/*初始化PC10引脚*/
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*USART4_RX对应引脚PC11*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
/*设置浮空输入*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
/*初始化PC11*/
GPIO_Init(GPIOC, &GPIO_InitStructure);
2.3 UART4外设使能:对UART进行初始化配置。分别配置串口的波特率、传输字长、停止位和校验位等。
/*声明一个串口初始化结构体*/
USART_InitTypeDef USART_InitStructure;
/*声明一个中断初始化结构体*/
NVIC_InitTypeDef NVIC_InitStructure;
/*使能USART4的时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
/*复位串口4 */
USART_DeInit(UART4);
/* USART初始化设置,波特率设置为9600*/
USART_InitStructure.USART_BaudRate = 9600;
/*字长为8位数据格式*/
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
/*一个停止位*/
USART_InitStructure.USART_StopBits = USART_StopBits_1;
/*无奇偶校验位*/
USART_InitStructure.USART_Parity = USART_Parity_No;
/*无硬件数据流控制*/
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
/*收发模式*/
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
/*初始化串口*/
USART_Init(UART4, &USART_InitStructure);
/*开启中断*/
//USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
/*使能串口*/
USART_Cmd(UART4, ENABLE);
2.4中断做初始化。
/* Usart4 NVIC配置*/
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
/*抢占优先级3*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
/*子优先级3*/
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
/*IRQ通道使能*/
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
/*根据指定的参数初始化VIC寄存器*/
NVIC_Init(&NVIC_InitStructure);
2.5 输出:根据选择的串口类型重新定义fputc函数,则调用printf函数可以将结果通过串口打印到电脑端的串口助手上。
/*重定义fputc函数*/
int fputc(int ch, FILE*f)
{
/*循环发送, 直到发送完毕*/
while(USART_GetFlagStatus(UART4, USART_FLAG_TC)!=Bit_SET);
UART4->DR = (u8)ch;
/*返回要发送的值*/
return ch;
}
三、编写main函数实现实验要求
3.1编写主函数来实现串口通信的功能
#include "delay.h" //包含延时函数头文件
#include "usart.h" //包含串口函数头文件
#include "sys.h" //包系统函数的头文件
int main(void)
{
/*计数器初始化*/
u16 i = 0;
/*延时函数初始化*/
delay_init();
/*设置NVIC中断分组2:2位抢占优先级,2位响应优先级*/
NVIC_Configuration();
/*串口初始化波特率为9600*/
uart_init(9600);
while(1)
{
/*将嵌入式实验输出到串口中,并在电脑端显示结果*/
printf("\r\n 嵌入式实验 \r\n");
/*计数器累加*/
i++;
/*当计数器结果等于20时,改变输出结果*/
if(i == 20)
{
/*串口输出中断和串口操作实验字符串*/
printf("\r\n 中断和串口操作实验 \r\n");
/*计数器清零 */
i = 0;
}
/* 延迟10ms*/
delay_ms(10);
}
}
四、编译并下载,观察实验现象
4.1 本实验采用仿真器为STLink V2,将仿真器与小车相连,注意正负极不要接反,如下图8所示。
图8 仿真器与下载线连接图
4.2 编译程序:点击如图9所示的编译按键。
图9 Keil5编译环境下的编译按键
当编译完成后,如果没有问题,Build Output栏会出现无错误、无警告的提示,如图10所示。
图10 编译通过后Build Output栏提示信息
4.3 下载程序:点击如图所示的下载按键,程序就会下载到STM32的芯片中。下载按键如下图11所示。
图11 Keil5编译环境下的下载按键
4.4 打开串口调试软件。设置波特率为9600打开串口接受数据,如图12所示
图12 串口调试助手显示的结果
【实验思考】
一、选择题
题目1:下面哪条语句是设置串口传输字长? (A)
A:USART_InitStructure.USART_WordLength = USART_WordLength_8b;
B:USART_InitStructure.USART_BaudRate = 9600;
C:USART_InitStructure.USART_Mode=USART_Mode_Rx| USART_Mode_Tx;
D:USART_InitStructure.USART_StopBits = USART_StopBits_1;
题目2:在串口配置时将波特率设置为9600,那么在串口助手中应该将波特率设置为多少?(A)
A:9600
B:115200
二、简答题
题目1:在选定串口引脚后,应该如何对引脚进行功能配置选择?
在UART4串口选择管脚后,Tx为发送端,输出引脚,而且现在GPIO是使用复用功能,所以要把它配置为复用推挽输出(GPIO_Mode_AF_PP),而Rx引脚为接收端,输入引脚,所以配置为浮空输入模式GPIO_Mode_IN_FLOATING。
附录:USART相关库函数