STM32學習和實踐筆記(31):輸入捕獲實驗

1.輸入捕獲介紹

? 在定時器中斷實驗章節中我們介紹了通用定時器具有多種功能,輸入捕獲就是其中一種。STM32F1除了基本定時器TIM6TIM7,其他定時器都具有輸入捕獲功能。輸入捕獲可以對輸入的信號的上升沿,下降沿或者雙邊沿進行捕獲,通常用于測量輸入信號的脈寬、測量 PWM 輸入信號的頻率及占空比。

? 輸入捕獲的工作原理比較簡單,在輸入捕獲模式下,當相應的 ICx 信號檢測到跳變沿后,將使用捕獲/比較寄存器(TIMx_CCRx)來鎖存計數器的值。簡單的說就是通過檢測TIMx_CHx上的邊沿信號,在邊沿信號發生跳變(比如上升沿/下降沿)的時候,將當前定時器的值(TIMx_CNT)存放到對應的通道的捕獲/比較寄存(TIMx_CCRx)里面,完成一次捕獲。同時還可以配置捕獲時是否觸發中斷/DMA 等。下面我們以輸入捕獲測量脈寬為例,通過一個簡圖來介紹輸入捕獲的原理。?

? CNT計數的次數等于:有了這個計數次數,再乘以 CNT 的計數周期,即可得到 t2-t1 的時間長度,即高電平持續時間

上圖以及公式N*ARR+CCRx2,簡單解釋如下:

首先,定時器在以一個固定次數不斷重載并且計數,比如,重載值為1000,那么它就一直不斷地從0計數到1000,然后再次從0計數到1000。與此同時,輸入引腳在監測上升沿跳變,假定某一次計數到500的時候,監測到了一個上升沿,那么,這個時候就產生一個內部觸發,定時器就立即重載,于是定時器馬上從0開始再次計數,(所以,上圖中T1的位置其實是錯誤的!)同時監測改為下降沿觸發,開始監測下降沿!定時器從0開始計數后,有可能1000以前,比如,計到800,就監測到了下降沿,那么很簡單,高電平的持續時間,就是800*一個計數的計數周期。如果計到1000后,仍然沒有監測到下降沿,那么就從0開始計數,一直這樣循環,直到發現下降沿為止。

2.輸入捕獲配置步驟

? 接下來我們介紹下如何使用庫函數對通用定時器的輸入捕獲進行配置。這個也是在編寫程序中必須要了解的。其實輸入捕獲和前面定時器中斷一樣也是通用定時器的一個功能,因此還是要用到定時器的相關配置函數,具體步驟如下:(定時器相關庫函數在stm32f10x_tim.c

stm32f10x_tim.h文件中)。

(1)使能定時器及端口時鐘,并設置引腳復用器映射和引腳模式等

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;

(2)初始化定時器參數,包含自動重裝值,分頻系數,計數方式等

voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*

TIM_TimeBaseInitStruct);

(3)設置通用定時器的輸入捕獲參數,開啟輸入捕獲功能??????????????????????????????

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef*

TIM_ICInitStruct);

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_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);

如果我們需要配置TIM5的通道1為輸入捕獲功能,并且為上升沿捕獲

不分頻、直接映射到TI,可以如下配置

TIM_ICInitTypeDef TIM_ICInitStructure;

TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; //通道1

TIM_ICInitStructure.TIM_ICFilter=0x00;? //濾波

TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//捕獲極性

TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //分頻系數

TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//直接映射到TI1

TIM_ICInit(TIM5,&TIM_ICInitStructure);

(4)開啟捕獲和定時器溢出(更新)中斷???????????????????????????????

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);

(5)設置定時器中斷優先級,使能定時器中斷通道

NVIC初始化庫函數是NVIC_Init()

(6)編寫定時器中斷服務函數

TIM5_IRQHandler

ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);

void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

TIM_SetCounter(TIM5,0); //定時器初值為0

(7)使能定時器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

3.硬件電路

? 本實驗使用到硬件資源如下:

(1)D1指示燈

(2)K_UP按鍵

(3)串口1

(4)TIM5的通道1

D1指示燈用來提示系統正常運行,K_UP按鍵是接在PA0管腳上的,所以可以通過此按鍵輸入一個高電平,通過串口1的printf函數打印捕獲到的高電平時間。

4.編寫輸入捕獲控制程序

? 本實驗所要實現的功能是:按下key_up鍵,產生一個高電平脈沖,使用TIM5CH1檢測輸入信號高電平脈寬,將檢測的高電平脈寬時間通過printf函數打印出來,同時讓D1指示燈不斷閃爍表示系統正常運行。程序框架如下:

(1)初始化PA0管腳為TIM5通道1輸入捕獲功能,開啟捕獲和溢出中斷等

(2)編寫TIM5中斷服務函數

(3)編寫主函數

main.c:

#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "usart.h"
#include "input.h"int main()
{u32 indata=0;u8 i=0;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷優先級分組LED_Init();USART1_Init(9600);TIM5_CH1_Input_Init(0xffff,71);//自動重載值設為最大,且計數頻率為1M,每次計數為1us,這樣計數的總數就是高電平的持續時間while(1){if(TIM5_CH1_CAPTURE_STAUS&0x80){indata=TIM5_CH1_CAPTURE_STAUS&0x3f;indata*=0xffff;indata+=TIM5_CH1_CAPTURE_VALUE;printf("高電平持續時間:%d us\r\n",indata);TIM5_CH1_CAPTURE_STAUS=0;//清空以便再次捕獲}i++;if(i%20 ==0){led1=!led1;//LED1閃,用來指示主程序循環是否運行}delay_ms(50);}
}

???????????????

input.c

