|
利用TIM2_CH2(端口PA1,stm32f407開(kāi)發(fā)板)進(jìn)行PWM輸入捕獲時(shí),不斷進(jìn)入TIM2_IRQHandler中斷,請(qǐng)各位專家?guī)兔Ψ治龇治?/font>
1、TIM2_CH2的有個(gè)設(shè)置如下:
void TIM2_Configuration(void)
{
TIM_ICInitTypeDef TIM_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //TIM2時(shí)鐘使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA時(shí)鐘
GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM2); //PA1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //GPIOA1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復(fù)用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復(fù)用輸出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA1
TIM_TimeBaseStruct.TIM_Period=0xFFFFFFFF;
TIM_TimeBaseStruct.TIM_Prescaler=0;
TIM_TimeBaseStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStruct);
TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;//選擇TIM2_CH2,選擇輸入端IC2映射到TI2上
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕獲
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射到TI2上(TIM2映射至IC2--tuhongmao)
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//在捕獲輸入上每探測(cè)到一個(gè)邊沿就執(zhí)行一次捕獲
TIM_ICInitStructure.TIM_ICFilter=0;//濾波設(shè)置,經(jīng)歷幾個(gè)周期跳變認(rèn)定波形穩(wěn)定
//(采樣高電平,只有連續(xù)采集到N個(gè)電平是高電平才認(rèn)為是有效的,否則低于N個(gè)時(shí)認(rèn)為是無(wú)效的N取0x0-0xF)
TIM_PWMIConfig(TIM2,&TIM_ICInitStructure);//以上是輸入捕獲設(shè)置
TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2);//選擇濾波后的TI2FP2輸入作為觸發(fā)源,觸發(fā)下面程序的復(fù)位
TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);//從模式控制器被設(shè)置為復(fù)位模式-選中的觸發(fā)信號(hào)上升沿重新
//初始化計(jì)數(shù)器并產(chǎn)生一個(gè)更新信號(hào)(上升沿一到,TIM2->CNT被清零,每次上升沿來(lái)到,CNT都會(huì)被清零)
//從控制器默認(rèn)的通道是否為TIM2_CH1 tuhongmao 20191015
TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//啟動(dòng)定時(shí)器的被動(dòng)觸發(fā)
TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);//捕獲中斷打開(kāi)
TIM_ClearFlag(TIM2,TIM_IT_CC2);//清除標(biāo)志位
TIM_Cmd(TIM2,ENABLE);//使能定時(shí)器2
}
2、中斷設(shè)置與處理函數(shù)如下:
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//中斷處理程序
void TIM2_IRQHandler(void)
{
static u16 count=0;
if(TIM_GetITStatus(TIM2,TIM_IT_CC2)!= RESET)
{
float IC2Value=0;
float DutyCycle=0;
float Frequency=0;
float pulse=0;
TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);
IC2Value=(float)TIM_GetCapture2(TIM2);//獲取CCR2的值
pulse=(float)TIM_GetCapture1(TIM2);//獲得CCR1的值
if(IC2Value !=0)
{
DutyCycle=pulse/IC2Value;
Frequency=(float)84000000/IC2Value;
duty=(u32)(DutyCycle*(u32)100);
freq=Frequency/((float)1000);
count++;
if(count>=10000)
{
count=0;
printf("IC2Value is %f \r\n",IC2Value);
printf("pulse is %f \r\n",pulse);
}
}
else
{
duty=0;
freq=0;
}
}
}
3、主程序Main.c如下:
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
delay_init(168); //初始化延時(shí)函數(shù)
uart_init(115200);//初始化串口波特率為115200
TIM2_Configuration();
NVIC_Configuration();
while(1)
{
}
}
4、串口打印結(jié)果如下:
IC2Value is 2.000000
pulse is 1.000000
IC2Value is 2.000000
pulse is 0.000000
IC2Value is 2.000000
pulse is 0.000000
IC2Value is 2.000000
pulse is 1.000000
IC2Value is 2.000000
pulse is 1.000000
IC2Value is 2.000000
pulse is 1.000000
IC2Value is 2.000000
pulse is 1.000000
IC2Value is 2.000000
...
(每進(jìn)入10000次中斷,再串口打印消息)
其他未做任何設(shè)置,端口也沒(méi)有輸入PWM信號(hào),但是不斷進(jìn)入TIM2_IRQHandler中斷,請(qǐng)幫忙分析分析。
|
|