單片機 - STM32F103“復用功能重映射”完整解析:從JTAG釋放到TIM重映射實戰詳解

本文將詳細講解 STM32F103 系列中常見的“復用功能重映射”(Remap)機制,包括 JTAG 占用、引腳默認功能與復用功能的關系,以及如何通過寄存器或標準庫代碼實現重映射。以 TIM3 在 PB4/PB5 上輸出 PWM 為例,進行實戰講解,適合初學者與進階開發者參考

一、什么是“復用功能重映射”(Remap)

STM32 系列的引腳大多數都具有多種功能,比如既可以做普通 GPIO,也可以作為串口、定時器通道、SPI 等外設使用。

STM32F103 為例,有些引腳在芯片上電復位后默認配置為某些外設功能(主功能),而有些引腳默認不是該功能,但可以通過“功能重映射”將該功能映射過去。

功能重映射機制允許我們在引腳資源有限或外設沖突時,將某些外設的引腳重新映射到其他引腳組,從而獲得更大的靈活性。

二、判斷是否需要重映射的邏輯

在使用某個外設功能時,我們需要判斷是否可以直接使用,還是必須進行重映射。以下是準確的判斷邏輯:

1. 如果“主功能名 == 引腳名”

例如:

  • PA9USART1\_TX(默認功能)
  • PA10USART1\_RX(默認功能)

這類引腳默認即可作為對應外設使用,無需任何重映射設置。

2. 如果“主功能名 ≠ 引腳名”,但手冊中支持通過重映射映射到該引腳

例如:

  • PB4 默認是 JNTRST,但支持通過重映射成為 TIM3\_CH1

則必須開啟相應的重映射配置,才可以使用該外設功能。

3. 如果手冊中未提及該引腳支持該外設

說明該引腳不支持該功能,即便使用重映射也無法達到目的。

三、JTAG默認占用問題與引腳釋放

STM32F103 系列默認啟用了全功能 JTAG 調試接口,它會占用多個引腳:

引腳JTAG功能
PA13JTMS
PA14JTCK
PA15JTDI
PB3JTDO
PB4JNTRST

如果需要將 PB4 用作其他功能(如 TIM3\_CH1),必須首先禁用 JTAG 功能,否則該引腳將無法正常輸出或輸入信號。

禁用 JTAG(保留 SWD)標準庫寫法如下:

// 開啟 AFIO 外設時鐘,這是使用重映射的前提
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);// 禁用 JTAG,僅保留 SWD(兩線調試),釋放 PB3、PB4、PA15
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

這行代碼會釋放 PB3、PB4、PA15,使其恢復為普通可配置引腳。

四、重映射類型介紹(無重映射 / 部分重映射 / 完全重映射)

STM32F103 系列在設計時為部分外設功能預設了多種映射方式,主要分為以下三類:

1. 無重映射(No Remap)

使用默認引腳。例如 TIM3\_CH1 默認映射到 PA6,TIM3\_CH2 映射到 PA7。

2. 部分重映射(Partial Remap)

將部分通道映射到其他引腳,例如將 TIM3\_CH1 映射到 PB4TIM3\_CH2 映射到 PB5

標準庫代碼:

// 將 TIM3 的 CH1 和 CH2 通道映射到 PB4 和 PB5(部分重映射)
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

3. 完全重映射(Full Remap)

將所有通道映射到全新的引腳組,例如 TIM3 的所有通道映射到 PC6\~PC9

標準庫代碼:

// 將 TIM3 所有通道映射到 PC6-PC9(完全重映射)
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);

所有重映射配置都可在參考手冊(RM0008)第九章 AFIO 章節中查到。

五、實戰案例:TIM3PB4/PB5輸出PWM控制電機

背景:

在使用 L9110S 電機驅動模塊時,需要控制兩個引腳(如 PB4 和 PB5)輸出 PWM 信號,實現電機的正反轉與調速。但 PB4 默認是 JTAG 口的一部分,TIM3 默認也未映射到 PB4/PB5
在這里插入圖片描述

步驟如下:

