大家好!
最近开始接触
STM32F103ZE
开发板,计划利用IO口外部中断的方法
计算PWM波形的占空比和频率。出现了一些问题,还请大神们指点一二,万分感激!!!!

EX
ti初始化设置如下:
EXTI_InitTypeDef EXTI_InitStructure;
void EXTI1_Config_Rising(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); // Ecirc; sup1; Auml; Uuml; cedil; acute; Oacute; Atilde; sup1; brvbar; Auml; Uuml; Ecirc;± Ouml; Oacute;
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);
}