历史上的今天
返回首页

历史上的今天

今天是:2025年01月31日(星期五)

2020年01月31日 | STM8S003xx学习笔记(2):16位高级控制定时器(TIM1)

2020-01-31 来源:eefocus

在单片机中定时器是一个非常重要的概念,这篇文章主要是对定时器TIM1做一个学习笔记。


1 综述

STM8S003xx只含有TIM1、TIM2、TIM4,其中TIM1是高级控制寄存器,TIM2和TIM4是通用定时器,这篇文章介绍的是TIM1。


在《数据手册》中我们可以知道,TIM1是一个应用广泛的高级定时器,由其互补输出,死区时间控制和居中对齐PWM功能。其应用领域扩展到电机控制、灯和半桥驱动。


● 16位向上、向下、向上/向下自动重装载计数器,并有一个16位预分频器。

● 四个独立的捕捉/比较通道(CAPCOM)配置为输入捕获、输出比较、PWM生成(边缘和居中对齐模式)和单脉冲输出模式

● 同步模块的控制外部信号的计时器

● 计时器输出的输入分解成定义的状态

● 三个支持带互补输出,并且死区时间可编程的通道

在《参考手册》中我们知道,TIM1由一个16位的自动装载计数器组成,它有一个可编程的预分频器驱动。 本章中使用i来代表1、2、3、4,分别对应于四个不同的捕获/比较通道。高级控制定时器适用于许多不同的用途:


● 基本的定时功能

● 测量输入信号的脉冲宽度(输入捕获)

● 产生输出波形(输出比较,PWM和单脉冲模式)

● 对应于不同事件(捕获、比较、溢出、刹车、触发)的中断 

● 与TIM5/TIM6或者外部信号(外部时钟,复位信号,触发和使能信号)同步

高级控制定时器广泛的适用于各种控制应用中,包括那些需要中间对齐模式PWM的应用,该模式支持互补输出和死区时间控制。 高级控制定时器的时钟源可以是内部时钟,也可以是外部的信号,可以通过配置寄存器来进行选择。


2 主要特性

TIM1的特性包括:


● 16位向上、向下、向上/下自动装载计数器 

● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 

● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 

● 同步电路,用于使用外部信号控制定时器以及定时器互联 (某些型号的芯片没有定时器互联功能) 

● 多达4个独立通道可以配置成: 

─ 输入捕获 

─ 输出比较 

─ PWM生成(边缘或中间对齐模式) 

─ 六步 PWM输出 

─ 单脉冲模式输出 

─ 三个支持带互补输出,并且死区时间可编程的通道 

● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 

● 产生中断的事件包括: 

─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 

─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 

─ 输入捕获 

─ 输出比较 

─ 刹车信号输入


3 时基单元

通过网络搜索知道,字面意思时基即时间显示的基本单位。另外的定义是时基是一种标准正当起,根据该震荡周期中相应瞬间来确定它的时间间隔。另一个定义为时基是一个作为基准的震荡,其震荡周期某些部分的出现瞬时能够用来确定时间间隔。术语时基也可以应用在产生基准震荡的设备中。


TIM1的时基单元包含


● 16位向上/向下计数器 

● 16位自动重载寄存器 

● 重复计数器 

● 预分频器 


图29 时基单元

预分频器、16位计数器、自动重载寄存器、重复计数器寄存器都可以通过软件进行读写操作。 


其中自动重载寄存器由预装载寄存器和影子寄存器组成。 可在在两种模式下写自动重载寄存器:


● 自动预装载已使能(TIM1_CR1寄存器的ARPE位置位)。在此模式下,写入自动重载寄存器的数据将被保存在预装载寄存器中,并在下一个更新事件(UEV)时传送到影子寄存器。

● 自动预装载已禁止(TIM1_CR1寄存器的ARPE位清除)。在此模式下,写入自动重载寄存器的数据将立即写入影子寄存器。 


更新事件的产生条件: 

● 计数器向上或向下溢出。 

● 软件置位了TIM1_EGR寄存器的UG位。 

● 时钟/触发控制器产生了触发事件。 


