历史上的今天
返回首页

历史上的今天

今天是: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的初始化大致分三个部分:

 

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文件下面;

主要是中断接收和处理,效果就是:有中断就发送接收的数据。


推荐阅读

史海拾趣

安信可(Ai)公司的发展小趣事

在不断创新和突破的过程中,安信可不断推出具有创新性的产品。例如,公司推出的WiFi+BLE蓝牙二合一的Ai-WB1系列模组,凭借其高可靠度、高集成度、应用灵活、高性价比等特点,深受市场欢迎。这款产品不仅为智能设备提供了无线通信连接能力,还广泛应用于工业、商业、消费等各类市场,进一步拓展了安信可的应用领域。

Connect-Tech Products Corp公司的发展小趣事

随着国内市场的不断饱和,Connect-Tech Products Corp公司开始寻求海外市场的发展机会。公司通过参加国际电子展、建立海外销售网络等方式,积极开拓国际市场。同时,公司还与国际知名企业展开合作,共同研发新产品,进一步提升了公司的技术水平和市场影响力。这些举措不仅为公司带来了更广阔的市场空间,也为其未来的发展奠定了坚实基础。

Carlo Gavazzi公司的发展小趣事

随着技术的不断进步和市场需求的不断变化,Carlo Gavazzi公司始终保持着创新的活力。公司不断推出新产品,从最初的电气元件到后来的控制和自动化解决方案,再到能源管理和节能方案,产品线日益丰富。这种多元化的产品策略不仅满足了客户的多样化需求,也为公司带来了更广阔的市场空间。

Cadeka公司的发展小趣事

在竞争激烈的电子行业中,Cadeka公司为了增强自身实力,积极寻求并购与整合的机会。公司先后收购了几家具有技术优势和市场份额的小型电子企业,通过整合资源和技术,实现了优势互补和协同效应。这些并购不仅提升了Cadeka公司的技术实力和市场地位,还为公司带来了更多的发展机遇。

Herga公司的发展小趣事

进入21世纪后,Herga公司意识到全球化市场的重要性,开始实施积极的国际化战略。公司首先在欧洲市场建立了稳固的根据地,随后通过并购和合资等方式,逐步进入北美、亚洲等新兴市场。在这个过程中,Herga公司不仅提供了符合当地市场需求的产品和服务,还积极融入当地文化,建立了良好的品牌形象。这些努力使得Herga公司的全球市场份额逐年上升,成为国际电子行业中不可忽视的力量。

Eagle-Picher公司的发展小趣事

Eagle-Picher公司的历史可以追溯到1843年,最初是由Edgar和他的兄弟Stephen J. Conkling在俄亥俄州辛辛那提成立的,专注于生产商业涂料颜料。随着时间的推移,公司经历了多次转型和变革。1847年,Stephen离开公司后,Edgar引入了新的合伙人威廉·伍德,并更名为康克林木业公司。随后,公司在不同的业务领域内扩展,直到1922年,Eagle-Picher正式进入电池市场,开始了其电子行业的历程。

问答坊 | AI 解惑

51源程序代码及原理图

本帖最后由 paulhyde 于 2014-9-15 04:14 编辑 代码下载: 板上电路介绍: 1.USB下载电路,直接为S51,S52,ATMEAG8515,ATMEGA16(需要带转接板)下载程序 2.USB供电,无需另外再加电源.方便使用 3.留有电源接口,方便供电. 4.6个独立按键 5.引出串 ...…

查看全部问答>

无线数传模块

一款超远距离的433模块,发射功率500毫瓦,接收电流35个毫安,发射电流500个毫安,接收灵敏度-117dbm,传输距离2700到3000米,在工业控制有很好的效果。深圳安美通科技        QQ125344386…

查看全部问答>

wicne+2440功耗

我的平台是wince5.0+S3C2440,用锂电池供电,目前全速工作(400MHz)的时候电流竟然达到了400mA,其中LCD背光有100mA,我关闭了未用外设的CLOCK,板上无挂载大电流外设;请问除了关闭外设clock和设置IO之外还有什么办法降低功耗(正常模式);我看 ...…

查看全部问答>

232转485的一个小问题

   我现在手头有一个云台控制器,本来是可以在电脑上由232对云台进行控制。这个东西移交给我的时候就不可以用电脑控制了,但是在控制盒的里用手动按钮还是可以控制云台转动的。这说明问题出在电脑232出来到单片机获得数据之间的某个地方 ...…

查看全部问答>

在不使用DSP/BIOS的情况下,malloc这样的动态内存分配函数可用吗?

我觉得这种情况下内存完全由自己控制,所谓系统Stack和Heap什么的概念都应该不存在了吧。 我是新手,我看过几个例程,上边没有用到malloc之类的函数,如果没有了Stack和Heap的概念,那么函数调用时的现场保护该怎么办呢?…

查看全部问答>

关于存储转发数据包的疑难(与代码无关)

本人想做一个网络过滤软件,现在遇到一个问题。 接收的数据包专门存放在一个队列中,另一个线程专门循环处理这个队列中的数据包。 当处理数据包的线程处理完了队列中的所有数据包后,必须进入等待状态,否则空循环肯定将CPU100%。 本来用了KeWai ...…

查看全部问答>

ddk编译dll

请问,怎么用ddk编译dll文件,封装一定功能的函数给程序使用啊。…

查看全部问答>

QuartusII中的这个警告严重吗?应该如何处理?

Warning: Macrocell buffer inserted after node \"RW\",编译后除了这么个警告,不知道后果严不严重,请高手予以指点,谢谢大家!…

查看全部问答>

嵌入式软件开发行业为什么这么火

       未来随着“三网融合”不断提速,3G网络全面铺开,将带来更大的人才需求在未来相当长的时间内,嵌入式软件人才都将是企业争夺的目标。下面由卓跃教育为大家介绍。    嵌入式人才现状    嵌入式系统人才的匮 ...…

查看全部问答>

MSP430 UART 误码问题

现在用到MSP430F437的UART( 全双工,波特率 9600),发现有误码现象。比如程序中发送的是“AA”时,但是实际监控到的数据是“AC“。 外部晶振 32.768K 相关配置如下: FLL_CTL0 |= XCAP18PF; UCTL0 |= SWRST;       &n ...…

查看全部问答>