七.STM32F030C8T6 MCU开发之TIMER模块级联组成32BIT计时器案例

news2024/10/5 13:16:31

七.STM32F030C8T6 MCU开发之TIMER模块级联组成32BIT计时器案例

文章目录

  • 七.STM32F030C8T6 MCU开发之TIMER模块级联组成32BIT计时器案例
    • 0.总体功能概述
    • 1.TIM硬件介绍
      • 1.1 TIM1/3级联硬件介绍
        • 1.1.1 主从模式介绍
        • 1.1.2 TIM1为主,TIM3为从,TIM3 的输入触发源选择
        • 1.1.3 Master and slave synchronization
      • 1.2 TIM3/2 级联进行输入捕获的硬件介绍
        • 1.2.1 Master and slave synchronization
    • 2.TIM 1/3 级别的32BIT计时器的软件配置
    • 3.验证效果
      • 3.1 打印结果
    • 4.总结

0.总体功能概述

使用STD库–en.stm32f0_stdperiph_lib_v1.6.0。

低成本版stm32芯片(比如F0系列)不具有32位计时器,自带的TIM均为16位。

某些对于计时要求高的场合,而STM32F0单片机16位的定时器最多计数65535,那么很明显us级别的计时只能维持65.535ms,有时候解算过程可能不止65.535ms,因此需要级联组成一个32位定时器作为计数器或者计时器。甚至,你还可以继续级联,用3个计时器组成48位计时器,当然我只测试到了32位,更多级联有待测试。

本案例TIM1由48M分频后的1MHZ系统时钟驱动,TIM3由TIM1计满产生的信号1HZ驱动.

由于TIM1 只支持16BIT,无法实现1us计时器功能,利用TIM1的高级定时间repeat功能,分250次重复计算,也就是TIM1是40us为计数单位的计时器

TIM3 实现秒计时器功能

1.TIM硬件介绍

在这里插入图片描述

1.1 TIM1/3级联硬件介绍

在这里插入图片描述

1.1.1 主从模式介绍

主模式:定时器使能只受驱动时钟控制或者输出控制信号(TRGO)。

从模式:

a.复位模式, 在发生一个触发输入事件时,计数器和它的预分频器能够重新被初始化;同时,如果IMx_CR1寄存器的URS 位为低,还产生一个更新事件UEV ;然后所有的预装载寄存器(TIMx_ARR ,TIMx_CCRx)都被更新了。

b.从模式:门控模式, 计数器的使能依赖于选中的输入端的电平。

c.从模式:触发模式, 计数器的使能依赖于选中的输入端上的事件。

d.从模式:外部时钟模式,

The slave mode can be:

 Reset mode: rising edge of the selected trigger input (TRGI)
reinitializes the counter and generates an update of the registers.

 Gated mode: the counter clock is enabled when the trigger input (TRGI) is high.
The counter stops (but is not reset) as soon as the trigger becomes low.
Both start and stop of the counter are controlled.

 Trigger mode: the counter starts at a rising edge of the trigger TRGI (but it is not reset).
Only the start of the counter is controlled.

 External clock mode 1: rising edges of the selected trigger (TRGI) clock the counter.

1.1.2 TIM1为主,TIM3为从,TIM3 的输入触发源选择

在这里插入图片描述

ITRx由TS位确定,TIM3工作在从模式下内部触发时钟的可选项,如果所选器件对应的定时器不存在则该选项也不存在,如TIM3可选择TIM1_TRGO/TIM15_TRGO/TIM4_TRGO。

TIM3 的输入触发源就是 TIM3的工作基准时钟

1.1.3 Master and slave synchronization

Master configuration

• Use the master update event as the master trigger output (TRGO).
• Enable the Master/Slave mode.

Slave configuration

• Select the slave input trigger: the master trigger output (TRGO) used as the input trigger for the slave.
• Enable the Master/Slave mode.
• Use the external clock mode 1 as the Slave mode:
the slave is clocked by the update event of the master timer.
That is, when the master counter is overflow, the slave counter is incremented.

