STM32 F407 测量高频方波占空比问题

2019-07-20 01:49发布

  各位老哥,我现在想测一个频率在1Mhz左右的方波的占空比,方波是由PWM输出产生,经示波器测量波形良好。我用F407如果使用输入捕获最高只能得到500Khz左右方波的占空比,再高频率的话占空比误差较大,所以想着用别的办法。目前的想法是使用两个外中断和一个定时器,两个外中断分别为上升和下降沿触发,第一个使用上升沿触发,将定时器计数值置为0,打开定时器计数,然后第二个外中断下降沿触发,关闭定时器,再读出此时的计数值,经过运算便可得到占空比。
  通过调试发现,两个外中断只能触发优先级高的那个,所以一共只会触发这一个中断,接线是从一个PWM输出口连接到另外两个不同的外中断IO口。现在这个问题令我百思不得其解,不知道到底哪里出错了,或者说不能这样做?两个IO口我初始化为输入模式,上拉。代码如下:
void LED_Init(void)
{             
  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);                  

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//输入对应引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//输入对应引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
}

void EXTIX_Init(void)
{
        EXTI_InitTypeDef   EXTI_InitStructure;
        NVIC_InitTypeDef   NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
       

        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource2);//PA2 连接到中断线2
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource4);//PA4 连接到中断线4


        /* 配置EXTI_Line2*/
        EXTI_InitStructure.EXTI_Line = EXTI_Line2;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
  EXTI_Init(&EXTI_InitStructure);//配置
        /* 配置EXTI_Line3*/
        EXTI_InitStructure.EXTI_Line = EXTI_Line4;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
  EXTI_Init(&EXTI_InitStructure);//配置

        NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//外部中断2
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置
       
       
        NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//外部中断4
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;//子优先级1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置


}
//外部中断2服务程序 上升沿触发
void EXTI2_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line2)!=RESET)
        {
                EXTI_ClearITPendingBit(EXTI_Line2);//清除LINE2上的中断标志位
                TIM5->CNT=0;   //计数器清零
                TIM_Cmd(TIM5, ENABLE); //开始计数
        }
}
//外部中断4服务程序 下降沿触发
void EXTI4_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line4)!=RESET)
        {
                EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位
                TIM_Cmd(TIM5, DISABLE); //关闭计数
                capture_value = TIM_GetCounter(TIM5);
        }
}

  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。