stm32寄存器版學習筆記06 輸入捕獲(ETR脈沖計數)


  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.。。

 


免責聲明!

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



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