我用到了TIM4和TIM2,TIM4輸出一個PWM波,TIM2采用門控模式,當TIM4為低電平的時候,TIM2開始對外部脈沖進行計數,高電平時即停止計數。目前我在網上看到的,都是主定時器輸出高電平時,從定時器進行計數,就像問一下如何反過來。我的代碼是這樣的:
//TIM4 PWM部分初始化 ST PB7輸出
//PWM輸出初始化
//arr:自動重裝值
//psc:時鐘預分頻數
void TIM4_PWM_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<2; //TIM4時鐘使能
RCC->APB2ENR|=1<<3; //使能PORTB時鐘
GPIOB->CRL&=0X0FFFFFFF;
GPIOB->CRL|=0XB0000000; //PB7輸出,復用功能輸出
TIM4->ARR=arr; //設定計數器自動重裝值
TIM4->PSC=psc; //預分頻器不分頻
TIM4->CCMR1|=7<<12; //CH2 PWM2模式
TIM4->CCMR1|=1<<11; //CH2預裝載使能
TIM4->CCER|=1<<4; //OC2 輸出使能
TIM4->CR1=0x0080; //ARPE使能
TIM4->CR2|=0x5<<4; //MMS=101
TIM4->CR1|=0x01; //使能定時器4
}
void TIM2_Int_Init()
{
RCC->APB1ENR|=1<<0; //TIM2時鐘使能
RCC->APB2ENR|=1<<2; //使能PORTA時鐘
GPIOA->CRL&=0xfffffff0;
GPIOA->CRL|=0x00000008; //PA0浮空輸入模式
GPIOA->IDR|=1<<1; //PA1上拉
TIM2->SMCR&=~(0xf<<8); //ETF=0000:沒有濾波
TIM2->SMCR&=~(3<<12); //ETPS=00:不使用預分頻器
TIM2->SMCR|=0<<15; //ETP=0:外部觸發極性,ETR不反相,上升沿有效
TIM2->SMCR|=1<<14; //ECE=1:外部時鐘使能位,使能外部時鐘模式2。計數器由ETRF信號上的任意有效邊沿驅動
TIM2->SMCR|=0x5<<0; //SMS=101:配置定時器為門控模式
TIM2->SMCR|=0x3<<4; //TS=011:內部觸發3(ITR3),TIM4
TIM2->CNT = 0x0; //計數器清零
TIM2->CR1|=0x1; //使能計數器2
}
|