历史上的今天
今天是:2025年01月19日(星期日)
2021年01月19日 | STM32F4_USART配置及细节描述
2021-01-19 来源:eefocus
Ⅰ、概述
关于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的初始化大致分三个部分:

A.USART时钟的配置要在USART其他配置(USART初始化、中断等)前面;
B.匹配对应时钟。
比如:RCC_APB2外设不要配置在RCC_APB1时钟里面
【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);这样能编译通过,但这是错误的代码】

注意:
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中断,这个函数就需要配置,发送中断不常见,如果没有发送中断的要求就不需要配置发送功能。
相信来学习该文章知识的朋友(都应该学习过C语言知识)都应该知道打印数据printf这个函数。但是,很多初学者可能不理解怎样才能实现printf这种打印方式,其实只需要简单的两步步骤就能实现printf这个函数。这一节就是关于描述使用USART来重定义打印数据。
1.使用微库

project -> Options for Target -> Target窗口下勾选上”Use MircoLIB”使用微库。
由于printf函数是标准的函数,这里我们就直接使用标准的“微库”,而不自己设计该函数的功能。
2.重定义函数
#include 首先要包含头文件”stdio.h”, 提供的实例工程位于usart.h文件下面。 我们使用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文件下面; 主要是中断接收和处理,效果就是:有中断就发送接收的数据。



下一篇:STM32F4_引领入门
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 04:14 编辑 代码下载: 板上电路介绍: 1.USB下载电路,直接为S51,S52,ATMEAG8515,ATMEGA16(需要带转接板)下载程序 2.USB供电,无需另外再加电源.方便使用 3.留有电源接口,方便供电. 4.6个独立按键 5.引出串 ...… 查看全部问答> |
|
我的平台是wince5.0+S3C2440,用锂电池供电,目前全速工作(400MHz)的时候电流竟然达到了400mA,其中LCD背光有100mA,我关闭了未用外设的CLOCK,板上无挂载大电流外设;请问除了关闭外设clock和设置IO之外还有什么办法降低功耗(正常模式);我看 ...… 查看全部问答> |
|
我现在手头有一个云台控制器,本来是可以在电脑上由232对云台进行控制。这个东西移交给我的时候就不可以用电脑控制了,但是在控制盒的里用手动按钮还是可以控制云台转动的。这说明问题出在电脑232出来到单片机获得数据之间的某个地方 ...… 查看全部问答> |
|
在不使用DSP/BIOS的情况下,malloc这样的动态内存分配函数可用吗? 我觉得这种情况下内存完全由自己控制,所谓系统Stack和Heap什么的概念都应该不存在了吧。 我是新手,我看过几个例程,上边没有用到malloc之类的函数,如果没有了Stack和Heap的概念,那么函数调用时的现场保护该怎么办呢?… 查看全部问答> |
|
本人想做一个网络过滤软件,现在遇到一个问题。 接收的数据包专门存放在一个队列中,另一个线程专门循环处理这个队列中的数据包。 当处理数据包的线程处理完了队列中的所有数据包后,必须进入等待状态,否则空循环肯定将CPU100%。 本来用了KeWai ...… 查看全部问答> |
|
Warning: Macrocell buffer inserted after node \"RW\",编译后除了这么个警告,不知道后果严不严重,请高手予以指点,谢谢大家!… 查看全部问答> |
|
未来随着“三网融合”不断提速,3G网络全面铺开,将带来更大的人才需求在未来相当长的时间内,嵌入式软件人才都将是企业争夺的目标。下面由卓跃教育为大家介绍。 嵌入式人才现状 嵌入式系统人才的匮 ...… 查看全部问答> |
|
现在用到MSP430F437的UART( 全双工,波特率 9600),发现有误码现象。比如程序中发送的是“AA”时,但是实际监控到的数据是“AC“。 外部晶振 32.768K 相关配置如下: FLL_CTL0 |= XCAP18PF; UCTL0 |= SWRST; &n ...… 查看全部问答> |