Using this configuration, each time the period to be measured exceeds the 16-bit master timer Auto-reload register,an update event is generated to clock the slave time

1.2 TIM3/2 级联进行输入捕获的硬件介绍

这个是其他芯片的摘要,来自ST的相关参考资料,配置流程相同

在这里插入图片描述

1.2.1 Master and slave synchronization

Master configuration

• Use the master update event as the master trigger output (TRGO).
• Enable the Master/Slave mode.

Slave configuration

• Select the slave input trigger: the master trigger output (TRGO) used as the input trigger for the slave.
• Enable the Master/Slave mode.
• Use the external clock mode 1 as the Slave mode:
the slave is clocked by the update event of the master timer.
That is, when the master counter is overflow, the slave counter is incremented.

Using this configuration, each time the period to be measured exceeds the 16-bit master timer Auto-reload register,an update event is generated to clock the slave time

2.TIM 1/3 级别的32BIT计时器的软件配置

void Initial_Timer1_3(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure={0};
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE); 	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE); 	/*开启时钟*/

//slave

	TIM_TimeBaseStructure.TIM_Period = 0xffff; /*自动重装值 即从0计数到0xffff*/    
	TIM_TimeBaseStructure.TIM_Prescaler = 0;	 /*71+1分频,每次计数等价于1us*/ 
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;	/*不分频*/
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /*向上计数*/
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
	//TIM_ARRPreloadConfig(TIM3, ENABLE);/*为TIM3装载配置并使能*/	
	TIM_SelectInputTrigger(TIM3, TIM_TS_ITR0);/*选择TIM3的输入触发源为TIM1 查表可以找到*/
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_External1);//TIM_SlaveMode_External1);// TIM_SlaveMode_Trigger);/*TIM3为从模式中的复位模式*/
	TIM_UpdateRequestConfig(TIM3, TIM_UpdateSource_Regular);//TIM_UpdateSource_Global);/*计数器更新来源于计数溢出*/
	/*============================================================================*/
	TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);/*选择TIM3触发输出的原因:计数器更新*/
	/*============================================================================*/
	TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);/*使能TIM3的级联功能*/
	
	//master
	TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 
	TIM_TimeBaseStructure.TIM_Period = 1000000/250-1; 	/*1s*/
	TIM_TimeBaseStructure.TIM_Prescaler = 48-1;   	/*47分频,每次计数等价于1us*/     
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频*/    
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /*向上计数*/
	TIM_TimeBaseStructure.TIM_RepetitionCounter= 250-1;
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 
	
//	TIM_PrescalerConfig(TIM1, 0, TIM_PSCReloadMode_Update);/*不分频*/
//	TIM_UpdateDisableConfig(TIM1, ENABLE);/*暂停TIM2 等待TIM3的配置完再开启*/
	TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);/*TIM3为从模式中的复位模式*/
	TIM_UpdateRequestConfig(TIM1, TIM_UpdateSource_Regular);/*计数器更新来源于计数溢出*/
	TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);
	TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);/*使能TIM2的级联功能*/

	TIM_Cmd(TIM3, ENABLE); /*启动TIM3*/
	TIM_Cmd(TIM1, ENABLE); /*启动TIM2*/            
}

TIM1 的工作时钟是1MHZ,由于TIM1 只支持16BIT,无法实现1us为基础单位计时器功能,利用TIM1的高级定时间repeat功能,分250次重复计算,也就是TIM1是40us为计数单位的计时器。

TIM3 的工作时钟是TIM1的输出控制信号(TRGO),是1HZ,实现秒计时器功能。

3.验证效果

//取us级的时间读取:
/**************************实现函数********************************************
*函数原型:		uint32_t get_timer13_count(void)
*功  能:	  读取系统运行的时间 ,返回单位为us 的时间数。	
*输入参数:		无
*输出参数:		处理器当前时间,从上电开始计时  单位 us
*******************************************************************************/
uint32_t get_timer13_count(void)
{
	
 	uint32_t temp=0 ;
 	temp = TIM3->CNT; //读高16位时间
 	temp = temp<<16;
 	temp += TIM1->CNT; //读低16位时间
 	return temp;
}

uint16_t get_timer1_count(void)
{
	
 	uint16_t temp=0 ;
 	temp = TIM1->CNT; //读低16位时间
 	return temp;
}
uint16_t get_timer3_count(void)
{
	
 	uint16_t temp=0 ;
 	temp = TIM3->CNT; //读高16位时间
 	return temp;
}
int time1_3_main(void)
{
		unsigned int s_time = 0;
		unsigned int e_time = 0;
	Initial_Timer1_3();
  while(1)
  {	   
   
    //Delay_ms(1000);
		s_time = get_curtime();
		while(1)
		{
			e_time = get_curtime();	
			if(e_time>s_time )
			{
				if((e_time - s_time) >=1000)
				{
					break;
				}
			}
		}
		printf("get_timer s:m 3 1_count=%d:%d\r\n",   get_timer3_count(),get_timer1_count());

  }		
}

3.1 打印结果

[2022-11-17 18:59:02]  get_timer s:m 3 1_count=709:3254
[2022-11-17 18:59:03]  get_timer s:m 3 1_count=710:255
[2022-11-17 18:59:04]  get_timer s:m 3 1_count=711:1254
[2022-11-17 18:59:05]  get_timer s:m 3 1_count=712:2255
[2022-11-17 18:59:06]  get_timer s:m 3 1_count=713:3254
[2022-11-17 18:59:07]  get_timer s:m 3 1_count=714:254
[2022-11-17 18:59:08]  get_timer s:m 3 1_count=715:1254
[2022-11-17 18:59:09]  get_timer s:m 3 1_count=716:2255
[2022-11-17 18:59:10]  get_timer s:m 3 1_count=717:3254

4.总结

a.简单地说级联功能,即是一个定时器的定时条件满足后,可以产生一个触发信号启动另一个定时器的定时操作。

对于需要高精度并且长延时的应用,16位的定时(上述精度和时间长度)就不够了,这个问题可以有两种解决办法;

第一个办法是通过软件的接力完成,这个方法的可行性在于定时时间较长,允许软件有足够的时间介入计数,这种办法非常方便,多数情况都可使用。

第二种办法是使用STM32特有的定时器级联功能,实现32位的计数效果,因为级联是由硬件触发的,当设置好各项寄存器后,软件不必中途干预,

可以达到高精度长延时的要求。进一步地,STM32最多有四个定时器,如果串联起来,甚至可以实现4*16=64位的计数效果。

在ST的网站上有一个应用笔记和对应的例子程序,详细说明和演示了如何使用STM32的级联功能实现32位的输入捕获和32位的输出比较功能,各位可以研究一下:
应用笔记下载地址:http://www.st.com/stonline/products/literature/an/13711.pdf

b、不是所有定时器都支持定时器内部主从互联。其中部分完全不支持内部主、从互联;有的只支持从模式下的互联;

c、即使支持TIMER的互联模式,但互联的定时器及相关通道也是有相关约定的。

数效果。

在ST的网站上有一个应用笔记和对应的例子程序,详细说明和演示了如何使用STM32的级联功能实现32位的输入捕获和32位的输出比较功能,各位可以研究一下:
应用笔记下载地址:http://www.st.com/stonline/products/literature/an/13711.pdf

b、不是所有定时器都支持定时器内部主从互联。其中部分完全不支持内部主、从互联;有的只支持从模式下的互联;

c、即使支持TIMER的互联模式,但互联的定时器及相关通道也是有相关约定的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】习题(三)—— 数据链路层

【计算机网络】习题&#xff08;三&#xff09;—— 数据链路层2&#xff0e;数据链路层协议的功能不包括&#xff08;). A&#xff0e;定义数据格式 B。提供结点之间的可靠传输 C.控制对物理传输介质的访问 D.为终端结点隐蔽物理传输的细节 2.D 主是是数据链路层的主要功能包…

