STM8时基单元
STM8时基单元
时基单元包含:
- 16位向上/向下计数器
- 16位自动重载寄存器
- 重复计数器
- 预分频器
(图29:STM8 时基单元)
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)被置位时才有效。
注意:在使能了CEN位的一个时钟周期后,计数器才开始计数。
读写16位计数器
写计数器的操作没有缓存,并且可以在任何时候写TIM1_CNTRH和TIM1_CNTRL寄存器,因此我们建议不要在计数器运行时写入新的数值,以免写入了错误的数值。
读计数器的操作带有8位的缓存。在用户读了高位(MS)字节后,低位(LS)字节将被自动缓存,缓存的数据在16位的读操作完成之前不会有变化,图30解释了这一过程。
注意:不要使用LDW指令来读取16位计数器的值,因为此指令先读低位(LS)字节,这样读出的数值是错误的。
(图30:STM8 读16位计数器的过程(TIM1_CNTR))
16位TIM1_ARR寄存器的写操作
预装载寄存器中的值将写入16位的TIM1_ARR寄存器中,此操作由两条指令完成,每条指令写入1个字节,高位(MS)字节是先写入的。
影子寄存器在高位(MS)字节写入时被锁定,并保持到低位(LS)字节写完。不要使用LDW指令,因为此指令先写低位(LS)字节,这将导致写入的数值错误。
STM8预分频器
预分频器的实现:
- TIM1的预分频器基于一个由16位寄存器(TIM1_PSCR)控制的16位计数器。由于这个控制寄存器带有缓冲器,因此它能够在运行时被改变。预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。
计数器的频率可以由下式计算:
fCK_CNT=fCK_PSC/(PSCR[15:0]+1)
预分频器的值由预装载寄存器写入,保存了当前使用值的影子寄存器在低位(LS)写入时被载入。
需两次单独的写操作来写16位寄存器,高位(MS)先写。不要使用先写低位(LS)的LDW指令。
新的预分频器的值在下一次更新事件到来时被采用。
对TIM1_PSCR寄存器的读操作通过预装载寄存器完成,因此不需要特别的关注。
向上计数模式
在向上计数模式中,计数器从0计数到用户定义的比较值(TIMx_ARR寄存器的值),然后重新从0开始计数并产生一个计数器溢出事件,同时,如果TIM1_CR1寄存器的UDIS位是0,将会产生一个更新事件(UEV)。图31描述了向上计数模式。
(图31:STM8 向上计数模式的计数器)
置位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时的计数器更新。
(图32:STM8 当ARPE=0(ARR不预装载),预分频为2时的计数器更新)
图33的预分频为1,因此CK_CNT的频率与CK_PSC一致。
图33使能了自动重载(ARPE=1),所以在计数器达到0xFF产生溢出。0x36将在溢出时被写入,
同时产生一个更新事件。
(图33:STM8 ARPE=1(TIM1_ARR预装载)时的计数器更新)
向下计数模式
在向下模式中,计数器从自动装载的值(TIMx_ARR寄存器的值)开始向下计数到0,然后再从自动装载的值重新开始计数,并产生
一个计数器向下溢出事件。如果TIM1_CR1寄存器的UDIS位被清除,还会产生一个更新事件(UEV)。图34描述了向下计数模式的计数器。
(图34:STM8 ARPE=1(TIM1_ARR预装载)时的计数器更新)
置位TIMx_EGR寄存器的UG位(通过软件方式或者使用从模式控制器)也同样可以产生一个更新事件。
置位TIMx_CR1寄存器的UDIS位可以禁止UEV事件。这样可以避免在更新预装载寄存器时更新影子寄存器。因此UDIS位清除之前不会产生更新事
件。然而,计数器仍会从当前自动加载值重新开始计数,并且预分频器的计数器重新从0开始(但预分频器不能被修改)。
此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求),设置UG位将产生一个更新事件UEV但不设置UIF标志(因此不产生中断),这是为了避免在发生捕获事件并清除计数器时,同时产生更新和捕获中断。
当发生更新事件时,所有的寄存器都被更新,并且(根据URS位的设置)更新标志位(TIMx_SR寄存器中的UIF位)也被设置:
预分频器的缓存器被存入预装载的值(TIMx_PSC寄存器的值)。
当前的自动加载寄存器被更新为预装载值(TIMx_ARR寄存器中的内容)。要注意自动装载寄存器在计数器重载入之前被更新,因此下一个周期才是预期的值。
以下是一些当TIMx_ARR=0x36时,计数器在不同时钟频率下的图表。
下图描述了在向下计数模式下,预装载不使能时新的数值在下个周期时被写入。
(图35:STM8 ARPE=0(ARR不预装载),预分频为2时的计数器更新)
(图36:STM8 ARPE=1(ARR预装载),预分频为1时的计数器更新)
中央对齐模式(向上/向下计数)
在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)-1,产生一个计数器溢出事件,然后向下计数到0并且产生一个计数器下溢事件;然后再从0开始重新计数。
在此模式下,不能写入TIMx_CR1中的DIR方向位。它由硬件更新并指示当前的计数方向。
下图给出一个中央对齐模式的例子。
(图37:STM8 中央对齐模式的计数器)
如果定时器带有重复计数器(如TIM1),在重复了指定次数(TIM1_RCR的值)的向上和向下溢出之后会产生更新事件(UEV)。否则每一次的向上向下溢出都会产生更新事件。
置位TIMx_EGR寄存器的UG位(通过软件方式或者使用从模式控制器)也同样可以产生一个更新事件。此时,计数器重新从0开始计数,预分频器也重新从0开始计数。
设置TIMx_CR1寄存器中的UDIS位可以禁止UEV事件。这样可以避免在更新预装载寄存器时更新影子寄存器。因此UDIS位被清为0之前不会产生更
新事件。然而,计数器仍会根据当前自动重加载的值,继续向上或向下计数。如果定时器带有重复计数器,由于重复寄存器没有双重的
缓冲,新的重复数值将立刻生效,因此在修改时需要小心。
此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求),设置UG位将产生一个更新事件UEV但不设置UIF标志(因此不产生中断),这是为了避免在发生捕获事件并清除计数器时,同时产生更新和捕获中断。
当发生更新事件时,所有的寄存器都被更新,并且(根据URS位的设置)更新标志位(TIMx_SR寄存器中的UIF位)也被设置。
预分频器的缓存器被加载为预装载(TIMx_PSC寄存器)的值。
当前的自动加载寄存器被更新为预装载值(TIMx_ARR寄存器中的内容)。要注意到如果因为计数器溢出而产生更新,自动重装载寄存器将在计数器重载入之
前被更新,因此下一个周期才是预期的值(计数器被装载为新的值)。以下是一些计数器在不同时钟频率下的操作的例子:
(图38:STM8 计数器时序图,内部时钟分频因子为1,TIMx_ARR=0x6,ARPE=1)
使用中央对齐模式的提示:
- 启动中央对齐模式时,计数器将按照原有的向上/向下的配置计数。也就是说TIM1_CR1寄存器中的DIR位将决定计数器是向上还是向下计数。此外,软件不能同时修改DIR位和CMS位的值。
- 不推荐在中央对齐模式下,计数器正在计数时写计数器的值,这将导致不能预料的后果。
具体的说:
向计数器写入了比自动装载值更大的数值时(TIM1_CNT>TIM1_ARR),但计数器的计数方向不发生改变。例如计数器已经向上溢出,但计数器仍然向上计数。
向计数器写入了0或者TIM1_ARR的值,但更新事件不发生。 - 安全使用中央对齐模式的计数器的方法是在启动计数器之前先用软件(置位TIM1_EGR寄存器的UG位)产生一个更新事件,并且不在计数器计数时修改计数器的值。
重复计数器
STM8S时基单元解释了计数器向上/向下溢出时更新事件(UEV)是如何产生的,然而事实上它只能在重复计数器的值达到0的时候产生。这个特性对产生PWM信号非常有用。
这意味着在每N次计数上溢或下溢时,数据从预装载寄存器传输到影子寄存器(TIMx_ARR自动重载入寄存器,TIMx_PSC预装载寄存器,还有在比较模式下的捕获/比较寄存器TIMx_CCRx),N是TIMx_RCR重复计数寄存器中的值。
重复计数器在下述任一条件成立时递减:
- 向上计数模式下每次计数器向上溢出时
- 向下计数模式下每次计数器向下溢出时
- 中央对齐模式下每次上溢和每次下溢时。
- 虽然这样限制了PWM的最大循环周期为128,但它能够在每个PWM周期2次更新占空比。
在中央对齐模式下,因为波形是对称的,如果每个PWM周期中仅刷新一次比较寄存器,则最大的分辨率为2xtCK_PSC。
- 虽然这样限制了PWM的最大循环周期为128,但它能够在每个PWM周期2次更新占空比。
重复计数器是自动加载的,重复速率由TIMx_RCR寄存器的值定义(参考图39)。当更新事件由软件产生(通过设置
TIMx_EGR中的UG位)或者通过硬件的从模式控制器产生,则无论重复计数器的值是多少,立即发生更新事件,并且TIMx_RCR寄存器中的内容被重
载入到重复计数器。
(图39:STM8不同模式下更新速率的例子,及TIMx_RCR的寄存器设置)
STM8 时基单元
STM8时基单元的更多相关文章
- 嵌入式单片机STM32应用技术(课本)
目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...
- [stm32] STM32的通用定时器TIMx系统了解
通用定时器(TIMx) 一.TIMx简介 二.TIMx主要功能 三.TIMx功能描述 3.1 时基单元 3.2 计数器模式 3.3 时钟选择 3.4 捕获/比较通道 3.5 输入捕获模式 3.6 PW ...
- STM32通用定时器(转载)
STM32的定时器功能很强大,学习起来也很费劲儿. 其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册-}才搞明 ...
- STM32F4_TIM输出PWM波形(可调频率、占空比)
Ⅰ.概述 上一篇文章关于STM32基本的计数原理明白之后,该文章是在其基础上进行拓展,讲述关于STM32比较输出的功能,以输出PWM波形为实例来讲述. 提供实例工程中比较实用的函数:只需要调用该函数, ...
- 拥抱ARM妹纸第二季 之 第二次 约会需要浪漫,这么大灯泡怎么弄?
终于轮到俺的小穆出场啦.有请能让太阳也为之暗淡的小穆闪亮登场-,鼓掌吧,欢呼吧!-- ♪♪ We can burn brighter Than the sun ~~~ ♪♪ “谢谢---“ 唱的太棒啦 ...
- Stm32高级定时器(一)
Stm32高级定时器(一) 1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波 ...
- Stm32之通用定时器复习
因为毕业设计要用到PWM调光很久都没用到Stm32的定时器,有些内容已经遗忘,为了回顾复习相关内容今天开下通用定时器这一章节的数据手册. 1.时钟 通用定时器一般是TIM2~TIM5,TIM1.TIM ...
- STM32的定时器定时时间计算(计数时间和中断定时时间)
时基单元 可编程高级控制定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器.这个计数器可以向上计数.向下计数或者向上向下双向计数.此计数器时钟由预分频器分频得到. 计数器.自动装载寄存器和预 ...
- 高级定时器TIM1&TIM8
高级定时器 初识stm32高级定时器: (1)高级控制定时器(TIM1 和 TIM8)和通用定时器在基本 ...
随机推荐
- Linq Enumerable.Distinct方法去重
Enumerable.Distinct 方法 是常用的LINQ扩展方法,属于System.Linq的Enumerable方法,可用于去除数组.集合中的重复元素,还可以自定义去重的规则. 有两个重载方法 ...
- FirstAFNetWorking
// ViewController.h // FirstAFNetWorking // // Created by 张国锋 on 15/7/20. // Copyright (c) 2015年 张国锋 ...
- Java_面向对象的 static 和 abstract
static:表示静态的 static:可以用来修饰属性.方法.代码块(或初始化块).内部类. 一.static修饰属性(类变量): public class TestStatic { //stati ...
- 中介者模式和php实现
中介者模式: 中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者模 ...
- 简单的Servlet结合Jsp实现请求和响应以及对doGet和doPost的浅析
1.新建jsp,创建表单 <body> <form action="/MyfirstWeb/login"> username:<input type= ...
- To the world you may be one person, but to one person you may be the world.
To the world you may be one person, but to one person you may be the world.对于世界而言,你是一个人:但对于某人而言,你是他的 ...
- SequenceFile和MapFile
HDFS和MR主要针对大数据文件来设计,在小文件处理上效率低.解决方法是选择一个容器,将这些小文件包装起来,将整个文件作为一条记录,可以获取更高效率的储存和处理,避免多次打开关闭流耗费计算资源.hdf ...
- 在windows 上编译部署Rap2
在windows 上编译部署Rap2 引言 安装需要的环境 安装后端站点 创建数据库 在全局安装pm2 和 typescript 配置mysql,redis 数据库链接配置 初始化 编译 初始化数据库 ...
- HDU 5452 Minimum Cut (Spaning Tree)
生成树的上的一个非根结点对应一条生成树上的边,然后这个结点的子树上连出去的边就对应去掉这条边的割, 然后就可以对树外的边求LCA,在LCA上标记,利用这个信息可以算出有多少条边在子树上,以及有多少条边 ...
- UVA 1616 Caravan Robbers 商队抢劫者(二分)
x越大越难满足条件,二分,每次贪心的选区间判断是否合法.此题精度要求很高需要用long double,结果要输出分数,那么就枚举一下分母,然后求出分子,在判断一下和原来的数的误差. #include& ...