STM32 TIM_SelectInputTrigger()函數

一、函數功能與定位?

TIM_SelectInputTrigger()是STM32定時器外設的關鍵配置函數,用于設置從模式定時器的觸發源(Trigger Source)?。其核心作用是將定時器的內部事件或外部信號映射為觸發信號(TRGI),進而控制從定時器的計數行為(如啟動/停止/復位等)。該函數屬于STM32標準外設庫(SPL)或HAL庫的底層配置接口。


?二、函數原型與參數解析?

?1. 函數原型?
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
  • ?TIMx:目標定時器指針(如TIM1TIM3)。
  • ?TIM_InputTriggerSource?:觸發源類型,可選值見下表:
?觸發源類型??功能描述?
TIM_TS_ITR0?~?ITR3內部觸發源,用于定時器級聯(如TIM2觸發TIM3)
TIM_TS_TI1F_EDTI1引腳邊沿檢測器(上升沿+下降沿)
TIM_TS_TI1FP1通道1濾波后輸入信號(TI1FP1),可配置單邊沿
TIM_TS_TI2FP2通道2濾波后輸入信號(TI2FP2)
TIM_TS_ETRF外部觸發輸入(ETR引腳信號)
?2. 參數選擇規則?
  • ?內部觸發(ITRx)??:用于定時器同步(如TIM1更新事件觸發TIM2計數)。
    ?連接規則?:
    • ITR0:TIM1 → TIM2
    • ITR1:TIM1 → TIM3
    • ITR2:TIM1 → TIM4
    • (具體映射需查芯片參考手冊)
  • ?外部引腳觸發?:需結合GPIO配置:
    • TI1FP1/TI2FP2需初始化對應通道引腳(如TIM3_CH1對應PA6)。
    • ETRF需使能ETR引腳(如TIM1_ETR對應PA12)。

?三、底層機制:觸發源與從模式的協同?

?1. 從模式控制器(Slave Mode Controller)??

觸發源信號(TRGI)輸入至定時器的從模式控制器,通過配置從模式(Slave Mode)?? 決定響應行為:

?從模式??功能??典型應用?
TIM_SlaveMode_Reset觸發時復位計數器CNT信號周期測量
TIM_SlaveMode_Gated觸發信號高電平時計數脈沖寬度測量
TIM_SlaveMode_Trigger觸發信號作為計數器時鐘外部時鐘同步
TIM_SlaveMode_External1ETR引腳上升沿計數編碼器接口
?2. 協同配置流程?
// 步驟1:選擇觸發源
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);  // 使用TIM3_CH1的濾波信號// 步驟2:設置從模式行為
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // 上升沿復位CNT

?四、典型應用場景與代碼實現?

?場景1:精確頻率測量(復位模式)??

?原理?:信號上升沿觸發CNT復位,CCR直接存儲周期計數值,無需計算差值。
?配置代碼?:

void TIM3_FreqMeasurement_Init(void) 
{// 時基配置(1MHz計數頻率)TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;TIM_TimeBaseStruct.TIM_Period = 0xFFFF;TIM_TimeBaseStruct.TIM_Prescaler = 72 - 1;  // 72MHz/72 = 1MHzTIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct);// 輸入捕獲(通道1,上升沿)TIM_ICInitTypeDef TIM_ICStruct;TIM_ICStruct.TIM_Channel = TIM_Channel_1;TIM_ICStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;TIM_ICStruct.TIM_ICFilter = 0x0;  // 無濾波TIM_ICInit(TIM3, &TIM_ICStruct);// 關鍵配置:觸發源+從模式TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);TIM_Cmd(TIM3, ENABLE);
}// 讀取頻率(單位:Hz)
float Get_Signal_Frequency(void) {uint16_t capture = TIM_GetCapture1(TIM3);return 1000000.0f / capture;  // 1MHz時鐘 → 周期 = capture μs
}

?優勢?:避免手動計算current_capture - last_capture,消除計數器溢出風險。


