1、上篇文章介绍了定时器使用内部时钟信号计数,实现计数、更新中断等功能。
2、可不可以利用定时器对来自外部的信号进行计数?也就是对输入io的信号计数?
3、可以
1、定时器外部时钟
STM32的通用定时器和高级定时器都将外部信号引入了触发控制器。
但并不是直接的,STM32为每个输入通道都配备了输入滤波器和边沿检测器,方便灵活的配置和使用。
1.1 TIM INPUT介绍
1、在STM32F103上,每个定时器有4个输入通道:TI1、TI2、TI3、TI4(TI是TIM INPUT缩写),其中TI3、TI4并没有接入到触发控制器。这里讨论TI1、TI2。对于TI1来说其边沿检测器输出的脉冲信号有两个:TI1FP1、TI1FP2。这里讨论TI1FP1,它会直接到达触发控制器内部。另外TI1上还有一根称为TI1_ED的信号也会到达触发控制器 前。
2、TI1_ED和TI1FP1、TI1FP2的区别是:TI1FP1、TI1FP2可以选择是上升沿还是下降沿或者双边沿触发,TI1_ED只能是双边沿触发。
3、这三个信号我们只能选择一个作为定时器的触发源,需要通过一个叫触发器的结构来选择其中一个通道,最终到达从模式控制器。
1.2 ETR介绍
1、除了上面三个信号,还有一个外部触发器ETR最终也能进入从模式控制器,这条通路叫做外部时钟模式1。
2、外部时钟模式2可以直接到达触发控制器。
3、整体框图如下:
2、定时器外部时钟使用
红外循迹模块,可以检测黑白线的变化,并反映在DO引脚上,我们将改脚作为定时器外部信号,就可以对外部的变化实现计数。
2.1 ETR外部时钟模式1 配置、使用
2.1.1、配置
1、选择定时器2的时钟源为ETR,可以看见右侧PA0引脚变成TIM2_ETR。所以我们将红外循迹模块的DO引脚接在PA0上即可。
2、下面Clock Filter设置最大15,来解决在黑白线边界时带来的电平跳变、抖动。
3、i2c1也打开,将计数值打印在oled上。
4、保存生成代码。
2.1.2、coding
OLED_Init();
OLED_Clear();
HAL_TIM_Base_Start(&htim2);
int counter;
char message[20];
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
counter = __HAL_TIM_GET_COUNTER(&htim2);
sprintf(message,"counter:%d",counter);
OLED_PrintString(0, 0, message);
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
2.1.3、效果
1、使用黑白线在红外循迹模块下来回晃动观察counter的变化。
2.2 ETR外部时钟模式2 配置、使用
1、外部时钟模式2通道最终进入从模式控制机,需要借助从模式。
2、效果与之前一样。
2.3 TI外部时钟模式配置、使用
定时器从模式???