日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【STM32】输入捕获程序

發布時間:2024/4/24 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STM32】输入捕获程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 概述
    • 02. 硬件設計
    • 03. 寄存器概述
    • 04. 配置步驟
    • 05. 程序示例
    • 06. 附錄
    • 07. 聲明

01. 概述

輸入捕獲模式可以用來測量脈沖寬度或者測量頻率。我們以測量脈寬為例,用一個簡圖來說明輸入捕獲的原理。

如圖所示,就是輸入捕獲測量高電平脈寬的原理,假定定時器工作在向上計數模式,圖中 t1~t2 時間,就是我們需要測量的高電平時間。測量方法如下:首先設置定時器通道 x 為上升沿捕獲,這樣,t1 時刻,就會捕獲到當前的 CNT 值,然后立即清零 CNT,并設置通道 x為下降沿捕獲,這樣到 t2 時刻,又會發生捕獲事件,得到此時的 CNT 值,記為 CCRx2。這樣,根據定時器的計數頻率,我們就可以算出t1~t2 的時間,從而得到高電平脈寬。

在 t1~t2 之間,可能產生 N 次定時器溢出,這就要求我們對定時器溢出,做處理,防止高電平太長,導致數據不準確。如圖15.1.1所示,t1~t2之間,CNT計數的次數等于:N*ARR+CCRx2,有了這個計數次數,再乘以 CNT 的計數周期,即可得到 t2-t1 的時間長度,即高電平持續時間。

STM32F4 的定時器,除了 TIM6 和 TIM7,其他定時器都有輸入捕獲功能。STM32F4 的輸入捕獲,簡單的說就是通過檢測 TIMx_CHx 上的邊沿信號,在邊沿信號發生跳變(比如上升沿/下降沿)的時候,將當前定時器的值(TIMx_CNT)存放到對應的通道的捕獲/比較寄存器(TIMx_CCRx)里面,完成一次捕獲。同時還可以配置捕獲時是否觸發中斷/DMA 等。

02. 硬件設計

本實驗用到的硬件資源有:
1) 指示燈 DS0
2) KEY_UP 按鍵
3) 串口
4) 定時器 TIM3
5) 定時器 TIM5
我們將捕獲 TIM5_CH1(PA0)上的高電平脈寬,通過 KEY_UP 按鍵輸入高電平,并從串口打印高電平脈寬。

03. 寄存器概述

我們介紹我們本章需要用到的一些寄存器配置,需要用到的寄存器有:TIMx_ARR、TIMx_PSC、TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1 這些寄存器在前面全部都有提到(這里的 x=5),我們這里就不再全部羅列了,我們這里針對性的介紹這幾個寄存器的配置。

TIMx_ARR 和 TIMx_PSC,這兩個寄存器用來設自動重裝載值和 TIMx 的時鐘分頻。

TIMx 捕獲/ 比較模式寄存器 1 (TIMx_CCMR1)

TIMx capture/compare mode register 1
偏移地址:0x18
復位值:0x0000

這些通道可用于輸入(捕獲模式)或輸出(比較模式)模式。通道方向通過配置相應的 CCxS位進行定義。此寄存器的所有其它位在輸入模式和輸出模式下的功能均不同。對于任一給定位,OCxx 用于說明通道配置為輸出時該位對應的功能,ICxx 則用于說明通道配置為輸入時該位對應的功能。因此,必須注意同一個位在輸入階段和輸出階段具有不同的含義。

這里我們用到的是 TIM5 的捕獲/比較通道 1,我們重點介紹 TIMx_CCMR1 的[7:0]位(其高 8 位配置類似)

TIMx 捕獲/ 比較使能寄存器 (TIMx_CCER)

TIMx capture/compare enable register
偏移地址:0x20
復位值:0x0000

我們要用到這個寄存器的最低 2 位,CC1E 和 CC1P 位。

位 1 CC1P: 捕獲 / 比較 1 輸出極性 (Capture/Compare 1 output Polarity) 。
CC1 通道配置為輸出:
0:OC1 高電平有效
1:OC1 低電平有效
CC1 通道配置為輸入:
CC1NP/CC1P 位可針對觸發或捕獲操作選擇 TI1FP1 和 TI2FP1 的極性。
00:非反相/上升沿觸發
電路對 TIxFP1 上升沿敏感 (在復位模式、外部時鐘模式或觸發模式下執行捕獲或觸發操作), TIxFP1 未反相 (在門控模式或編碼器模式下執行觸發操作)。
01:反相/下降沿觸發
電路對 TIxFP1 下降沿敏感 (在復位模式、外部時鐘模式或觸發模式下執行捕獲或觸發操作), TIxFP1 反相 (在門控模式或編碼器模式下執行觸發操作)。
10:保留,不使用此配置。
11:非反相/上升沿和下降沿均觸發
電路對 TIxFP1 上升沿和下降沿都敏感(在復位模式、外部時鐘模式或觸發模式下執行捕獲或觸發操作),TIxFP1 未反相(在門控模式下執行觸發操作)。編碼器模式下不得使用此配置。