SECCON CTF 2022 web复现

skipinx 知识点&#xff1a;qs 参数解析错误qs简介 一句话介绍就是&#xff1a;qs是负责url参数转化的js库&#xff0c;当然也可以说是查询字符串解析和字符串化库。 详细了解移步&#xff1a;https://www.npmjs.com/package/qs qs简单用法 例如&#xff1a;我们 url 参数…

NTPv4协议解析

前言 本文的撰写基于RFC5905.NTP 是时间网络控制协议&#xff0c;V4版本相交V3版本&#xff0c;修复了V3存在的一些问题。尤其是NTPV4的拓展时间戳鼓励使用浮动双数据类型&#xff0c;这样使得NTP能够更好的支持1ns的场景&#xff0c;轮询间隔也从上一代的最多1024s拓展到了36…

上位机通信标准-OPC

OPC通信&#xff0c;基于OPC的通信是一种通信整合方案&#xff0c;通过OPC标准&#xff0c;整合各类协议并统一化接口。 1、上位机通信环境 - 品牌、各类繁多 - 通信环境的统一&#xff1a;OPC 2、OPC - 什么是OPC&#xff1a;OLE for Process Control Windows插件&#x…

数字集成电路设计(五、仿真验证与 Testbench 编写)(一)

文章目录引言1. Verilog HDL 电路仿真和验证概述2. Verilog HDL测试程序设计基础2.1 Testbench及其结构2.2 测试平台举例2.2.1 组合电路仿真环境搭建2.2.2 时序电路仿真环境搭建2.3 Verilog HDL仿真结果确认2.4 Verilog HDL仿真效率3. 与仿真相关的系统任务3.1 $display和\$wri…

Mybatis的二级缓存 (默认方式)

目录前置生效场景一场景二失效场景一场景二场景三场景四脏数据场景前置 什么是二级缓存: 一级缓存是基于sqlsession级别, 当一个sqlsession会话结束, 一级缓存也就结束了. 定义一级缓存为局部缓存, 那么二级缓存就是全局全局缓存 二级缓存是基于mapper文件的namespace级别&…

进程和线程的区别

进程和线程的区别 文章目录进程和线程的区别进程和线程的概念一、从属关系不同二、所属基本单位不同三、资源消耗不同四、是否同步和互斥额外补充问题&#xff1a;一个进程是不是可以创建无限数量的线程&#xff1f;参考链接进程和线程的概念 在了解区别之前&#xff0c;我们先…

【Java】IO流 - 字节流

文章目录FileInputStream 介绍FileOutputStream介绍文件输入输出综合使用【拷贝】FileInputStream 介绍 创建一个txt文件&#xff0c;写入 HelloWorld 并用Java读取&#xff1a; Test public void readFile01(){//提前创建一个文件hello.txt并编辑一个HelloWorldString filePa…

Nacos 注册中心的常用配置

1.服务端地址 spring.cloud.nacos.discovery.server-addr 无 Nacos Server 启动监听的 ip 地址和端口2.服务名 spring.cloud.nacos.discovery.s ervice ${spring.application.name} 给当前的服务命名3.服务分组spring.cloud.nacos.discovery.groupDEFAULT_GROUP 设置服务所处的…

机器视觉之ros人脸识别

系列文章目录 机器视觉之ros人脸识别 ros人脸识别系列文章目录一、WIN下的环境设置二、连接摄像头设备到虚拟机三、安装摄像头驱动设备3.1判断安装usb还是uvc驱动包3.2查看摄像头设备3.3测试网络摄像头3.4安装摄像头驱动包四、调用视觉功能包五、人脸识别的调用一、WIN下的环境…

封装系统之新手操作版

一、需要软件&#xff1a;Vmware16&#xff0c;win10正版系统&#xff0c;EasySysprep5&#xff0c;EasyU_v3.6.iso 下载地址&#xff1a;EasySysprep5&#xff1a;https://www.itsk.com/thread-425990-1-1.html EasyU_v3.6&#xff1a;https://www.itsk.com/thread-426856-1-1…

