想要实现 当发生外部中断时 就是一个高低电平跳动时 芯片记录两个中断之间的时间差
另一个还要实现 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);//清除中断标志位
}