STM32 輸入捕獲配置


  在STM32 的定時器,除了 TIM6 TIM7,就是通過檢測 TIMx_CHx 上的
邊沿信號,在邊沿信號發生跳變(比如上升沿/下降沿)的時候, 將當時定時器

的值(TIMx_CNT存放到對應的通道的捕獲/比較寄存器(TIMx_CCRx)里面,
完成一次捕獲。同時還可以配置捕獲時是否觸發中斷/DMA 等。


1)開啟 TIM5 時鍾和 GPIOA 時鍾, 配置 PA0 為下拉輸入。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能 TIM5 時鍾
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 GPIOA 時鍾

2) 初始化 TIM5,設置 TIM5 ARR PSC

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

 

TIM_TimeBaseStructure.TIM_Period = arr; //設定計數器自動重裝值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上計數模式
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根據指定的參數初始化 Tim5

3)設置 TIM5 的輸入比較參數,開啟輸入捕獲

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)

 

TIM_ICInitTypeDef TIM5_ICInitStructure;
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)使能捕獲和更新中斷(設置 TIM5 DIER 寄存器)

 

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

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);//清除中斷和捕獲標志位

 

6)使能定時器(設置 TIM5 CR1 寄存器)

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

 

 1 //定時器 5 通道 1 輸入捕獲配置
 2 TIM_ICInitTypeDef TIM5_ICInitStructure;
 3 void TIM5_Cap_Init(u16 arr,u16 psc)
 4 {
 5     GPIO_InitTypeDef GPIO_InitStructure;
 6     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 7     NVIC_InitTypeDef NVIC_InitStructure;
 8     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //①使能 TIM5 時鍾
 9   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //①使能 GPIOA 時鍾
10   //初始化 GPIOA.0 ①
11   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 設置
12   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 輸入
13   GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.0
14   GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉
15   //②初始化 TIM5 參數
16     TIM_TimeBaseStructure.TIM_Period = arr; //設定計數器自動重裝值
17     TIM_TimeBaseStructure.TIM_Prescaler =psc; //預分頻器
18     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
19     TIM_TimeBaseStructure.TIM_CounterMode =         TIM_CounterMode_Up; //TIM 向上計數模式
20     TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //初始化 TIMx
21   //③初始化 TIM5 輸入捕獲通道 1
22     TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //選擇輸入端 IC1 映射到 TI1 上
23     TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕獲
24     TIM5_ICInitStructure.TIM_ICSelection =                 TIM_ICSelection_DirectTI; //映射到 TI1 上
25     TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置輸入分頻,不分頻
26     TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置輸入濾波器 不濾波
27     TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化 TIM5 輸入捕獲通道 1
28   //⑤初始化 NVIC 中斷優先級分組
29     NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM3 中斷
30     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占優先級 2 級
31     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //從優先級 0 級
32     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
33     NVIC_Init(&NVIC_InitStructure); //初始化 NVIC
34     TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//④允許更新中斷捕獲中斷
35     TIM_Cmd(TIM5,ENABLE ); //⑥使能定時器 5
36 }
37         

 

知識來源:STM32F1開發指南-庫函數版本_V3.1 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM