注意:脉冲波频率检测Capture_Init(u16 arr,u16 psc) 初始化要根据检测脉冲的频率范围设置arr和psc,假设系统时钟72Mhz,arr=2000,psc=(7200-1),即分频器分频后计数频率为1Khz,计数重装值为2000,计一个数用1ms,计满2000个数需要2s时间,则此配置下能采集0.5hz~1Khz的脉冲。这里设置脉冲上升沿触发中断,中断服务函数把计数值取出并清零。
/***************输入捕获频率计**************/
void Capture_Init(u16 arr,u16 psc){
//此部分需手动修改 IO口设置
RCC->APB2ENR|=1<<0; // 辅助功能IO时钟开启
RCC->APB1ENR|=1<<2; //TIM4 时钟使能
RCC->APB2ENR|=1<<3; //使能PORTB时钟
TIM4->ARR=arr; //设定计数器自动重装值
TIM4->PSC=psc; //预分频器,
GPIOB->CRL&=0XF0FFFFFF;//PB6
GPIOB->CRL|=0X04000000;//设置为输入
GPIOB->ODR|=1<<6;//PB6 上拉
TIM4->SMCR|= 1<<7; //MSM=1 主/从模式
TIM4->SMCR|= 5<<4; //TS=101 触发选择
TIM4->SMCR|= 4<<0; //SMS=100 复位模式
TIM4->CCMR1|=1<<0;//CC1S=01 选择输入端
TIM4->CCMR1|=3<<4; //IC1F=0011配置输入滤波器
TIM4->CCER|=0<<1; //CC1P=0 选择有交转换边沿
TIM4->CCMR1|=0<<2; //IC1PS=00 配置输入分频
TIM4->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM4->DIER|=1<<1; //允许更新捕获中断
TIM4->CR1|=0x01; //使能定时器4
MY_NVIC_Init(1,3,TIM4_IRQChannel,2);//抢占1,子优先级3,组2
}
//定时器4中断服务程序
void TIM4_IRQHandler(void)
{
IC2Value = TIM4->CCR1;//读取CCR1也可以清CC1IF标志位
TIM4->SR&=~(1<<1);//清除中断标志位
}