位 0 CC1E: 捕獲 / 比較 1 輸出使能 (Capture/Compare 1 output enable) 。
CC1 通道配置為輸出:
0:關閉––OC1 未激活
1:開啟––在相應輸出引腳上輸出 OC1 信號
CC1 通道配置為輸入:
此位決定了是否可以實際將計數器值捕獲到輸入捕獲/比較寄存器 1 (TIMx_CCR1) 中。
0:禁止捕獲
1:使能捕獲

TIMx DMA/ 中斷使能寄存器 (TIMx_DIER)

TIMx DMA/Interrupt enable register
偏移地址:0x0C
復位值:0x0000

我們需要用到中斷來處理捕獲數據,所以必須開啟通道 1 的捕獲比較中斷,即 CC1IE 設置為 1。

TIMx 控制寄存器 1 (TIMx_CR1)

TIMx control register 1
偏移地址:0x00
復位值:0x0000

控制寄存器:TIMx_CR1,我們只用到了它的最低位,也就是用來使能定時器的。

TIMx 捕獲/ 比較寄存器 1 (TIMx_CCR1)

TIMx capture/compare register 1
偏移地址:0x34
復位值:0x0000 0000

TIMx_CCR1,該寄存器用來存儲捕獲發生時,TIMx_CNT的值,我們從 TIMx_CCR1 就可以讀出通道 1 捕獲發生時刻的 TIMx_CNT 值,通過兩次捕獲(一次上升沿捕獲,一次下降沿捕獲)的差值,就可以計算出高電平脈沖的寬度(注意,對于脈寬太長的情況,還要計算定時器溢出的次數)。

04. 配置步驟

4.1開啟 TIM5 時鐘,配置 PA0 為 為 復用功能(AF2 ),并開啟下拉電阻。

要使用 TIM5,我們必須先開啟 TIM5 的時鐘。同時我們要捕獲 TIM5_CH1 上面的高電平脈寬,所以先配置 PA0 為帶下拉的復用功能,同時,為了讓 PA0 的復用功能選擇連接到 TIM5,所以設置 PA0 的復用功能為 AF,即連接到 TIM5 上面。開啟 TIM5 時鐘的方法為:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //TIM5 時鐘使能

配置 PA0 為復用功能,所以我們首先要設置 PA0 引腳映射 AF2,方法為:

GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //GPIOA0 復用位定時器 5

最后,我們還要初始化 GPIO 的模式為復用功能,同時這里我們還要設置為開啟下拉。方法為:

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度 100MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復用輸出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PA0

這里我們使用的是定時器 5 的通道 1,所以我們從 STM32F4 對應的數據手冊可以查看到對應的 IO 口為 PA0:

4.2 初始化TIM5, 設置 TIM5 的 的 ARR 和 PSC 。

在開啟了 TIM5 的時鐘之后,我們要設置 ARR 和 PSC 兩個寄存器的值來設置輸入捕獲的自動重裝載值和計數頻率。這在庫函數中是通過 TIM_TimeBaseInit 函數實現的。

TIM_TimeBaseStructure.TIM_Prescaler=psc; //定時器分頻 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式 TIM_TimeBaseStructure.TIM_Period=arr; //自動重裝載值 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//初始化 TIM5

4.3 設置 TIM5 的 的 輸入捕獲參數,開啟輸入捕獲。

TIM5_CCMR1 寄存器控制著輸入捕獲 1 和 2 的模式,包括映射關系,濾波和分頻等。這里我們需要設置通道 1 為輸入模式,且 IC1 映射到 TI1(通道 1)上面,并且不使用濾波(提高響應速度)器。庫函數是通過 TIM_ICInit 函數來初始化輸入比較參數的:

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)

我們來看看參數設置結構體 TIM_ICInitTypeDef 的定義:

