目前以下代码只能使用TIM3、4两个定时器,其他的一个都用不了,求大家帮帮忙,让1、2、5、8定时器也能工作~~
[mw_shl_code=c,true]
/*-----------------------------------------------------------------
** 函数名:void ETRInputConfig(TIM_TypeDef *timx)
**传入参数:
**返回参数:
**函数功能:计数器能够在外部触发ETR的每一个上升沿或下降沿计数
**
**----------------------------------------------------------------*/
void ETRInputConfig(TIM_TypeDef *timx)
{
if(timx==TIM1) RCC->APB2ENR|=1<<11; //最大 72M
else if(timx==TIM2) RCC->APB1ENR|=1<<0;//最大 36M * 2
else if(timx==TIM3) RCC->APB1ENR|=1<<1;
else if(timx==TIM4) RCC->APB1ENR|=1<<2;
else if(timx==TIM5) RCC->APB1ENR|=1<<3;
//else if(timx==TIM6) RCC->APB1ENR|=1<<4; //这几个定时器不能 使用ETR
//else if(timx==TIM7) RCC->APB1ENR|=1<<5;
else if(timx==TIM8) RCC->APB2ENR|=1<<13;
//设定 CR1
timx->CR1&=~(u16)(0x3<<8); //清空分频因子
timx->CR1|=(u16)(0x0<<8); //设定分频因子为0
//timx->CR1|=(u16)(0x1<<7); //自动重装请允许,TIMx_ARR寄存器被装入缓冲器
timx->CR1&=~(u16)(0x3<<5); //边沿对齐方式
timx->CR1&=~(u16)(0x1<<4); //向上计数
//设定 SMCR 从模式寄存器
timx->SMCR&=~(u16)(0x1<<15);//ETR 输入不反相,高电平/上升沿有效
timx->SMCR|= (u16)(0x1<<14);//使能外部时钟2
timx->SMCR&=~(u16)(0x3<<12);//ETPS,不分频
timx->SMCR&=~(u16)(0xf<<8); //ETF,采样不分频
//预分频值,不分频
timx->  SC=0;
//重装值,0xffff
timx->ARR=~(u16)(0x0);
//设定 DIER -- DMA/中断 制寄存器,关更新中断
timx->DIER&=~(u16)(0x1<<0);
//计数前先清空一下计数器
timx->CNT=0;
timx->CR1|=(u16)(0x1<<0); //开计数器
}
/*-----------------------------------------------------------------
** 函数名:u16 GetETRInput(TIM_TypeDef *timx)
**传入参数:定时器号 TIM1-TIM8
**返回参数:定时器的计数值
**函数功能:获取 ETR输入捕获到的值
**
**----------------------------------------------------------------*/
u16 GetETRInput(TIM_TypeDef *timx)
{
return timx->CNT;
}
[/mw_shl_code]
调用是这样的
[mw_shl_code=c,true]void main()
{
PortConfig(GPIOD,InputMode,Input_UD,0x1<<2);//PD2 输入
ETRInputConfig(TIM3);//TIM1的 ETR
PortConfig(GPIOE,InputMode,Input_UD,0x1<<0);//PE0 输入
ETRInputConfig(TIM4);//TIM1的 ETR
printf("--------------ETR TEST-----------\n");
while(1)
{
printf("tim3=%d\t",GetETRInput(TIM3));
printf("tim4=%d\n",GetETRInput(TIM4));
TimerDelayMs(TIM1,500);
}
}[/mw_shl_code]
结果是这样的:
|