1. 釋放 PB4 的 JTAG 占用:
// 使能 AFIO 外設的時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);// 禁用 JTAG,僅保留 SWD,釋放 PB4 用作普通引腳
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
2. 打開 TIM3 并進行部分重映射:
// 將 TIM3_CH1 和 TIM3_CH2 分別重映射到 PB4 和 PB5
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
3. 配置 GPIO 為復用推挽輸出:
GPIO_InitTypeDef GPIO_InitStructure;// 設置為復用推挽輸出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
// 設置 IO 輸出速度為最大 50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// 選擇引腳 PB4 和 PB5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
// 初始化 GPIOB 引腳
GPIO_Init(GPIOB, &GPIO_InitStructure);
4. 配置 TIM3 輸出 PWM 到 PB4/PB5:
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;// 打開 TIM3 的時鐘(APB1總線)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// 設置 PWM 的頻率:PWM_freq = 72MHz / (Prescaler+1) / (Period+1)
TIM_TimeBaseStructure.TIM_Period = 999;           // 自動重裝載值 ARR:1000 - 1
TIM_TimeBaseStructure.TIM_Prescaler = 71;         // 分頻系數:72MHz / (71+1) = 1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;      // 時鐘分頻因子,通常為0
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上計數模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);// 配置通道1(PB4)為 PWM 輸出
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;           // 設置為 PWM 模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能通道輸出
TIM_OCInitStructure.TIM_Pulse = 500;                         // 設置占空比為 50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   // 高電平有效
TIM_OC1Init(TIM3, &TIM_OCInitStructure);                     // 初始化 TIM3 的通道1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);            // 使能預裝載// 配置通道2(PB5)為 PWM 輸出
TIM_OCInitStructure.TIM_Pulse = 500;                         // 設置占空比
TIM_OC2Init(TIM3, &TIM_OCInitStructure);                     // 初始化 TIM3 的通道2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);            // 使能預裝載// 啟動 TIM3
TIM_Cmd(TIM3, ENABLE);

六、總結與建議

  • STM32F103 的外設引腳不能隨意指定,必須遵守 ST 提供的默認映射或預設重映射規則。
  • 若默認引腳被 JTAG 或其他功能占用,應先通過 GPIO_PinRemapConfig 釋放。
  • 想要使用非默認引腳的外設功能,必須啟用部分或完全重映射。
  • 所有外設的映射組合、支持的重映射模式,都可以在參考手冊第九章“AFIO”中查閱。

建議在項目初期就根據引腳分布圖和重映射選項合理規劃外設引腳,避免開發中途資源沖突。

如需延伸內容(如編碼器輸入、PWM測頻、雙路電機控制等),歡迎留言討論交流。


(完)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87027.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C語言】知識總結·內存函數

目錄 前言: 一、內存復制函數 1. memcpy - 內存塊復制 2. memmove - 內存塊移動 二、內存設置函數 1. memset - 內存塊填充 三、內存比較函數 1. memcmp 2.memchr 三內存分配函數 1 .malloc 2.free 總結: 注意事項: 前言&…

python+uniapp基于微信小程序面向品牌會員的在線商城系統

文章目錄 具體實現截圖本項目支持的技術路線源碼獲取詳細視頻演示:文章底部獲取博主聯系方式!!!!本系統開發思路進度安排及各階段主要任務java類核心代碼部分展示主要參考文獻:源碼獲取/詳細視頻演示 ##項目…

小魚fish系統 sudo apt update報錯(密鑰失效)

在使用小魚fish提供的系統鏡像文件,sudo apt update系統更新時遇到了以下報錯,即ROS 2 倉庫的 GPG 密鑰已過期,以及 Docker 倉庫使用了過時的密鑰存儲方式 fishrosfishros-linux:~$ sudo apt update 獲取:1 http://mirrors.tuna.tsinghua.ed…

深度優先搜索 (DFS) 詳解

1. 什么是深度優先搜索? 深度優先搜索(Depth-First Search, DFS)是一種用于遍歷或搜索樹或圖的算法。這個算法會盡可能深地搜索樹的分支。當節點v的所在邊都已被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進…

文心4.5開源大模型的使用和部署

