串口接收不到數據,串口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.pswp.cn/pingmian/72965.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72965.shtml
英文地址,請注明出處:http://en.pswp.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…