typedef struct {uint16_t TIM_Channel; //通道uint16_t TIM_ICPolarity; //捕獲極性uint16_t TIM_ICSelection;//映射uint16_t TIM_ICPrescaler;//分頻系數uint16_t TIM_ICFilter; //濾波器長度 } TIM_ICInitTypeDef;

參數 TIM_Channel 很好理解,用來設置通道。我們設置為通道 1,為 TIM_Channel_1。
參 數 TIM_ICPolarit 是 用 來 設 置 輸 入 信 號 的 有 效 捕 獲 極 性 , 這 里 我 們 設 置 為TIM_ICPolarity_Rising,上升沿捕獲。同時庫函數還提供了單獨設置通道 1 捕獲極性的函數為:

TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);

參數 TIM_ICSelection 是用來設置映射關系,我們配置 IC1 直接映射在 TI1 上,選擇TIM_ICSelection_DirectTI。
參 數 TIM_ICPrescaler 用 來 設 置 輸 入 捕 獲 分 頻 系 數 , 我 們 這 里 不 分 頻 , 所 以 選 中TIM_ICPSC_DIV1,還有 2,4,8 分頻可選。
參數 TIM_ICFilter 設置濾波器長度,這里我們不使用濾波器,所以設置為 0。

TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //選擇輸入端 IC1 映射到 TI1 上 TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕獲 TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上 TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置輸入分頻,不分頻 TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置輸入濾波器 不濾波 TIM_ICInit(TIM5, &TIM5_ICInitStructure);

4.4 使能捕獲和更新中斷(設置 TIM5 的 DIER 寄存器)
因為我們要捕獲的是高電平信號的脈寬,所以,第一次捕獲是上升沿,第二次捕獲時下降沿,必須在捕獲上升沿之后,設置捕獲邊沿為下降沿,同時,如果脈寬比較長,那么定時器就會溢出,對溢出必須做處理,否則結果就不準了,不過,由于 STM32F4 的 TIM5 是 32 位定時器,假設計數周期為 1us,那么需要 4294 秒才會溢出一次,這基本上是不可能的。這兩件事,我們都在中斷里面做,所以必須開啟捕獲中斷和更新中斷。

這里我們使用定時器的開中斷函數 TIM_ITConfig 即可使能捕獲和更新中斷:

TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允許更新中斷和捕獲中斷

4.5 設置中斷 優先級 ,編寫中斷服務函數

因為我們要使用到中斷,所以我們在系統初始化之后,需要先設置中斷優先級分組,這里方法跟我們前面講解一致,調用 NVIC_PriorityGroupConfig()函數即可,我們系統默認設置都是分組 2。設置中斷優先級的方法前面多次提到這里我們不做講解,主要是通過函數 NVIC_Init()來完成。設置優先級完成后,我們還需要在中斷函數里面完成數據處理和捕獲設置等關鍵操作,從而實現高電平脈寬統計。在中斷服務函數里面,跟以前的外部中斷和定時器中斷實驗中一樣,我們在中斷開始的時候要進行中斷類型判斷,在中斷結束的時候要清除中斷標志位。使用到的函數在上面的實驗已經講解過,分別為 TIM_GetITStatus()函數和 TIM_ClearITPendingBit()函數。

if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET){}//判斷是否為更新中斷 if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET){}//判斷是否發生捕獲事件 TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);//清除中斷和捕獲標志位

我們還使用到了一個設置計數器值的函數為:

TIM_SetCounter(TIM5,0);

4.6 使能定時器(設置 TIM5 的 CR1 寄存器)
最后,必須打開定時器的計數器開關, 啟動 TIM5 的計數器,開始輸入捕獲。

TIM_Cmd(TIM5,ENABLE ); //使能定時器 5

通過以上 6 步設置,定時器 5 的通道 1 就可以開始輸入捕獲了,同時因為還用到了串口輸出結果,所以還需要配置一下串口。

05. 程序示例

pwm.h

#ifndef __PWM_H__ #define __PWM_H__#include "sys.h"void TIM14_PWM_Init(u16 arr, u16 psc);void TIM5_CH1_Cap_Init(u32 arr,u16 psc);#endif/*__PWM_H__*/

pwm.c

