一、设计方案:
1、STM32F1系列共有8个定时器,选取两个通用定时器进行配置;
2、一个定时器用作1S定时,一个配置为外部时钟模式2;
3、ETR2模式下会对信号上升沿进行计数。
1、通用定时器框图:
2、具体配置及原理:
(1)、配置TIM4为ETR2模式,选择极性,触发控制器进行计数,CNT值满后进入定时器中断溢出。因为计数器只有16位,记65536次便会溢出,在中断服务函数中定义一个变量对溢出值进行储存,大大增加了测频的上限。
(2)、配置TIM5定时1S进入中断,在中断中对数据进行处理打印。
3、cubeMX配置
二、程序代码
HAL_TIM_Base_Start(&htim4); //main.c中开启定时器及中断
HAL_TIM_Base_Start(&htim5);
HAL_TIM_Base_Start_IT(&htim4);
HAL_TIM_Base_Start_IT(&htim5);
void TIM4_IRQHandler(void)
{
/* USER CODE BEGIN TIM4_IRQn 0 */
/* USER CODE END TIM4_IRQn 0 */
HAL_TIM_IRQHandler(&htim4);
/* USER CODE BEGIN TIM4_IRQn 1 */
__HAL_TIM_CLEAR_FLAG(&htim4,TIM_FLAG_UPDATE); //清除更新中断标志位
count_x ++ ; //计数器溢出后变量进行自加
/* USER CODE END TIM4_IRQn 1 */
}
void TIM5_IRQHandler(void)
{
/* USER CODE BEGIN TIM5_IRQn 0 */
/* USER CODE END TIM5_IRQn 0 */
HAL_TIM_IRQHandler(&htim5);
/* USER CODE BEGIN TIM5_IRQn 1 */
__HAL_TIM_CLEAR_FLAG(&htim5,TIM_FLAG_UPDATE);
count_ms = TIM4->CNT; //读取计数器未溢出数
count_s = count_x*65536 + count_ms; //溢出数*65536+未溢出数
count_c = count_s+(count_s*0.00137); //数据修正
printf("%d HZ \r\n ",count_c); //打印数据
count_x=0;
TIM4->CNT=0;
/* USER CODE END TIM5_IRQn 1 */
}
三、测试结果
身边条件有限,最大只测到5MHz,故目前来看测量范围在1HZ到5MHz都较为准确,测量误差值最大为0.02%。
若有概念错误或陈述不清处,请指正。。