最近做了一个引脚中断计数的问题,就是两个方波接在两个引脚上,计数一秒有多少脉冲,即是频率,外部测频
程序如下:
////定时器3中断服务程序
void TIM3_IRQHandler(void)
{
if(TIM3->SR&(1<<0))//溢出中断 UIF,位0:更新中断标志位置位
{
FLOW2 = COUNT1;
COUNT1 = 0;
FLOW1 = COUNT0;
COUNT0 = 0;
flag = 1;
// BUZZER=!BUZZER;//蜂鸣器鸣响
}
TIM3->SR&=~(1<<0);//清除中断标志位
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timer3_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能 kb
TIM3->ARR=arr; //设定计数器自动重装值//刚好0.1ms
TIM3-> SC=psc; //预分频器7200,得到10Khz的计数时钟 计数器时钟频率=fosc/(预分频+1)
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0; //允许更新中断
TIM3->DIER|=1<<6; //允许触发中断
TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
}
//TIM4 PWM部分
//正点原子@ALIENTEK
//2011/5/28
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<2; //TIM4时钟使能
GPIOB->CRH&=0XFFFFFFF0;//PB8输出
GPIOB->CRH|=0X0000000B;//复用功能推挽输出 ,50MHZ
GPIOB->ODR|=1<<8;//端口复位后为下拉为0,此处PB8上拉
TIM4->ARR=arr;//设定计数器自动重装值
TIM4-> SC=psc;//预分频器不分频
TIM4->CCMR2|=7<<4; //CH3 PWM2模式
TIM4->CCMR2|=1<<3; //CH3预装载使能
TIM4->CCER |= 1<<8; //OC3 输出使能,低电平有效
// TIM4->CCER &= ~(1<<8); //OC3 输出使能,高电平有效
TIM4->CR1 |= 1<<7; //ARPE使能
TIM4->CR1 |= 1<<0; //使能定时器4
}
//外部中断初始化程序
//初始化PA3,PB0为中断输入.
void EXTIX_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFF0FFF; //PA3设置成输入
GPIOA->CRL|=0X00008000;
GPIOA->ODR|=1<<3; //PA3上拉
RCC->APB2ENR|=1<<3; //使能PORTB时钟
GPIOB->CRL&=0XFFFFFFF0; //PB0设置成输入
GPIOB->CRL|=0X00000008;
GPIOB->ODR|=1<<0; //PB0上拉
// Ex_NVIC_Config(GPIO_A,0,FTIR); //下升沿触发
Ex_NVIC_Config(GPIO_A,3,FTIR);//下降沿触发
Ex_NVIC_Config(GPIO_B,0,FTIR);//下降沿触发
MY_NVIC_Init(2,1,EXTI0_IRQChannel,2); //抢占2,子优先级2,组2
MY_NVIC_Init(2,2,EXTI3_IRQChannel,2);//抢占2,子优先级1,组2
}
//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
COUNT0++;
/// FA1 =!FA1;
EXTI-> R=1<<0; //清除LINE0上的中断标志位
}
//外部中断0服务程序
void EXTI3_IRQHandler(void)
{
COUNT1++;
// FA2=!FA2;
EXTI-> R=1<<3; //清除LINE3上的中断标志位
}
FLOW2 = COUNT1;
FLOW1 = COUNT0;
FLOW1,FLOW2在主函中用printf打印在串口中显示,
现在的问题是,FLOW1,FLOW2两个频率不相同,FLOW2比FLOW1多一倍,前提两个引脚的脉冲是一样的,
各位大侠帮我看下啊,
|