近期做一个项目,要对外部脉冲进行计数。自然而然的想到直接用STM32的定时器,它就有计数的功能。不过还是走了一些弯路,把它记录下来,算是积累点经验吧。
画原理图时,随便选了一个定时器的ch通道接到了外部输入信号上。结果调试程序,始终不计数。上网查资料,说是要接到ETR引脚才行。于是飞了一根线,把输入脉冲接到了TIM4_ETR(PE0)上,结果还是不计数。反复试验,看用户手册,终于解决了。
代码如下:
/* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF ; //对于IO的初始化,基本上网上的例程都初始化成输入,但是这里要初始化成GPIO_Mode_AF
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource0, GPIO_AF_TIM4); //并且还要将定时器的功能映射到该引脚上。
TIM_TimeBaseInitStructure.TIM_Period = 0xffff; //×Ô¶¯ÖØ×°ÔØÖµ
TIM_TimeBaseInitStructure.TIM_Prescaler=0; //¶¨Ê±Æ÷·ÖƵ
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);//³õʼ»¯TIM4
DBGMCU_APB1PeriphConfig(DBGMCU_TIM4_STOP, ENABLE); //为了让断电时,计数器停止工作。
TIM_ETRClockMode2Config(TIM4, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); //定时器设为外部时钟2模式。
TIM_SetCounter(TIM4, 0);
TIM_Cmd(TIM4, ENABLE);
}
完成上面的更改,终于计数了。