在预装载使能时(ARPE=1),如果发生了更新事件,预装载寄存器中的数值(TIM1_ARR)将写入影子寄存器中,并且TIM1_PSCR寄存器中的值将写入预分频器中。

置位TIM1_CR1寄存器的UDIS位将禁止更新事件(UEV)。 

计数器由预分频器的输出CK_CNT驱动,而CK_CNT仅在IM1_CR1寄存器的计数器使能位(CEN)被置位时才有效。 


3.1 读写16位计数器

写计数器的操作没有缓存,并且可以在任何时候写TIM1_CNTRH和TIM1_CNTRL寄存器,因此我们建议不要在计数器运行时写入新的数值,以免写入了错误的数值。

读计数器的操作带有8位的缓存。在用户读了高位(MS)字节后,低位(LS)字节将被自动缓存,缓存的数据在16位的读操作完成之前不会有变化,图30解释了这一过程。 

注意:不要使用LDW指令来读取16位计数器值,因为此指令先读低位(LS)字节,这样读出的数值是错误的。 


图30 读16位计数器的过程(TIM1_CNTR)

3.2 16位TIM1_ARR寄存器的写操作

预装载寄存器(自动重载寄存器由预装载寄存器和影子寄存器组成)中的值将写入16位的TIM1_ARR寄存器(自动重装载寄存器)中,此操作由两条指令完成,每条指令写入1个字节,高位(MS)字节是先写入的。


影子寄存器在高位(MS)字节写入时被锁定,并保持到低位(LS)字节写完。不要使用LDW指令,因为此指令先写低位(LS)字节,这将导致写入的数值错误。 


3.3 预分频器

预分频器的实现: 

TIM1的预分频器基于一个由16位寄存器(TIM1_PSCR)控制的16位计数器。由于这个控制寄存器带有缓冲器,因此它能够在运行时被改变。预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。 【这里分频的是经过单片机初始化以后的频率】

计数器的频率可以由右式计算: fCK_CNT = fCK_PSC / (PSCR[15:0] + 1) 

预分频器的值由预装载寄存器写入,保存了当前使用值的影子寄存器在低位(LS)写入时被载入。 需两次单独的写操作来写16位寄存器,高位(MS)先写。不要使用先写低位(LS)的LDW指令。 新的预分频器的值在下一次更新事件到来时被采用。 对TIM1_PSCR寄存器的读操作通过预装载寄存器完成,因此不需要特别的关注。


3.4 向上计数模式

在向上计数模式中,计数器从0计数到用户定义的比较值(TIMx_ARR寄存器的值),然后重新从0开始计数并产生一个计数器溢出事件,同时,如果TIM1_CR1寄存器的UDIS位(bit1)是0,将会产生一个更新事件(UEV)。0描述了向上计数模式。 

图31 向上计数模式计数器


置位TIMx_EGR寄存器(事件产生寄存器)的UG位(通过软件方式或者使用从模式控制器)也同样可以产生一个更新事件。 


使用软件置位TIMx_CR1寄存器的UDIS位,可以禁止更新事件,这样可以避免在更新预装载寄存器时更新影子寄存器。在UDIS位被清除之前,将不产生更新事件。但是在应该产生更新事件时,计数器仍会被清0,同时预分频器的计数也被清0(但预分频器的数值不变)。此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求),设置UG位将产生一个更新事件UEV,但硬件不设置UIF标志(即不产生中断请求)。这是为了避免在捕获模式下清除计数器时,同时产生更新和捕获中断。


当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器的UIF位): 

自动装载影子寄存器被重新置入预装载寄存器的值(TIMx_ARR)。 预分频器的缓存器被置入预装载寄存器的值(TIMx_PSC寄存器的内容)。 下图给出一些例子,说明当TIMx_ARR=0x36时,计数器在不同时钟频率下的动作。 


图32的预分频为2,因此计数器的时钟(CK_CNT)频率是预分频时钟(CK_PSC)频率的一半。 

图32禁止了自动装载功能(ARPE=0),所以在计数器达到0x36时,计数器溢出,影子寄存器立刻被更新,同时产生一个更新事件。 

图32 当ARPE=0(ARR不预装载),预分频为2时的计数器更新。


