今天介绍一下从模式Slave Mode中除了外部时钟模式1的另外3个模式:
分别是Reset Mode:复位模式;Gate Mode:门模式;Trigger Mode:触发模式
外部时钟模式1是给定时器提供计数的信号 ,这三种模式功能是控制定时器的工作状态。
一.复位模式
1.复位模式:
在从模式中选择复位模式 对定时器计数状态进行复位,此时外部时钟模式1不能为定时器提供计数信号(被从模式占用) ,我们可以使用另外时钟源:内部时钟 (计时)或ETR(通过外部时钟模式2接入定时器对外部信号进行计数)。
假设这里使用内部时钟源,预分频器设置为0,自动重装载寄存器设置为5。
2.CubeMX:
(1)打开Serial Wire

(2)打开串口:发送数据

(3)TIM2

打开定时器中断,以触发定时器更新中断

过滤器设置15,以过滤掉抖动

保存并生成代码
3.代码:
实现引入上升沿时计数器重新计数,当超过自动重装载值时,串口发送"自动重装载值"且计数器重新开始计数。
(1)头文件
(2)定时器更新中断函数
(3)main函数
复位模式与自动重装载都可以触发定时器更新中断,那我们该如何区分这两者产生的定时器更新中断呢?
定时器更新中断有一个标志位 ,从模式控制器在接收到触发信号后,会设置一个触发器中断标志位 ,所以只要看一下触发器中断标志位是否被置为1,也就可以区分二者了。

其中**__HAL_TIM_GET_FLAG**可以获取定时器标志位的值.
触发器中断标志位:TIM_FLAG_TRIGGER
HAL库未帮我们清0触发器中断标志位,因此再判断触发器中断标志位被置为1后,因此要用**__HAL_TIM_CLEAR_FLAG函数重新清0。**

编译并下载:每5s触发自动重装载中断:输出一次"自动重装载值",并重新计数;通过光电开关引入一个上升沿,输出"从模式触发"并重新计数。
二.门模式
1.门模式:
门模式像控制了时钟信号的一个门,当输入的信号为高电平 时,门打开,时钟信号可以进入定时器,定时器正常计数 。输入信号为低电平 时,门关闭,定时器暂停计数 。若将边沿检测器设置为下降沿,则高低电平对门的开关控制便反过来。
2.CubeMX:

3.代码:
门模式下,控制信号出现下降沿或上升沿,从模式控制器就会暂停或继续定时器计数,这两个边沿时刻,也会将触发器中断标志位置1 ,但门模式并不复位计数器的值,也就不再触发定时器更新中断。所以在更新中断中判断触发器的标志位没有意义。

将判断触发器判断标志位的代码放入while函数中,中断程序就会在检测到触发器中断标志位被置1后,清0此标志位并发送"从模式触发"。

编译并下载:当光电开关输出高电平时,正常计数。当光电开关输出低电平时,发送"从模式触发",计数暂停并一直输出同一个数字。
三.触发模式
1.触发模式:
检测到设定的边沿后,让定时器开始计数
2.CubeMX:

3.代码:
代码不需要改动,编译并下载:开始时不计数,输出为0。当我们让光电开关输出一个上升沿时,发送"从模式触发",启动计数。当继续给一个上升沿时,只会发送"从模式触发",计数并不会停止。
触发模式配合单脉冲 :触发模式只能启动定时器计数,不能停止定时器计数,因此我们可以将触发模式会配合单脉冲模式一起使用。(单脉冲模式:定时器不再循环计数。即当计数到自动重装载后,便停止计数。只有当再次引入上升沿时,定时器又重新开始计数。)
CubeMX启动单脉冲模式:
保存并生成代码,编译并下载:给一个上升沿时,发送"从模式触发",计数开始。当计数达到自动重装载后,发送"自动重装载值"并停止计数。我们可以继续给一个上升沿,发送"从模式触发"然后计数又开始。
注意:我们发现每次程序启动或按复位按钮都会发送"自动重装载"这是因为定时器初始化函数MX_TIM2_Init在初始化时,会将定时器更新中断标志位置1 ,因而当我们调用HAL_TIM_Base_Start_IT后,中断机制启动,NVIC就检测到从定时器更新中断标志位为1,触发中断,进而回调了更新中断的回调函数,因此我们在HAL_TIM_Base_Start_IT函数前清0此标志位就可以了。(使用两种清0标志位的函数都可以)
四.总结
复位模式:重新计数,触发更新中断
门模式:根据电平,高电平继续计数,低电平停止计数。(可以通过设置实现反过来的效果)
触发模式:触发信号可以使定时器开始计数,但不能停止计数,可以配合单脉冲模式使用。







