串口接收不到数据,串口RX配置(f407),f103和f407的区别

问题

芯片:STM32F407,软件:标准库

使用串口时,直接把之前STM32F103的串口配置移植过来,同样以串口4为例,代码如下:

STM32F103 UART4:

void UART4_Configuration(uint32_t BaudRate)
{USART_InitTypeDef USART_InitStructure;GPIO_InitTypeDef  GPIO_InitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //配置端口的TXGPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);//配置端口的RXGPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOC, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = BaudRate;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); //Enables UART4 Receive Data register not empty interruptUSART_ITConfig(UART4,USART_IT_RXNE,ENABLE);//Enables UART4USART_Cmd(UART4,ENABLE);      
}

STM32F407 UART4(错误):


void UART4_Init(uint32_t BaudRate)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC);RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_UART4);GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_UART4);//UART4_TX	  PC10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);
//UART4_RX    PC11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOC, &GPIO_InitStructure);  USART_InitStructure.USART_BaudRate = BaudRate;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_ITConfig(UART4, USART_IT_RXNE, ENABLE); //Enable rx enable, /* Configure the USARTx */ USART_Init(UART4, &USART_InitStructure);/* Enable the USARTx */USART_Cmd(UART4, ENABLE);
}

问题来了,同样的配置,在F103中串口的收发都是正常的。但在F407中,串口就死活接收不到数据。为啥嘞?

解决

仔细检查代码发现:时钟使能,串口参数配置都没有问题,
那问题应该出现在引脚配置上。
果然! 是UART4_RX的配置出了问题,没有开启AF功能。

STM32F407 UART4(正确):


void UART4_Init(uint32_t BaudRate)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC);RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_UART4);GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_UART4);//UART4_TX	  PC10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);
//UART4_RX    PC11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOC, &GPIO_InitStructure);  USART_InitStructure.USART_BaudRate = BaudRate;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_ITConfig(UART4, USART_IT_RXNE, ENABLE); //Enable rx enable, /* Configure the USARTx */ USART_Init(UART4, &USART_InitStructure);/* Enable the USARTx */USART_Cmd(UART4, ENABLE);
}

补充

那F103和F407关于串口的配置有什么区别呢?大概研究了一下,主要有两点区别:
1,AF(Alternate Function)映射

F103:有 AFIO 模块,需要使能 AFIO 时钟(RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);),且很多复用操作通过 AFIO 实现。

F407:F4 系列没有独立的 AFIO 模块(外设复用通过独立的 GPIO_PinAFConfig 函数配置),所以不需要使能 AFIO 时钟。

2,GPIO配置

F103中,UART_RX只需要配置为GPIO_Mode_IN即可,AF功能在很多情况下默认已经匹配。

而F407中,UART_RX必须明确配置为GPIO_Mode_AF,并且还需要调用GPIO_PinAFConfig()函数来指定该引脚的具体复用功能,否则UART模块与引脚之间并没有正确关联。

初次使用F407串口时容易遇到的一个小bug,还是挺折磨人的。
如果对您有所帮助,麻烦点赞分享,这对我非常重要,感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/72965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅分析 PE3R 感知高效的三维重建

"近期,二维到三维感知技术的进步显著提升了对二维图像中三维场景的理解能力。然而,现有方法面临诸多关键挑战,包括跨场景泛化能力有限、感知精度欠佳以及重建速度缓慢。为克服这些局限,我们提出了感知高效三维重建框架&#…

存算一体与存算分离:架构设计的深度解析与实现方案

随着数据量的不断增大和对计算能力的需求日益提高,存算一体作为一种新型架构设计理念,在大数据处理、云计算和人工智能等领域正逐步引起广泛关注。在深入探讨存算一体之前,我们需要先了解存储和计算的基本概念,以及存算分离和存算…

汇编与反汇编:DEBUG 命令使用指南

前言 汇编语言是计算机底层编程语言,直接与 CPU 指令集对应。掌握汇编语言和调试工具(如DEBUG)是深入理解计算机工作原理的关键。本文将介绍汇编与反汇编的基本概念,并详细讲解如何使用 DEBUG 命令进行调试和内存操作。 目录 一、…

数据分析的12个挑战及其解决方法

俗话说得好“说起来容易做起来难。”数据分析对于风险管理者是极为重要的。我们可以利用数据分析结论,来为企业决策做有效协助,帮助企业改善财务状况,提升企业业务销售水平,帮助员工预测可能发生的问题,并协助监控企业…

栈/堆/static/虚表

在 C 里&#xff0c;栈空间主要用来存放局部变量、函数调用信息等。下面为你介绍栈空间在 C 里的运用方式。 1. 局部变量的使用 在函数内部定义的变量会被存于栈空间&#xff0c;当函数执行结束&#xff0c;这些变量会自动被销毁。 #include <iostream>void exampleFu…

Vue keepalive学习用法

在Vue中&#xff0c;<keep-alive>的include属性用于指定需要缓存的组件&#xff0c;其实现方式如下&#xff1a; 1. 基本用法 • 字符串形式&#xff1a;通过逗号分隔组件名称&#xff0c;匹配到的组件会被缓存。 <keep-alive include"ComponentA,ComponentB&…

搭建个人博客教程(Hexo)