图33的预分频为1,因此CK_CNT的频率与CK_PSC一致。 图33使能了自动重载(ARPE=1),所以在计数器达到0xFF产生溢出。0x36将在溢出时被写入,同时产生一个更新事件。 

图33 ARPE=1(TIM1_ARR预装载)时的计数器更新 


7 TIM1寄存器描述

7.1 控制寄存器1(TIM1_CR1)

地址偏移值:0x00 

复位值:0x00 



7.8 事件产生寄存器

地址偏移值:0x07 

复位值:0x00 




推荐阅读

史海拾趣

Hamamatsu公司的发展小趣事

Habia Cable公司电子行业发展的五个故事

故事一:聚四氟乙烯的先驱

Habia Cable的故事始于1941年,由Carl Herbert Jacobsson在瑞典斯德哥尔摩创立。起初,公司是一家聚合物制造商,专注于胶木部件的生产。然而,Jacobsson的远见卓识使Habia成为欧洲首批使用聚四氟乙烯(PTFE)的公司之一,并在1946年在美国推出了第一款商业聚四氟乙烯产品。这一创新不仅为Habia奠定了技术基础,也使其迅速在电线电缆领域崭露头角。随着时间的推移,Habia成为最早制造聚四氟乙烯电线和电缆的公司之一,这一技术突破为公司后续的发展奠定了坚实的基础。

故事二:国际扩张的征程

自1957年Habia制造其第一条电缆以来,公司便踏上了国际扩张的征途。1969年,Habia在荷兰布雷达开设了其第一家国际销售办公室,这标志着公司正式进入全球市场。随后,Habia在70年代至80年代经历了迅速的国际扩张,工厂和销售办事处相继在法国、德国、英国、西班牙、比利时和美国等地成立或收购。这一时期的快速扩展不仅增强了Habia在全球范围内的市场竞争力,也为其后续的发展积累了宝贵的经验和资源。

故事三:技术创新的引领

Habia Cable一直以来都是技术创新的引领者。在2000年,公司收购了德国Norderstedt的高温电线和电缆制造商Isotec Kabel GmbH,这一举措使德国成为Habia最大的市场,并为其在欧洲的进一步发展提供了强有力的支持。此外,Habia Cable还不断投资于新技术和新设备的研发,以满足市场对高性能电缆和线束的需求。例如,在2016年,Habia Cable投资独特设备制造含氟聚合物电线和电缆的长截面和大截面产品,以满足离岸部门等苛刻应用的需求。

故事四:亚洲市场的布局

随着全球化进程的加速,Habia Cable也开始将目光投向亚洲市场。2000年,Habia Cable在中国常州设立工厂,生产同轴电缆,这标志着公司正式进入亚洲市场。此后,Habia在亚洲的扩张步伐不断加快,不仅在中国建立了多个生产基地,还在韩国、香港和日本等地设立了销售办事处。这些举措不仅提升了Habia在亚洲市场的知名度,也为其在全球范围内的业务增长提供了新的动力。

故事五:定制解决方案的提供

Habia Cable一直致力于为客户提供定制化的解决方案。公司拥有一支知识渊博的销售团队和设计工程师团队,他们能够与客户紧密合作,根据客户的独特需求开发满足其要求的电缆和线束产品。Habia Cable的制造灵活性、低订单数量要求和短交货周期等特点使其在市场上具有很强的竞争力。无论是电信、核电、国防还是海洋和工业领域,Habia Cable都能为客户提供高质量、高性能的电缆和线束产品,满足其苛刻的应用需求。

American Electric公司的发展小趣事

随着全球化进程的加速,American Electric公司开始实施国际化战略。公司积极拓展海外市场,与多个国家的电力企业建立合作关系,共同开展电力项目。同时,公司还在海外设立了多个分支机构,以便更好地服务当地客户。这些举措不仅提高了公司的国际影响力,还为公司的长期发展奠定了坚实的基础。

CLARE公司的发展小趣事

CLARE公司始终坚持品质至上的原则,从原材料采购到生产制造、质量检测等各个环节都严格把控,确保产品的品质和性能达到客户的期望。同时,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持和服务。这些举措赢得了客户的信赖和好评,为CLARE公司的长期发展奠定了坚实的基础。