#include "pwm.h"//初始化 AF9 void TIM14_PWM_Init(u16 arr, u16 psc) {GPIO_InitTypeDef gpio_InitTypeDef;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_OCInitTypeDef TIM_OCInitStruct;//使能GPIO時鐘RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能定時器時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);//設置GPIO功能復用GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);//GPIO初始化gpio_InitTypeDef.GPIO_Pin = GPIO_Pin_9;gpio_InitTypeDef.GPIO_Mode = GPIO_Mode_AF;gpio_InitTypeDef.GPIO_Speed = GPIO_Speed_100MHz;gpio_InitTypeDef.GPIO_OType = GPIO_OType_PP;gpio_InitTypeDef.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOF, &gpio_InitTypeDef);//時鐘初始化TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = arr;TIM_TimeBaseInitStruct.TIM_Prescaler = psc;TIM_TimeBaseInit(TIM14, &TIM_TimeBaseInitStruct);TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC1Init(TIM14, &TIM_OCInitStruct);TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM14, ENABLE);//使能定時器TIM_Cmd(TIM14, ENABLE);}//定時器5通道1輸入捕獲配置 //arr:自動重裝值(TIM2,TIM5是32位的!!) //psc:時鐘預分頻數 void TIM5_CH1_Cap_Init(u32 arr,u16 psc) {GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;TIM_ICInitTypeDef TIM5_ICInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //TIM5時鐘使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA時鐘 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復用輸出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA0GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0復用位定時器5TIM_TimeBaseStructure.TIM_Prescaler=psc; //定時器分頻TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式TIM_TimeBaseStructure.TIM_Period=arr; //自動重裝載值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//初始化TIM5輸入捕獲參數TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 選擇輸入端 IC1映射到TI1上TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕獲TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置輸入分頻,不分頻 TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置輸入濾波器 不濾波TIM_ICInit(TIM5, &TIM5_ICInitStructure);TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允許更新中斷 ,允許CC1IE捕獲中斷 TIM_Cmd(TIM5,ENABLE ); //使能定時器5NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占優先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器、} //捕獲狀態 //[7]:0,沒有成功的捕獲;1,成功捕獲到一次. //[6]:0,還沒捕獲到低電平;1,已經捕獲到低電平了. //[5:0]:捕獲低電平后溢出的次數(對于32位定時器來說,1us計數器加1,溢出時間:4294秒) u8 TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態 u32 TIM5CH1_CAPTURE_VAL; //輸入捕獲值(TIM2/TIM5是32位) //定時器5中斷服務程序 void TIM5_IRQHandler(void) { if((TIM5CH1_CAPTURE_STA&0X80)==0)//還未成功捕獲 {if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)//溢出{ if(TIM5CH1_CAPTURE_STA&0X40)//已經捕獲到高電平了{if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長了{TIM5CH1_CAPTURE_STA|=0X80; //標記成功捕獲了一次TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;}else TIM5CH1_CAPTURE_STA++;} }if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕獲1發生捕獲事件{ if(TIM5CH1_CAPTURE_STA&0X40) //捕獲到一個下降沿 { TIM5CH1_CAPTURE_STA|=0X80; //標記成功捕獲到一次高電平脈寬TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);//獲取當前的捕獲值.TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 設置為上升沿捕獲}else //還未開始,第一次捕獲上升沿{TIM5CH1_CAPTURE_STA=0; //清空TIM5CH1_CAPTURE_VAL=0;TIM5CH1_CAPTURE_STA|=0X40; //標記捕獲到了上升沿TIM_Cmd(TIM5,DISABLE ); //關閉定時器5TIM_SetCounter(TIM5,0);TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 設置為下降沿捕獲TIM_Cmd(TIM5,ENABLE ); //使能定時器5} } }TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中斷標志位 }

main.c

#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "beep.h" #include "key.h" #include "exti.h" #include "iwdg.h" #include "wwdg.h" #include "timer.h" #include "pwm.h"extern u8 TIM5CH1_CAPTURE_STA; //輸入捕獲狀態 extern u32 TIM5CH1_CAPTURE_VAL; //輸入捕獲值 int main(void) { long long temp=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2delay_init(168); //初始化延時函數uart_init(115200);//初始化串口波特率為115200TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1); //以1Mhz的頻率計數 while(1){delay_ms(10);if(TIM5CH1_CAPTURE_STA&0X80) //成功捕獲到了一次高電平{temp=TIM5CH1_CAPTURE_STA&0X3F; temp*=0XFFFFFFFF; //溢出時間總和temp+=TIM5CH1_CAPTURE_VAL; //得到總的高電平時間printf("HIGH:%lld us\r\n",temp); //打印總的高點平時間TIM5CH1_CAPTURE_STA=0; //開啟下一次捕獲}} }

結果驗證

打開串口調試助手,選擇對應的串口,然后按 KEY_UP 按鍵,可以看到串口打印的高電平持續時間

06. 附錄

6.1 【STM32】STM32系列教程匯總

網址:【STM32】STM32系列教程匯總

07. 聲明

該教程參考了正點原子的《STM32 F4 開發指南》

總結

以上是生活随笔為你收集整理的【STM32】输入捕获程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。