STM32外部脈沖ETR引腳:TIM1-->PA12;TIMER2-->PA0;TIMER3-->PD2;TIMER4-->PE0…
1.TIM2 PA0計數 配置步驟
①開啟TIM2時鍾,配置PA0輸入
APB1外設復位寄存器 (RCC_APB1RSTR)
APB2外設時鍾使能寄存器(RCC_APB2ENR)
置1開啟。清0關閉。
Eg:RCC->APB1ENR|=1<<0; //使能TIM2時鍾
RCC->APB2ENR|=1<<2; //使能PORTA時鍾
配置I/O口: 參見stm32寄存器版學習筆記01 GPIO口的配置。
Eg:GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前設置
GPIOA->CRL|=0X00000008; //PA0 輸入
GPIOA->ODR|=0<<0; //PA0 下拉
②設置TIM2的ARR和PSC
自動重裝載寄存器(TIMx_ARR)
預分頻器(TIMx_PSC)
③設置TIM2的CCMR1
TIM2_CCMR1寄存器控制着輸入捕獲1和2的模式,包括映射關系、濾波和分頻等。這里需要設置通道1為輸入模式,且IC1映射到TI1(通道1)上,並且不使用濾波(提高響應速度)器。
捕獲/比較模式寄存器1(TIMx_CCMR1)
輸入捕獲模式:
Eg:TIM2->CCMR1|=1<<0; //CC1S=01 選擇輸入端 IC1映射到TI1上
TIM2->CCMR1|=1<<4; //IC1F=0001 配置輸入濾波器 以Fck_int采樣,2個事件后有效
TIM2->CCMR1|=0<<10; //IC2PS=00 配置輸入分頻,不分頻
④設置TIM2的CCER,開啟輸入捕獲,並設置上升沿捕獲
TIM2_CCER寄存器是定時器的開關,並且可以設置輸入捕獲的邊沿。
捕獲/比較使能寄存器(TIMx_CCER)
Eg: TIM2->CCER|=0<<1; //CC1P=0 上升沿捕獲
TIM2->CCER|=1<<0; //CC1E=1 允許捕獲計數器的值到捕獲寄存器中
⑤設置TIM2的DIER,使能捕獲和更新中斷,並編寫中斷服務函數
DMA/中斷使能寄存器(TIMx_DIER)
Eg:TIM2->DIER|=1<<1; //允許捕獲中斷
TIM2->DIER|=1<<0; //允許更新中斷
⑥設置TIM2的CR1使能定時器
最后打開定時器的計數器開關,啟動TIM2計數器,開始輸入捕獲。
控制寄存器1(TIMx_CR1)
2.TIM2 PA0計數應用
1 //定時器2通道1輸入捕獲配置 2 //arr:自動重裝值 3 //psc:時鍾預分頻數 4 void TIM2_Cap_Init(u16 arr,u16 psc) 5 { 6 RCC->APB1ENR|=1<<0; //TIM2 時鍾使能 7 RCC->APB2ENR|=1<<2; //使能PORTA時鍾 8 9 GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前設置 10 GPIOA->CRL|=0X00000008; //PA0 輸入 11 GPIOA->ODR|=0<<0; //PA0 下拉 12 13 TIM2->ARR=arr; //設定計數器自動重裝值 14 TIM2->PSC=psc; //預分頻器 15 16 TIM2->CCMR1|=1<<0; //CC1S=01 選擇輸入端 IC1映射到TI1上 17 TIM2->CCMR1|=1<<4; //IC1F=0001 配置輸入濾波器 以Fck_int采樣,2個事件后有效 18 TIM2->CCMR1|=0<<10; //IC2PS=00 配置輸入分頻,不分頻 19 20 TIM2->CCER|=0<<1; //CC1P=0 上升沿捕獲 21 TIM2->CCER|=1<<0; //CC1E=1 允許捕獲計數器的值到捕獲寄存器中 22 23 TIM2->DIER|=1<<1; //允許捕獲中斷 24 TIM2->DIER|=1<<0; //允許更新中斷 25 TIM2->CR1|=0x01; //使能定時器2 26 MY_NVIC_Init(2,0,TIM2_IRQn,2);//搶占2,子優先級0,組2 27 } 28 29 //定時器2中斷服務程序 30 void TIM2_IRQHandler(void) 31 { 32 u16 tsr; 33 tsr=TIM2->SR; 34 if(tsr&0x02)//捕獲1發生捕獲事件 35 { 36 cishu++; 37 38 } 39 TIM2->SR=0;//清除中斷標志位 40 }
//測試.c TIM2_Cap_Init(25,0); while(1) { printf("cishu:%d us\r\n",cishu); }
//不知為何cnt讀數為0.。。