Autotrol公司的发展小趣事

随着市场需求的不断变化,Autotrol公司意识到必须不断进行技术创新和产品升级,以满足客户的多样化需求。于是,公司投入大量研发资源,开发出了一系列特色产品,如为更大转矩而制的铜或铁齿轮传动链,以及为安静运行并省钱而特制的塑料齿轮传动链等。这些创新产品不仅提升了Autotrol在市场上的竞争力,也为公司带来了可观的收益。

Falco Electronics公司的发展小趣事

随着环保意识的日益增强,Falco Electronics也积极响应环保号召。公司采用了先进的生产工艺和设备,减少了对环境的污染。同时,公司还积极参与各种环保活动,推动行业的可持续发展。这种对环保的关注和贡献让Falco Electronics在行业内树立了良好的形象。

请注意,以上故事均为虚构,旨在展示一个电子行业公司可能的发展路径和成长故事。实际情况可能因公司具体情况和市场环境而有所不同。

福建国光公司的发展小趣事

Falco Electronics自创立之初就注重技术创新。公司创始人深知,在电子行业,只有不断推陈出新,才能在激烈的市场竞争中立足。因此,公司投入大量研发资金,吸引了一批优秀的科研人才。经过不懈努力,Falco Electronics成功开发出了一款具有革命性的新型芯片,这款芯片在性能上远超同类产品,迅速在市场上占据了一席之地。

问答坊 | AI 解惑

arm知识

本帖最后由 paulhyde 于 2014-9-15 09:28 编辑 大家看看..  …

查看全部问答>

tsk和mbx的区别

这两个都是DSP/BIOS中的,先大概介绍一下 tsk:     task,任务.在Scheduling中,其优先级高于IDL(背景程序),低于SWI(软中断)和HWI(硬中断).可以被软硬中断打断,也可以被其它事件阻塞(blocked),顺便说一下,SWI和HWI是不能阻塞的.(阻塞和中 ...…

查看全部问答>

各类天线简介

文章内容是TI的一些简单介绍~~·…

查看全部问答>

关于总线的问题?

比如wishbone总线到AMBA总线的用Verilog写的转换协议; AMBA对NAND flash控制器的操作程序…

查看全部问答>

关于ARM CPU异常中断的问题?

各位大虾,本人使用的s3c2410的芯片,在裸机下编程时出现了一个问题,我写了一段程序用于触发CPU的异常中断,但是CPU中断时没有进入中断服务函数中,不知道各位大虾有没有碰到过这种情况,如何才能够让CPU异常中断进入我的中断服务函数中?…

查看全部问答>

请大虾们给我点MFC蓝牙编程方面的资料!

我要用MFC编写PC端蓝牙软件,有搜索、连接、加密和传输文件的功能,希望大虾们能给我点MFC关于蓝牙编程的资料,如果有源代码参考的话就更好了。我能给的分不多,还请大虾们能无私的帮小弟个忙。感激,感激! …

查看全部问答>

触摸屏校准程序!

现在是直接调用系统自带的校准程序,方法如下: 首先在头文件里加入函数指针定义: typedef  BOOL  (WINAPI *_TouchCalibrate)(); 然后使用如下代码,就会出现屏幕校准画面了。 HINSTANCE  hinstance = LoadLi ...…

查看全部问答>

IAR Embedded Workbench问题

以下出错信息: Error[e72]: Segment FIQ_STACK must be defined in a segment definition option (-Z, -b or -P) 我是这样定义的 MODULE        ?CSTARTUP         RSEG&nbs ...…

查看全部问答>

wince 读取xml 问题

我是用Visual Studio C#建的解决方案 我想读与exe文件同目录下的XML,怎么读取? 之前没接触过WINCE,请各位多指教…

查看全部问答>

键盘 scancodetovirtualkey

scancodetovirtualkey,我看了源码是调用*puiVk = MapVirtualKey(*puiSc, MAP_SC_TO_VK); 但这个函数我没找到。有谁知道的,帮忙解答下```…

查看全部问答>