#include "input.h"
#include "SysTick.h"u8 TIM5_CH1_CAPTURE_STAUS;//這個標志不僅用來判斷是否產生了中斷,同時也用來記錄溢出中斷的次數
u16 TIM5_CH1_CAPTURE_VALUE;//保存捕獲到下降沿中斷時,計數器的數值void TIM5_CH1_Input_Init(u16 period,u16 prescaler)
{GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//結構體變量聲明TIM_ICInitTypeDef TIM_ICInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//使能TIM5時鐘GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	//GPIO_Init(GPIOA,&GPIO_InitStructure);TIM_TimeBaseInitStructure.TIM_Period=period;   //裝入函數傳過來的自動裝載值TIM_TimeBaseInitStructure.TIM_Prescaler=prescaler; //裝入函數傳過來的分頻系數TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//1分頻(沒有分頻)TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //設置向上計數模式:從0開始計數到自動重載值后溢出產生中斷TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);//初始化TIM5各參數:自動重裝值、分頻系統、計數方式等TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; //通道1TIM_ICInitStructure.TIM_ICFilter=0x00; //濾波TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//捕獲極性設為上升沿TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //分頻系數TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//直接映射到TI1TIM_ICInit(TIM5,&TIM_ICInitStructure);TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//開啟捕獲和定時器溢出(更新)中斷//設置定時器中斷優先級,使能定時器中斷通道NVIC_InitStructure.NVIC_IRQChannel=	TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM5,ENABLE );//使能定時器}void TIM5_IRQHandler(void)
{if((TIM5_CH1_CAPTURE_STAUS&0x80)==0)//在進入打印輸出時,不檢測、不捕獲{if(TIM_GetITStatus(TIM5,TIM_IT_Update))//判斷是否產生溢出中斷	{if(TIM5_CH1_CAPTURE_STAUS&0x40){if((TIM5_CH1_CAPTURE_STAUS&0x3f)==0x3f)//處理高電平時間過長的情況{TIM5_CH1_CAPTURE_STAUS |= 0x80;TIM5_CH1_CAPTURE_VALUE=0xffff;} else{TIM5_CH1_CAPTURE_STAUS++;//保存定時溢出中斷的次數}}}if(TIM_GetITStatus(TIM5, TIM_IT_CC1))//判斷是否產生上升捕獲中斷{if(TIM5_CH1_CAPTURE_STAUS&0x40) //0x40 = 0100 0000,判斷是否捕獲到下降沿{TIM5_CH1_CAPTURE_STAUS |= 0x80;TIM5_CH1_CAPTURE_VALUE=TIM_GetCapture1(TIM5);TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);//重新改為上降沿觸發}else //產生上升捕獲后先進else,把定時器重載,以從0開始重新計數{TIM5_CH1_CAPTURE_STAUS =0;TIM5_CH1_CAPTURE_VALUE =0;TIM5_CH1_CAPTURE_STAUS|= 0x40;//這就是為在第二次捕獲(即捕獲到下降沿)時能進入上面的if語句里TIM_Cmd(TIM5,DISABLE );TIM_SetCounter(TIM5,0); //設定定時器初值為0以重新計數TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);//改為下降沿觸發TIM_Cmd(TIM5,ENABLE );//使能定時器}}}TIM_ClearITPendingBit(TIM5, TIM_IT_Update|TIM_IT_CC1);//清除溢出標志}

input.h

#ifndef _input_H
#define _input_H#include "system.h"
extern u8 TIM5_CH1_CAPTURE_STAUS;
extern u16 TIM5_CH1_CAPTURE_VALUE;void TIM5_CH1_Input_Init(u16 period,u16 prescaler);
void TIM5_IRQHandler(void);#endif

程序燒寫到開發板運行,實驗結果如下:實驗是成功的!

? ? ? ? ? ??

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

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

相關文章

【博客主頁】博客主旨 精華

前言 與博客園不同, 最近CSDN在進行資本化的轉型.其一部分的VIP代碼和小冊我也有相關消費, 個人認為是一部分做的比較成過, 另一部分又不是特別成功. 其CSDN博客已經失去其原本技術交流的意義, 變成一種免費的知識引流和收費交流. 這其實與我們的開源社區背道而馳, 但是又吸引…

世界電信日 | 紫光展銳以科技創新支撐數字經濟可持續發展

專注科技創新,打造全球數字經濟技術基石 紫光展銳堅持科技創新,為數字經濟蓬勃發展提供基石力量。 面對5G-A技術的巨大潛力,紫光展銳與眾多生態伙伴緊密合作,積極推動5G-A的商用進程。紫光展銳提出的兩項R18 eRedCap演進方案已被3GPP標準采…

為什么要實現設備之間的互通?

設備之間的互通是電信設備的普遍性要求,特別是在接入網領域中,不同廠商的局端設備與用戶端(終端)設備之間的互通顯得尤其重要。 一、互通能為產業鏈的各個環節帶寬積極影響。 (1)對用戶而言,互…

安裝新版的Ubuntu WSL以使能BBR擁塞控制算法

【多次嘗試成功的方案】通過> wsl - -list -online列出可以安裝的版本,用命令> wsl --install -d Ubuntu-24.04 安裝。 【未成功的方案】通過掛在ubuntu24.04.iso到E盤后,用命令> wsl --import Ubuntu24.04 C:\WSL\Ubuntu24.04\ E:\ --versio…

Redis系統架構中各個處理模塊是干什么的?no.19

Redis 系統架構 通過前面的學習,相信你已經掌握了 Redis 的原理、數據類型及訪問協議等內容。本課時,我將進一步分析 Redis 的系統架構,重點講解 Redis 系統架構的事件處理機制、數據管理、功能擴展、系統擴展等內容。 事件處理機制 Redis…

API-BigInteger、BigDecimal

BigInteger: demo1: package BigInteger;import java.math.BigInteger; import java.util.Random;public class demo1 {public static void main(String[] args) {//獲取一個隨機最大整數BigInteger bd1 new BigInteger(5, new Random());System.out.println(bd1…

SSMP整合案例第一步 制作分析模塊創建與開發業務實體類

制作分析 我們要實現一個模塊的增刪改查 實際開發中mybatisplus用的不多,他只能對沒有外鍵的單表進行簡單的查詢 但在這個案例中我們還是選擇mybatisplus開發 模塊創建 我們把所有服務器都放在一起 就不用前后端分離 我們嘗試用后端開發進行全棧開發 新建項目添…

macos brew安裝多版本protobuf,切換指定版本protobuf 為默認版本方法

protobuf 不同的版本語法相差很大, 而在不同的項目中可能使用的protobuf版本也不同,所以我們的電腦就可能需要安裝多個版本的protobuf, 下面介紹macos下如何通過brew安裝多版本和設置想要的默認版本的方法 安裝,則可以先執行 bre…

Thinkphp3.2.3網站后臺不能訪問如何修復

我是使用Thinkphp3.2.3新搭建的PHP網站,但是網站前臺可以訪問,后臺訪問出現如圖錯誤: 由于我使用的Hostease的Linux虛擬主機產品默認帶普通用戶權限的cPanel面板,對于上述出現的問題不清楚如何處理,因此聯系Hostease的…

(3)醫療圖像處理:MRI磁共振成像-快速采集--(楊正漢)

目錄 一、磁共振快速采集技術基礎 1.K空間的基本特點 2.快速成像的理由: 3.快速成像的硬件要求: 二、磁共振快速采集技術 1.采集更少的相位編碼線 2.平行采集技術PAT 3.其他與快速采集有關的技術 1)部分回波技術 2)頻率…

java實現一個動態監控系統,監控接口請求超時的趨勢

目錄 整體思路案例實現1. 數據收集2. 數據聚合3. 趨勢分析4. 異常檢測5. 異常處理定時任務 整體思路 理想情況下,你可以實現一個簡單的動態監控算法來檢測渠道請求的響應時間趨勢,并在發現頻繁超時的情況下進行處理。以下是一個可能的算法框架&#xff…

Oracle表關聯更新幾種方法

1、測試表及數據準備 create table T_update01(ID int ,infoname varchar2(32),sys_guid varchar2(36)); create table T_update02(ID int ,infoname varchar2(32),sys_guid varchar2(36));insert into T_update01 select 1,N1_updateName,sys_guid() from dual union select …

java如何獲取IP和IP的歸屬地?

在Java中,獲取IP地址通常指的是獲取本地機器的IP地址或者通過某種方式(如HTTP請求)獲取的遠程IP地址。代碼案例如下: 而要獲取IP的歸屬地(地理位置信息),則通常需要使用第三方IP地址查詢服務,我…

c++ 排序算法merge使用要求

在C中&#xff0c;std::merge是一個算法&#xff0c;它用于合并兩個已排序的范圍&#xff08;例如數組或容器中的一部分&#xff09;到一個新的范圍中。這個函數在<algorithm>頭文件中定義。 輸入范圍必須已排序 std::merge要求輸入的兩個范圍都必須是已排序的&#xf…

23種設計模式順口溜

口訣&#xff1a; 原型 抽風 &#xff0c;單獨 建造 工廠 &#xff08;寓意&#xff1a;&#xff08;這里代指本來很簡單的東西&#xff0c;卻要干工廠這里復雜的業務&#xff09; 抽風&#xff1a;抽象工廠單獨&#xff1a;單例橋代理組合享元適配器&#xff0c;&#xff0…

Microsoft VBA Excel 去重小工具

問題簡述 在本工作表中&#xff0c;A1:B3單元格樣式如下&#xff0c;通過名稱管理器B列的單元格被命名為"LinkFile"、“SheetName”、“InputArea”&#xff0c;請實現以下功能&#xff1a;讀取Excel文件中的數據&#xff0c;去除重復的數據&#xff0c;并記錄每個數…

亞馬遜云科技介紹

&#x1f525;博客主頁&#xff1a; 小羊失眠啦. &#x1f3a5;系列專欄&#xff1a;《C語言》 《數據結構》 《C》 《Linux》 ??感謝大家點贊&#x1f44d;收藏?評論?? 文章目錄 一、亞馬遜云科技云計算1.1 云計算的優勢 二、領先的云平臺三、亞馬遜云科技區域的全球網絡…

最簡單的,在mac筆記本上安裝Unix-v6系統,進行“Unix內核源碼剖析”

Unix V6 已經是 1975 年的系統了&#xff0c;但是其源代碼攏共只有 1w 行左右&#xff0c;并且使用了 C 語言&#xff08;K & R 之前的標準&#xff09;&#xff0c;還是現代操作系統的鼻祖&#xff0c;所以說是初學者最好的研究對象。 安裝模擬器 brew install simh …

【MySQL精通之路】SQL優化(1)-查詢優化(3)-索引合并

主博客&#xff1a; 【MySQL精通之路】SQL優化(1)-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL優化(1)-查詢優化(2)-范圍查詢優化-CSDN博客 下一篇&#xff1a; 目錄 1.索引合并-交集訪問算法 2.索引合并聯合訪問算法 3.索引合并-排序聯合訪問算法 4.影響索引合…

平衡發展與環保:理性看待地下式污水處理廠建設|中聯環保圈

這些年啊&#xff0c;隨著城市化進程越來越快&#xff0c;還有環境保護意識不斷提高&#xff0c;這地下式污水處理廠慢慢就成了熱門的建設趨勢了。據相關統計&#xff0c;全球現在運行著 200 多座地下式污水處理廠呢&#xff0c;咱國家建成和在建的數量也差不多快到 200 座啦。…