Ⅰ、概述
关于USART串口通信,可以说是MCU的标配。不管是在实际项目应用中,还是在开发过程中,它都起着很重要的作用。
在项目应用中我们常常使用UART串口进行通信,根据通信的距离及稳定性,还选择添加RS232、RS485等对UART数据进行转换。
在开发过程中,我们常常用它来打印调试信息,我们购买的开发板基本上都有一个UART通信接口(DB9的接头),这个接口主要的一个作用就是用来开发时调试使用。
本文主要针对STM32初学者,使用STM32F4标准外设库、Keil集成IDE,对STM32F4的USART进行配置及描述。1.详细描述使用自定义打印数据、自定义中断接收数据;2.重定义打印数据printf;
Ⅱ、实例工程下载
笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。
笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。
提供下载的软件工程是STM32F417的,但F4其他型号也适用(在工程中修改一下型号就行)。
360云盘下载地址:
https://yunpan.cn/cBQiZXDsvacwV访问密码 a98e
STM32F4资料:
https://yunpan.cn/cR2pxqF5x2d9c访问密码 53e7
Ⅲ、USART初始化描述
笔者以F4标准外设库(同时也建议初学者使用官方的标准外设库)为例来描述一下USART的初始化。
USART的初始化大致分三个部分:
1.USART时钟
该函数位于bsp.c文件下面;
重点注意:
A.USART时钟的配置要在USART其他配置(USART初始化、中断等)前面;
B.匹配对应时钟。
比如:RCC_APB2外设不要配置在RCC_APB1时钟里面
【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);这样能编译通过,但这是错误的代码】
2.USART引脚配置
该函数位于usart.c文件下面;
注意:
A.GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
引脚配置中,引脚功能复用的配置比较重要,很多从F1转型到F4的朋友往往会忽略掉这一点(F1中没有这个配置选项)。
B.GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF;
这里配置为复用模式。
3.USART参数配置
该函数位于usart.c文件下面;
A.USART波特率:
对于STM32来说,波特率可根据用户自定义,也就是数值随便用户设定(但需要主要范围和误差值)。
关键的一点:它不受系统使用的变化而受影响(这就是使用标准外设库的好处),也就是说它自适应系统时钟。
B.USART模式:
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
提供实例是收发模式都有,但提醒一下,有些朋友从一个地方拷贝代码自己的工程就要注意,如果你使用了接收的功能,拷贝过来的代码没有配置接收,那就有问题。【在实际开发中有人遇见过这类问题】
C.中断配置
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
中断功能也是在应用中比较常用的一个功能,特别是接收中断。如果使用的USART中断,这个函数就需要配置,发送中断不常见,如果没有发送中断的要求就不需要配置发送功能。
Ⅳ、USART重定义(打印数据)
相信来学习该文章知识的朋友(都应该学习过C语言知识)都应该知道打印数据printf这个函数。但是,很多初学者可能不理解怎样才能实现printf这种打印方式,其实只需要简单的两步步骤就能实现printf这个函数。这一节就是关于描述使用USART来重定义打印数据。
1.使用微库
project -> Options for Target -> Target窗口下勾选上”Use MircoLIB”使用微库。
由于printf函数是标准的函数,这里我们就直接使用标准的“微库”,而不自己设计该函数的功能。
2.重定义函数
#include
首先要包含头文件”stdio.h”, 提供的实例工程位于usart.h文件下面。
该函数位于usart.c文件下面;
我们使用printf函数,需要重定义fputc函数。
经过上面两步骤,我们就可以实现printf函数打印输出UART数据了。
Ⅴ、USART自定义(打印数据)
该函数位于usart.c文件下面;
我们自定义的打印函数功能就比较简单,计算字符串个数。
Ⅵ、USART中断接收
接收数据可以查询接收,也可以中断接收;查询的效率比较低,我们实例提供的是中断接收的方式,实现的效果的接收到一个数据,就将其发送出去。
中断接收需要配置几个地方:
1.使能中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
这个函数位于USART初始化里面,主要是使能USART中断。
2.配置NVIC
该函数位于bsp.c文件下面;
配置NVIC通道和优先级。
3.USART接收中断
该函数位于stm32f4xx_it.c文件下面;
主要是中断接收和处理,效果就是:有中断就发送接收的数据。