用捕获方式测频率 但是不能测到hz,测出来单位就直接是Khz了 求解,或者有没有更好的方法呀
部分代码 关键是数据处理
main()
{
void TIMx_EXTERN_CLK_INIT(void)
{
//初始化定时器时钟
// RCC->APB1RSTR |= 1 << (x-2);
// RCC->APB1RSTR &= ~(1<<(x-2));
// RCC->APB1ENR |= 1 << (x-2);
RCC->APB1RSTR |= 1 << 0;//定时器2复位
RCC->APB1RSTR &= ~(1<<0);//无作用?
RCC->APB1ENR |= 1 << 0;//定时器2时钟开启
//*********************
TIMx_PIN_INIT();//PA1引脚初始化
TIMx->CCMR1 |= 1 << 8; //第8位置1 CC2S[1:0] == 01 CC2通道被配置为输入
//无滤波器
TIMx->CCER |= 0 << 5; //极性为高电平计数
TIMx->SMCR |= 1 << 0 | 1 << 1 | 1 << 2; //选择外部时钟模式1-选中的触发输入的上升沿驱动计数器。
TIMx->SMCR |= 1 << 6 | 1 << 5; //选择T2作为触发源 110:滤波后的定时器输入2(TI2FP2)
TIM2->DIER |= 1 << 0; //中断使能
MY_NVIC_Init(1, 1, TIM2_IRQChannel, 2);//设置中断优先级
TIMx->CR1 |= 1 << 0; //开始计数
~~~~~~~
while(1)
{
TIM2->CR1 |= 1 << 0;//使能定时器
delay_ms(1000);//延时1s
CLOSE_CNT();//停止计数
fre = Cnt*65535+TIM2->CNT;//计算频率
dis(fre);//显示频率
Cnt=0;
TIM2->CNT=0;
}
}
void TIM2_IRQHandler(void)//中断处理
{
if (TIM2->SR & (1 << 0))
{
Cnt++;
TIM2->SR &= ~(1 << 0);
}
}
|