STM32F103vet6中断程序实现

想要实现 当发生外部中断时 就是一个高低电平跳动时 芯片记录两个中断之间的时间差
另一个还要实现 1秒钟内有几次发生中断

#define  TainIn    PBin(8)   // PB8
u16 Rise_value=0;
u16 Fall_value=0;
u16 Duty_value=0;
 u16 OldRise_value=0;
 u16 num=0;//中断次数

TIM5_TIM_Init((65535),(27-1));



/*定时器5初始化*/
void Timer5_Init(u16 arr,u16 psc)
{    

    RCC->APB1ENR|=1<<3;    //TIM5 时钟使能  
    TIM5->ARR=arr;//设定计数器自动重装值   
    TIM5->PSC=psc;//预分频器不分频 

    TIM5->CR1|=0x01;    //使能定时器5
                                                                                              
} 



/*外部中断用于PWM输入口*/
void EXTIX_Init(void)
{
    RCC->APB2ENR|=1<<3;     //使能PORTB时钟     
    //PB8
    GPIOB->CRH&=0XFFFFFFF0;//PB8设置成输入      
    GPIOB->CRH|=0X00000008;                    
    GPIOB->ODR|=1<<8;       //PB8上拉

    Ex_NVIC_Config(GPIO_B,8,3);//8是指PB8是指上升下降沿触发
    MY_NVIC_Init(1,0,EXTI9_5_IRQChannel,4);//抢占0,子优先级3,组3
            
}



//外部中断6服务程序用于PB8捕获
void EXTI9_5_IRQHandler(void)
{                     
       if(TainIn ==1)//先是上升沿触发中断
       {  
       num++; //中断次数
       if(Train_flag ==0)
       {
           Train_flag =1;
           Rise_value = TIM5->CNT;//读取上升时间
           
           if(OldRise_value > Rise_value) Duty_value = OldRise_value-Rise_value;
         else if(OldRise_value < Rise_value) Duty_value = (OldRise_value+65535)-Rise_value;

            OldRise_value = Rise_value;
       }       
    }
    else if(TainIn ==0)//第二次中断是下降沿
    {    
        if(Train_flag ==1)
        {         
               Fall_value = TIM5->CNT;//读取总时间    

        }    
    }        
    EXTI->PR=1<<8;     //清除LINE8上的中断标志位  
}

另一个还要实现 1秒钟内有几次发生中断

这个问题可以用一个定时器到1秒后读取num的值中断次数

u16  get_num =0;
/*定时器1*/
void Timer1_Init(u16 arr,u16 psc)
{
    RCC->APB2ENR|=1<<11;//TIM1时钟使能    
     TIM1->ARR=arr;  //设定计数器自动重装值//刚好1ms    
    TIM1->PSC=psc;  //预分频器,
    TIM1->DIER|=1<<0;   //允许更新中断                
    TIM1->DIER|=1<<6;   //允许触发中断
    //TIM1->CR1=0x0080;   //ARPE使能 TIMx_ARR寄存器被装入缓冲器           
    TIM1->CR1|=0x01;    //使能定时器1

    MY_NVIC_Init(5,0,TIM1_UP_IRQChannel,4);//抢占1,子优先级1,组1                                     
}
/*定时器1中断服务程序*/     
void TIM1_UP_IRQHandler(void)
{         
    if(TIM1->SR&0X0001)//溢出中断
    {      
         get_num = num;//读取num的值中断次数
    }                   
    TIM1->SR&=~(1<<0);//清除中断标志位  
}