STM32:定时器从模式

今天介绍一下从模式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标志位的函数都可以)

四.总结

复位模式:重新计数,触发更新中断

门模式:根据电平,高电平继续计数,低电平停止计数。(可以通过设置实现反过来的效果)

触发模式:触发信号可以使定时器开始计数,但不能停止计数,可以配合单脉冲模式使用。

相关推荐
用户120487221611 天前
Linux驱动编译与加载
linux·嵌入式
用户805533698031 天前
Input 子系统架构:Core、Handler、Driver 三层是怎么协作的
linux·嵌入式
用户805533698031 天前
RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设
linux·github·嵌入式
神奇啊龙2 天前
我的第一个 TinyGo 项目:ESP32-C3 + DHT11 + SSD1306
物联网·嵌入式
比老马还六3 天前
Bipes-Blockly项目二次开发/Coze智能体(十)
前端·嵌入式
ForTime5 天前
HAL库大雷预警!STM32 HAL库CAN启动超时解决办法
嵌入式
大辉狼_音频架构5 天前
Vol. NXP SOF Arch
嵌入式
用户805533698037 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
荣--10 天前
在 strip 二进制 + 基址随机化的栈里做崩溃去重 —— 三阶段算法与一行 Crash Flag
嵌入式·崩溃分析·栈指纹·去重算法
释然小师弟10 天前
Android开发十年:反思与回顾
android·后端·嵌入式