如何快速搭建一套本地的博客系统呢&#xff1f;这里有一套gitNode.jsHexo的部署方案来进行解决。 安装git Git 是一款免费开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年为 Linux 内核开发设计。它通过本地仓库和远程仓库实现代码管理&#xff0c;支持分支…

手撕算法之`vector` 扩容、`string` 分割、链表翻转

手写常见操作:vector 扩容、string 分割、链表翻转 (一)vector扩容 在 C++ 中,vector 的扩容机制是动态数组实现的核心特性,直接关系到性能和内存使用效率。以下是深入剖析: 1. 扩容触发条件 vector<int> v; v.push_back(1); // 当 size() == capacity() 时触发…

鸿蒙NEXT开发问题大全(不断更新中.....)

目录 问题1&#xff1a;鸿蒙NEXT获取华为手机的udid ​问题2&#xff1a;[Fail]ExecuteCommand need connect-key? 问题3&#xff1a;测试时如何安装app包 问题1&#xff1a;鸿蒙NEXT开发获取华为手机的udid hdc -t "设备的序列号" shell bm get --udid 问题2&…

LiteratureReading:[2016] Enriching Word Vectors with Subword Information

文章目录 一、文献简明&#xff08;zero&#xff09;二、快速预览&#xff08;first&#xff09;1、标题分析2、作者介绍3、引用数4、摘要分析&#xff08;1&#xff09;翻译&#xff08;2&#xff09;分析 5、总结分析&#xff08;1&#xff09;翻译&#xff08;2&#xff09;…

ZMC600E,多核异构如何成就机器人精准控制?

ZMC600E主站控制器凭借其多核异构处理器的强大性能&#xff0c;实现了高算力与高实时性的完美平衡&#xff0c;让机器人动作流畅、精准无误。接下来&#xff0c;让我们深入了解其内核结构的奥秘。 在ZMC600E主站控制器控制机器人的时候&#xff0c;可以精准的控制机器人执行各种…

一文掌握 PostgreSQL 的各种指令(PostgreSQL指令备忘)

引言 PostgreSQL 作为一款功能强大、开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其高扩展性、SQL 标准兼容性以及丰富的功能特性&#xff0c;成为企业级应用的首选数据库之一。无论是开发、运维还是数据分析&#xff0c;掌握 PostgreSQL 的核心指…

fastadmin后台管理员日志指定方法不记录

做的订单提醒,只要在线会把日志自动存储进去,这个又是每30s执行一次,数据库没多久就爆掉了,最终找到一个处理方法,可能不是最好的,仅供大家参考 具体位置: application/admin/model/AdminLog.php里面的$ignoreRegex方法 protected static $ignoreRegex [/^(.*)\/(selectpage…

Redis Sentinel(哨兵模式)高可用性解决方案

一、概述 Redis Sentinel&#xff08;哨兵模式&#xff09;是Redis的高可用性&#xff08;High Availability, HA&#xff09;解决方案&#xff0c;它通过哨兵系统和Redis实例的协同工作&#xff0c;确保了Redis服务的高可用性和数据的持久性。哨兵系统由一个或多个哨兵进程组…

密码学(Public-Key Cryptography and Discrete Logarithms)

Public-Key Cryptography and Discrete Logarithms Discrete Logarithm 核心概念&#xff1a;离散对数是密码学中一个重要的数学问题&#xff0c;特别是在有限域和循环群中。它基于指数运算在某些群中是单向函数这一特性。也就是说&#xff0c;给定一个群 G G G和一个生成元 …

tcp 通信在wifi 下会出现内容错误吗?

TCP通信在WiFi下可能会出现内容错误。TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。在WiFi环境下&#xff0c;由于信号干扰、信号衰减、多径传播等因素&#xff0c;可能会造成数据…

JVM OOM问题如何排查和解决

在 Java 开发中&#xff0c;JVM OOM&#xff08;OutOfMemoryError&#xff09;问题通常是指程序运行时&#xff0c;JVM 无法为对象分配足够的内存空间&#xff0c;导致发生内存溢出的错误。这个问题往往和内存的配置、内存泄漏、或者资源过度使用等因素有关。 1. OOM 错误类型…

深入解析音频编解码器(Audio CODEC):硬件、接口与驱动开发

音频编解码器&#xff08;Audio CODEC&#xff09;是音频处理系统中的核心组件&#xff0c;负责 模拟信号与数字信号的相互转换&#xff0c;广泛应用于 智能音箱、嵌入式系统、消费电子产品 等设备。本篇文章将从 硬件结构、接口解析、驱动开发 和 软件配置 等方面&#xff0c;…

【QGIS_Python】在QGIS的Python控制台生成SHP格式点数据并显示标注

参考文章&#xff1a; 「GIS教程」使用DeepSeek辅助QGIS快速制图 | 麻辣GIS 示例代码说明&#xff1a;使用参考文章中的省会城市坐标点&#xff0c;左侧增加一列城市序号code, 图层标注显示 code 城市名称&#xff0c;同时在指定路径下生成对应SHP格式点数据。 import os fr…

deepSpeed多机多卡训练服务器之间,和服务器内两个GPU是怎么通信

DeepSpeed 在多机多卡训练时,主要依赖 NCCL 和 PyTorch Distributed 进行通信。具体来说,分为服务器之间和服务器内两种情况: 1. 服务器之间的通信(跨节点通信) DeepSpeed 采用 NCCL(NVIDIA Collective Communications Library)作为主要的通信后端,结合 PyTorch Distr…