在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