?場景2:定時器級聯(內部觸發)??

?原理?:主定時器更新事件觸發從定時器計數,擴展定時范圍。
?配置代碼?:

// TIM2為主,TIM3為從
void TIM2_Master_TIM3_Slave_Init(void) 
{// TIM2配置(輸出觸發信號)TIM_TimeBaseInit(TIM2, ...);TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);  // 更新事件觸發TRGO// TIM3配置(從模式)TIM_TimeBaseInit(TIM3, ...);TIM_SelectInputTrigger(TIM3, TIM_TS_ITR2);  // TIM2→TIM3的觸發源為ITR2TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);  // TRGI作為時鐘
}

?效果?:TIM3的計數器在TIM2每次更新時遞增,實現32位定時器擴展。


?場景3:PWM輸入模式(雙通道捕獲)??

?原理?:單信號同時觸發兩個通道,分別捕獲周期(CCR1)和占空比(CCR2)。
?配置代碼?:

void TIM3_PWMI_Init(void) 
{// 時基配置(略)// 通道1:上升沿捕獲周期(直連)TIM_ICInitTypeDef IC1 = {TIM_Channel_1, TIM_ICPolarity_Rising, TIM_ICSelection_DirectTI};TIM_ICInit(TIM3, &IC1);// 通道2:下降沿捕獲占空比(交叉)TIM_ICInitTypeDef IC2 = {TIM_Channel_2, TIM_ICPolarity_Falling, TIM_ICSelection_IndirectTI};TIM_ICInit(TIM3, &IC2);// 復位模式觸發源(TI1FP1)TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
}// 計算占空比
uint8_t Get_PWM_Duty(void) 
{uint16_t period = TIM_GetCapture1(TIM3);  // 周期值uint16_t pulse = TIM_GetCapture2(TIM3);   // 高電平時間return (pulse * 100) / period;            // 占空比%
}

?五、高級技巧與注意事項?

?1. 濾波器配置優化?
  • ?作用?:抑制信號抖動(如按鍵抖動、噪聲)。
  • ?配置?:TIM_ICInitTypeDef.TIM_ICFilter(0x0~0xF),值越大濾波效果越強。
    TIM_ICStruct.TIM_ICFilter = 0x0F;  // 最大濾波(16個時鐘事件)
?2. 通道與觸發源限制?
  • ?通道依賴性?:
    • TI1FP1僅支持通道1,TI2FP2僅支持通道2。
    • 通道3/4不支持自動復位模式(需中斷手動清零CNT)。
  • ?ETR引腳復用?:需開啟AFIO時鐘并重映射。
?3. 中斷協同?

盡管從模式可硬件自動運行,但結合中斷可提高實時性:

// 使能更新中斷
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
NVIC_EnableIRQ(TIM3_IRQn);// 中斷服務函數
void TIM3_IRQHandler(void) 
{if (TIM_GetITStatus(TIM3, TIM_IT_Update)) {// 處理捕獲完成事件(如計算頻率)TIM_ClearITPendingBit(TIM3, TIM_IT_Update);}
}

?六、常見問題解答(FAQ)??

  1. ?Q:一個定時器能否同時使用多個觸發源???
    A:否,一次只能選擇一個觸發源,但可通過分時復用或組合模式實現復雜功能。

  2. ?Q:觸發源配置后無響應???
    A:檢查步驟:

    • GPIO是否正確初始化為復用功能
    • 從模式是否使能(TIM_SelectSlaveMode
    • 濾波器是否過度抑制信號
  3. ?Q:如何測量非周期性信號???
    A:改用普通輸入捕獲模式(手動記錄兩次捕獲值差值)。

  4. ?Q:ETR觸發時計數器不遞增???
    A:確認從模式設置為TIM_SlaveMode_External1


?七、總結?

TIM_SelectInputTrigger()是STM32定時器主從模式的核心配置函數,通過靈活選擇內部事件外部信號作為觸發源,配合復位/門控/觸發等從模式,可顯著優化信號測量、定時器同步等應用的效率和精度。其關鍵優勢在于硬件自動處理計數邏輯,減輕CPU負擔并提升系統可靠性。實際開發中需注意通道與觸發源的匹配關系、濾波器配置及中斷協同策略。

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

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

相關文章

Lecture 6 Kernels, Triton 課程筆記

本講座:基準測試/分析 編寫內核 總結 編程模型(PyTorch、Triton、PTX)與硬件之間的差距 > 性能奧秘 理解擴展的基準測試 用于理解 PyTorch 函數內部結構的分析(用內核觸底) 看 PTX 匯編,了解 CUDA 內核…

Spring Boot 整合網易163郵箱發送郵件實現找回密碼功能

在開發用戶系統時,發送郵件是一項常見需求,例如用戶忘記密碼時,通過郵箱發送驗證碼來驗證身份并重置密碼。本文將結合 Spring Boot 和 163 郵箱,演示如何實現郵件發送功能。 一、前提條件 普通用戶的 163 郵箱可以在 Spring Boot…

如何在mac玩windows游戲?3個工具推薦,不用換電腦!

Mac電腦雖然很流暢,但它也存在局限性,其中一點游戲玩家應該深有體會,那就是無法直接玩Windows專屬游戲,只能對著琳瑯滿目的游戲望眼欲穿。別急,我有辦法讓你在mac玩windows游戲,下面就來分享我的經驗。一、…

自回歸(Auto-Regressive, AR),自回歸圖像生成過程

根據論文中“**T2I Generation via Next-Token Prediction**”一節,自回歸(Auto-Regressive, AR)文本到圖像(T2I)模型的圖像生成過程可分為三個主要步驟,其原理和損失函數如下:---### &#x1f…

在mysql中,modify ,change ,rename to的作用是什么

在 MySQL 中,MODIFY、CHANGE 和 RENAME TO 都是 ALTER TABLE 語句的一部分,用于修改表的結構,但它們的作用和使用場景有所不同。1. MODIFY作用:用于修改表中現有列的定義,但不能修改列名。你可以使用 MODIFY 來更改列的…

【JVM】JVM的內存結構是怎樣的?

JVM的內存結構是Java程序運行時內存管理的核心,不同區域有明確的職責。 一、整體劃分 包括兩大部分,分為線程私有區域(隨線程創建/銷毀,無需垃圾回收)和線程共享區域(所有線程共用,需要垃圾回收管理)。 線程私有區域:程…

青少年軟件編程(python五級)等級考試試卷-客觀題(2023年12月)

更多內容和歷年真題請查看網站:【試卷中心 -----> 電子學會 ----> 機器人技術 ----> 五級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 青少年軟件編程(python五級)等級考試試卷-客觀題(2023年12月&#xff0…

網絡編程-創建TCP協議服務器

int socket(int domain, int type, int protocol);頭文件&#xff1a; #include <sys/socket.h>#include <netinet/in.h> #include <netinet/ip.h>int skt_tcpfd;int domain;skt_tcpfdsocket(AF_INET,SOCK_STREAM,0);int bind(int sockfd, const struct soc…

ruoyi框架角色分配用戶

分配用戶&#xff0c;不要將當前正在登錄的用戶綁定。否則&#xff0c;在加入當前用戶之后&#xff0c;取消或者添加其他用戶時會被注銷當前登錄。

Java Stream常見函數與應用案例

1. Java Stream核心概念與基礎函數 1.1 Stream API的設計哲學與核心特性 Java Stream API的設計哲學源于函數式編程范式&#xff0c;其核心特性體現在數據處理模式的轉變上。與傳統集合操作相比&#xff0c;Stream API采用聲明式編程風格&#xff0c;支持鏈式調用&#xff0c;顯…

【Canvas與徽章】中國制造金色玻璃光徽章

【成圖】【代碼】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>中國制造金色玻璃光徽章 Draft1</title><style type"tex…

終結系統裸奔:Debian老舊版本安全加固終極指南

核心警示:Debian 8與10已結束官方支持,暴露于0day漏洞風險中。本文提供的加固方案僅為遷移前的臨時防護措施,非長久之計。 一、老舊Debian系統的致命隱患 支持狀態: Debian 8(Jessie):2018年終止安全更新 Debian 10(Buster):2024年7月結束主流支持 風險清單: 無補…

Ape.Volo項目源碼學習(1:源碼下載及運行)

Ape.Volo項目是基于 .Net 8 、SqlSugar、Vue2.x、RBAC、前后端分離開箱則用的中后臺快速開發框架&#xff0c;其使用Async/Await異步編程&#xff0c;支持CodeFirst模式、RabbitMQ/RedisMQ消息隊列、CORS 跨域配置、數據庫操作&#xff08;讀寫分離、多庫、分表&#xff09;、支…

2-4.Python 編碼基礎 - 流程控制(判斷語句、循環語句、break 語句與 continue 語句)

一、判斷語句 1、if 語句 &#xff08;1&#xff09;基本格式 if 【判斷條件】:【滿足條件時執行的代碼塊】&#xff08;2&#xff09;演示 number 10if number > 0:print("這個數是正數")# 輸出結果這個數是正數2、if - else 語句 &#xff08;1&#xff09;基本…

大模型自我進化框架SE-Agent:開啟軟件工程自動化新時代

一、引言&#xff1a;當大模型學會“自我進化” 在軟件開發領域&#xff0c;傳統模式下人類工程師面對復雜任務時&#xff0c;往往需要經歷反復調試、多輪迭代才能產出高質量代碼。而隨著大語言模型&#xff08;LLM&#xff09;的興起&#xff0c;一種名為**SE-Agent&#xff…

UE官方文檔學習 C++ TAarry 查詢(四)多種查詢方式

一.IndexofByKey 返回索引通過值&#xff0c;返回來查找鍵。二IndexOfByPredicate通過定義二元謂詞&#xff0c;來判定是否有符合謂詞判定的元素。符合條件True的&#xff0c;才返回Index。這里所謂Lamda,函數就是 把函數當作參數輸入&#xff0c;里面的參數值傳遞前加個[]。這…

根據Wireshark捕獲數據包時間和長度繪制電腦發射信號波形

下一期&#xff1a; 根據Wireshark捕獲數據包時間和長度繪制路由器發送給電腦數據的信號波形-CSDN博客 一、Wireshark采集數據 數據格式&#xff1a; 在我的另一篇博客中詳細介紹了怎么導出數據&#xff1a; Wireshark導出數據包時間和長度-CSDN博客 通過MATLAB加載數據&a…

Suno API 接入指南:快速上手與高效集成

隨著 AI 技術的發展&#xff0c;音樂生成已經逐漸成為開發者和創作者探索的新方向。Suno API 提供了一套簡潔的接口&#xff0c;讓我們能夠通過代碼快速生成音樂、歌詞&#xff0c;甚至旋律。本文將帶你從零開始&#xff0c;完成 Suno API 的接入與調用&#xff0c;并分享一些高…

React Hooks原理深潛:從「黑魔法」到「可觀測」的蛻變之旅

文章目錄【技術棧深潛計劃】React Hooks原理深潛&#xff1a;從「黑魔法」到「可觀測」的蛻變之旅一、引言&#xff1a;為什么我們需要“深潛”Hooks&#xff1f;二、基石&#xff1a;沒有JavaScript閉包&#xff0c;就沒有Hooks2.1 閉包的精簡回顧2.2 Hooks與閉包的關聯三、核…

MySql知識梳理之DDL語句

例子&#xff1a;為emp表增加一個新的字段”昵稱”為nickname&#xff0c;類型為varchar(20)alter table emp add nickname varchar(20) comment 昵稱;例子&#xff1a;將emp表的nickname字段修改為username&#xff0c;類型為varchar(30)ALTER TABLE emp CHANGE nickname us…