1.硬件信息
使用的是STM32F103ZET6芯片,使用STM32CUBEIDE进行配置。
2.软件配置
这里使用到了两个定时器:通用定时器TIM3和通用定时器TIM4,TIM3用于定时产生1s周期的信号,TIM4用于捕获外部脉冲进行计数。系统时钟为72Mhz。TIM3为主模式,TIM4为从模式。
TIM3具体配置如图所示:分频系数为7200,也就是周期为0.01us,计数周期为10000,所以总的定时时长为1s.
这里选择TIM3的CH1作为输出,该输出作为TIM4的触发源,TIM4选择外部触发的脉冲作为TIM4的时钟源进行计数。TIM3必须要有一个通道输出信号!!!
TIM4的具体配置如图:选择TIM4模式为门控模式(也可以为触发模式),
因为TIM3和TIM4的内部连接关系如图所示:
所以选择ITR1作为触发源。选择ETR2即外部触发脚作为时钟源,将信号发生器的管脚连接到ETR2。
3.程序代码
创建局部变量Counter,对外部输入的脉冲进行计数。在main.c中,主要程序为:
uint16_t Counter;
HAL_TIM_Base_Start_IT(&htim3);//开启定时器3
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);//TIM3 CH1输出PWM
HAL_TIM_SlaveConfigSynchro(&htim4, TIM_SLAVEMODE_GATED);//配置TIM4从模式为门控模式
HAL_TIM_Base_Start(&htim4);//开启定时器4
在stm32xxx.it.c文件中,声明在main.c的变量Counter和TIM4
extern TIM_HandleTypeDef htim4;
extern uint16_t Counter;
在it.c文件的中断响应函数 TIM3_IRQHandler的程序为:
void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM3_IRQn 0 */
HAL_TIM_Base_Stop_IT(&htim3);//停止定时器3中断
HAL_TIM_Base_Stop(&htim4);//停止TIM4计数
Counter=__HAL_TIM_GET_COUNTER(&htim4);//读取Counter的值,即外部脉冲个数
//TIM_ClearITPendingBit(TIM3, TIM_IT_UPDATE);
/* USER CODE END TIM3_IRQn 0 */
HAL_TIM_IRQHandler(&htim3);
/* USER CODE BEGIN TIM3_IRQn 1 */
/* USER CODE END TIM3_IRQn 1 */
}
在Counter=__HAL_TIM_GET_COUNTER(&htim4)处设置断点,即可读取到外部输入的脉冲个数。
测频原理参考文章:用STM32定时器测量信号频率——测频法和测周法[原创cnblogs.com/helesheng] - helesheng - 博客园
这里使用TIM3产生的信号作为标准信号,选择TIM4外部输入信号作为被测信号。根据被测信号和标准信号频率的关系:可知当标准信号fc1为1时,Counter值应为被测信号频率。
使用信号发生器进行验证:当信号发生器的频率为1000HZ时,读取到的Counter值如图所示:为1000,说明该方法可行。