前言 就在今天,文心4.5模型開源了,不是一個,而是整個系列模型正式開源。很突然,我都震驚了。文心4.5系列開源模型共10款,涵蓋了激活參數規模分別為47B 和3B 的混合專家(MoE)模型(最…

HarmonyOs開發之——TypeScript介紹、入門,及 TypeScript、JavaScript、ArkTs的具體區別解讀。

HarmonyOs開發之——TypeScript介紹、入門,及 TypeScript、JavaScript、ArkTs的具體區別解讀。 一、 開發語言介紹: TypeScript是JavaScript的超集,ArkTS則是TypeScript的超集。ArkTs是 HarmonyOs的主力開發語言,它在TypeScript…

《JMS事務性會話徹底解析:消息監聽中的 commit、rollback 和冪等設計》

大家好,我是G探險者! 📌 場景引入 在實際項目中,我們常常面臨以下挑戰: 監聽 MQ 消息失敗了,希望自動重試?消費 MQ 消息后,要寫數據庫,但中間報錯了?消息處…

vue3 el-table 列增加 自定義排序邏輯

在 Vue 3 中使用 Element Plus 的 <el-table> 組件時&#xff0c;如果你想增加自定義排序邏輯&#xff0c;可以通過以下幾個步驟實現&#xff1a; 1. 使用 default-sort 屬性 首先&#xff0c;你可以在 <el-table> 組件上使用 default-sort 屬性來指定默認的排序…

ISP Pipeline(7): Gamma Correction 伽馬校正

AI_Plays/ISP/Fast_ISP_Progress.ipynb at main ameengee/AI_Plays GitHub Gamma Correction&#xff08;伽馬校正&#xff09;是圖像處理中的一個重要步驟&#xff0c;目的是調整圖像的亮度&#xff0c;使其更符合人眼的感知或顯示設備的特性。 為什么需要 Gamma Correcti…

AI提取伴奏,實現卡拉OK效果 —— 「suno api/luno api/kuka api」

導讀 喜歡唱歌&#xff0c;卻總苦于找不到純凈的伴奏&#xff1f;或者你想把喜歡的歌曲翻唱一遍&#xff0c;卻被人聲干擾搞得頭大&#xff1f;現在&#xff0c;AI技術已經悄悄解決了這個問題。借助AI智能工具&#xff0c;你可以輕松提取任何一首歌的伴奏&#xff0c;享受宛如…

pip介紹

pip是什么&#xff1f; pip&#xff08;Pip Installs Packages&#xff09;是Python的官方管理工具&#xff0c;用于安裝、升級、卸載和管理Python第三方庫及其依賴關系。它是Python生態系統的核心組件&#xff0c;通過連接PyPI&#xff08;Python Package Index&#xff09;這…

機器學習20-線性網絡思考

機器學習20-線性網絡思考 針對線性網絡的基礎問題&#xff0c;使用基礎示例進行解釋 1-核心知識點 1-線性模型家族的線性回歸和邏輯回歸分別是什么&#xff0c;線性模型家族還有沒有其他的模型 線性模型家族是一系列基于線性假設的統計模型&#xff0c;它們假設因變量和自變量…

【科研繪圖系列】R語言繪制世界地圖分布(world map)

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹加載R包數據下載導入數據數據預處理準備畫圖畫圖總結系統信息介紹 本教程旨在通過R語言及其相關地理空間分析包,展示如何對環境數據進行空間聚類分析,并將結果可視化。教程從讀…

Armbian 25.5.1 Noble Gnome 開啟遠程桌面功能

sudo apt install gnome-remote-desktop ----長話短說 故障表現 Ubuntu 25版本點擊遠程桌面功能沒有任何反應, WIN_20250630_00_53_24_Pro 最后 armbian 官方社區充滿了傲慢,一言不合就關閉話題,問題都沒有解決就給我關閉了 最后檢索到英文網站,說到了這么一句話,檢查遠程桌…

嵌入式 Linux 入門:從裸機到系統級開發的第一步

隨著嵌入式系統應用的不斷深入&#xff0c;很多 MCU 項目開發者會在某個階段遇到瓶頸&#xff1a;系統越來越復雜、任務越來越多、通信越來越頻繁、性能要求越來越高。 這時候&#xff0c;從 MCU / RTOS 過渡到 嵌入式 Linux 開發 就成為一次技術升級的關鍵轉折點。 本文將帶…

詳解 Blazor 組件傳值

父子組件傳值 在 Blazor 中&#xff0c;組件之間的通信可以通過 [Parameter] 參數和 EventCallback<T> 事件回調實現。下面分別給出 父組件傳遞值給子組件 和 子組件傳遞值給父組件 的簡單示例。 1.1 父組件傳遞值給子組件 步驟&#xff1a; 在子組件中定義 public 屬…

力扣熱題100再刷

160.相交鏈表 讀一遍A&#xff0c;一個set存節點&#xff0c;遍歷B的時候判斷即可。復習下set的STL&#xff1a;set有set和unordered_set&#xff0c;同樣有insert&#xff0c;find&#xff0c;count&#xff0c;對于set而言&#xff0c;自動從小到大排序&#xff0c;還有&…

MySQL常用函數性能優化及索引影響分析

MySQL 常用函數性能優化指南&#xff08;含索引影響分析&#xff09; 以下是 MySQL 函數使用指南&#xff0c;新增性能影響評級、索引失效分析和優化方案&#xff0c;幫助您高效使用函數&#xff1a; &#x1f4dc; 一、字符串處理函數&#xff08;含性能分析&#xff09; 函…

莫隊(基礎版)優雅的暴力

莫隊算法是一種離線算法&#xff0c;常用于高效處理區間查詢問題。它通過合理排序和移動左右端點來減少時間復雜度。 基本思想 莫隊算法的核心思想是將所有查詢離線排序&#xff01;&#xff01;&#xff08;找出一個過起來最快的查詢順序&#xff09;&#xff0c;然后通過移動…

? Python 高級定制 | 美化 Word 表格邊框與樣式(收貨記錄增強版)

之前我們完成了 Excel 數據提取、Word 表格寫入與合并&#xff0c;現在繼續 為 Word 表格添加高級樣式 裝扮&#xff0c;包括單元格邊框、背景填色、居中對齊、粗體、高亮行/列等&#xff0c;進一步增強表格的可讀性與專業性。 &#x1f58c;? 樣式設置函數 1. 設置單元格邊框…