
大家好! 最近开始接触STM32F103ZE开发板,计划利用IO口外部中断的方法计算PWM波形的占空比和频率。出现了一些问题,还请大神们指点一二,万分感激!!!! ![]() EXTI初始化设置如下: EXTI_InitTypeDef EXTI_InitStructure; void EXTI1_Config_Rising(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //ʹÄܸ´Óù¦ÄÜʱÖÓ GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1); EXTI_InitStructure.EXTI_Line=EXTI_Line1;//PC1,EXTI1 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; #if 1 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//双边沿触发 #else EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发 #endif EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); 首先,采用双边沿触发,进入中断之后判断引脚电平从而再次确定是哪种边沿触发。代码如下,但是一旦PWM波形的频率和占空比较低的话,此方法完全无效。 TIMER_CNT Count[2]={0};//Count[0] is sample value, Count[1] is return value. u16 TITimer=0; void EXTI1_IRQHandler(void) { //using EXTI_Trigger_Rising_Falling as EXTI source. if (EXTI_GetITStatus(EXTI_Line1) != RESET) { if (PCin(PWM_PIN))//rising edge { TITimer++; if(TITimer==1)//with interrupt { TIM_SetCounter(TIM2,0);//set count=0, and start count timer. } else if(TITimer==3) { Count[0].Cnt[1]=TIM_GetCounter(TIM2);//周期时间 Count[1]=Count[0]; TITimer=0; } } else //falling edge { if(TITimer==2) { Count[0].Cnt[0]=TIM_GetCounter(TIM2);//高电平持续时间 } } EXTI_ClearITPendingBit(EXTI_Line1); } //占空比=Count[0].Cnt[0]/Count[0].Cnt[1] 如果采用单边沿触发的方法,在中断处理函数里面转换触发边沿,断点测试出来是触发边沿转换无效,所以,测得的周期是实际的2倍,也不能检测到另一种边沿。下面代码: TIMER_CNT Count[2]={0};//Count[0] is sample value, Count[1] is return value. u8 EXTI1_STA = 0; void EXTI1_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line1) != RESET) { if(EXTI1_STA == 0)//1st risng edge interrupt { TIM_SetCounter(TIM2,0); EXTI1_STA =0x40; EXTI1_Config_Falling(); } else if(EXTI1_STA & 0x40) //2ed falling edge,无法进入!!!!!! { Count[0].Cnt[0]=TIM_GetCounter(TIM2); EXTI1_STA =0x80; EXTI1_Config_Rising(); } else if(EXTI1_STA & 0xC0)//3rd rising edge { Count[0].Cnt[1]=TIM_GetCounter(TIM2); Count[1]=Count[0]; EXTI1_STA=0; } //EXTI_Init(&EXTI_InitStructure); EXTI_ClearITPendingBit(EXTI_Line1); } |