【计算机视觉】不来试试图片轮廓提取?

文章目录&#x1f6a9; 前言&#x1f348; 边缘提取原理卷积用特殊的卷积核进行轮廓提取&#x1f34f; 开始轮廓提取代码&#x1f6a9; 前言 最近学到了深度学习的卷积操作&#xff0c;在卷积神经网络出现之前&#xff0c;就已经有使用卷积核 &#xff08;也叫滤波器&#xff…

NLP模型(三)——FastText介绍

文章目录1. FastText 概述2. FastText 分类模型2.1 结构2.2 n-gram3. FastText 词嵌入模型1. FastText 概述 首先&#xff0c;我们得搞清楚&#xff0c;FastText 是什么&#xff1f;有的地方说是分类模型&#xff0c;有的地方又将其用于词向量&#xff0c;那么&#xff0c;Fas…

ppt复现CVPR顶会流程图

本次目标如下图&#xff0c;难点在于立方体和矩阵格网的绘制 文末附机器学习绘图模板~ 先来绘制立方体&#xff0c;插入——形状——立方体&#xff0c;调节成如下图&#xff0c;再点击水平翻转&#xff1a; 绘制矩形&#xff0c;多绘制几个组合成矩形格网&#xff0c;右键设置…

TFT-LCD屏幕读取Flash芯片图片资源并显示

TFT-LCD屏幕读取Flash芯片图片资源并显示 在前面用TFT-LCD显示图片的实验中&#xff0c;由于图片资源过大&#xff0c;240 * 320 的图片大小为150K&#xff0c;而STM32F103ZET6的内部Flash才512K&#xff0c;最多能放三张图片&#xff0c;所以这次将图片放到外部Flash中&#…

【Java八股文总结】之Redis数据库

文章目录Redis 数据库一、Redis基础1、Redis应用场景2、Redis数据类型3、Redis常用命令4、Redis为什么速度快&#xff1f;5、Redis和Memcached的区别和共同点6、Redis和MySQL的区别&#xff1f;二、高可用1、主从复制Q&#xff1a;主从复制主要的作用?2、Redis主从复制原理Red…

Cadence之Allegro:蛇形与差分等长

文章目录 一、三种等长方法二、直接等长法设置教程1、差分设置2、analysis设置三、pin-pair法设置教程一、三种等长方法 直接等长法 适用pin和pin之间没有容抗和阻抗的情况,即pin和pin之间只有一根线、没有电阻和电容的时候才可以使用这种方法。 pin-pair法 建立Sigxplorer模形…

基于stm32的光照强度检测智能窗帘系统

资料编号&#xff1a;098 下面是相关功能视频演示&#xff1a; 98-基于stm32的光照强度检测智能窗帘系统Proteus仿真&#xff08;源码仿真全套资料&#xff09;功能介绍&#xff1a; 检测当前的光照强度&#xff0c;LCD1602显示&#xff0c;并且可以自动打开关闭窗帘&#xf…

Tomcat AJP 文件包含漏洞(CVE-2020-1938)

目录 1&#xff0e;漏洞简介 2、AJP13 协议介绍 Tomcat 主要有两大功能&#xff1a; 3&#xff0e;Tomcat 远程文件包含漏洞分析 4&#xff0e;漏洞复现 5、漏洞分析 6&#xff0e;RCE 实现的原理 1&#xff0e;漏洞简介 2020 年 2 月 20 日&#xff0c;公开CNVD 的漏洞公…

【ACL 2022】用于多标签文本分类的对比学习增强最近邻机制

论文地址&#xff1a;https://aclanthology.org/2022.acl-short.75.pdf 1. 摘要 多标签文本分类&#xff08;MLTC&#xff09;是自然语言处理中的一项基本且具有挑战性的任务。以往的研究主要集中在学习文本表示和建模标签相关性上。然而&#xff0c;在预测特定文本的标签时&…