历史上的今天

今天是:2024年09月07日(星期六)

2020年09月07日 | STM8时基单元

发布者:Blissful5 来源: eefocus关键字:STM8  时基单元  寄存器 手机看文章 扫描二维码
随时随地手机看文章

时基单元包含:

STM8 时基单元
(图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)字节,这样读出的数值是错误的。

STM8 读16位计数器的过程(TIM1_CNTR)
(图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描述了向上计数模式。

STM8 向上计数模式的计数器
(图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。

重复计数器是自动加载的,重复速率由TIMx_RCR寄存器的值定义(参考图39)。当更新事件由软件产生(通过设置 TIMx_EGR中的UG位)或者通过硬件的从模式控制器产生,则无论重复计数器的值是多少,立即发生更新事件,并且TIMx_RCR寄存器中的内容被重 载入到重复计数器。


(图39:STM8不同模式下更新速率的例子,及TIMx_RCR的寄存器设置)


关键字:STM8  时基单元  寄存器 引用地址:STM8时基单元

上一篇:STM8 中I2C读写函数
下一篇:STM8,延时函数

推荐阅读

在中国科技之都的深圳,有两家无人机公司将战火打到了美国本土,甚至引起商务部关注。 商务部预警信息披露栏目显示,8月30日,美国Autel Robotics公司依据《美国1930年关税法》第337节规定向美国际贸易委员会(ITC)提出申请,指控深圳市大疆创新科技有限公司及其关联公司对美出口、在美进口或在美销售的无人机及其组件侵犯其专利权,请求ITC发起337调查并...
最近由于要调试一个SMS发送短信的模块,该模块需要发送一系列AT指令,且需要字符串发送,但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数。其实发送字符串的本质还是发送一个个字符,所以只需在字符串结束标志之前,循环发送字符即可。不罗嗦,上程序。//程序功能:利用串口发送一个字符串// 参数:USARTx USART编...
距离明年三星旗舰 S21 系列(预计于 2 月)推出还有很长时间,但一些关于该设备的可靠信息已经到来。近日 3C 认证数据就曝光了 Galaxy S21 和 S21+ 的电池信息。认证文件显示了 Galaxy S21 和 S21+ 的电池容量和型号。前者的型号为 SM-G991,电池容量为 3,880 mAh,而 S21+ 的型号为 SM-G996,电池容量为 4,660 mAh。 有趣的是,...
英伟达(Nvidia)斥资540亿美元收购英国芯片设计公司Arm的计划再次面临反对,这一次的反对者是欧盟(EU)官员。他们表示,这家美国芯片制造商做出的让步,不足以减轻对竞争对手的潜在损害。  就在上个月,英国竞争和市场管理局(CMA)曾表示,英伟达收购Arm的交易有扼杀创新和损害竞争对手的风险。  英伟达准备于本周在布鲁塞尔向监管机构申请批准这笔...

史海拾趣

问答坊 | AI 解惑

外部接口大合集

外部接口大合集          刚接触电脑的朋友面对着计算机后背那密密麻麻的各种接口和一大把连接线往往会不知所措;    接触电脑久的朋友有的时候想搞一些小点子,但常常会找不到各种 ...…

查看全部问答∨

旋转时钟,外壳底座制作完毕!增加汉字显示

丑小鸭变成了白天鹅。丑陋的手工板,摇身一变,成了正式PCB: 10元一个的电机,一买就是10个,少了人家还不卖,心痛不如行动: 完美的结合: 指针板头上的项圈,可不是为了装饰哦,那是为了配重(平衡): 侧面看看,靓丽的身影: ...…

查看全部问答∨

几种常用的虚拟仪表仪表

http://66.249.89.132/translate_c?hl=zh-CN&sl=en&u=http://www.abacom-online.de/uk/html/demoversionen.html&prev=/search%3Fq%3DC51%2Bcompiler%26hl%3Dzh-CN%26client%3Daff-cs-360se%26hs%3Dbtg%26sa%3DN%26start%3D50%26newwindow%3D1 ...…

查看全部问答∨

为什么我的复位电平上不去?

复位芯片采用MAX811,MCU采用C8051F020,上电后,电源电压时3.3V,为什么复位电平只有1.36V? …

查看全部问答∨

请教几句2440 NBoot中的汇编代码

    ; Set up the memory control registers.     ;     add     r0, pc, #SMRDATA - (. + 8)     ldr                r1, =BWSCON  ...…

查看全部问答∨

8*8的LED点阵如何区分共阴共阳?

8*8的LED点阵如何区分共阴共阳?…

查看全部问答∨

用了lut1lut的I2C函数,终于搞定,谢谢各位...

                                  …

查看全部问答∨

低电平测量对测试夹具有何要求?

对用于低电平测量的测试夹具有几个重要的要求: * 绝缘电阻[1]:所有连接器、内部连线、端子和插座等的绝缘电阻都应当尽可能地高。一般地说,在高质量的测试夹具中,所有的连接器和插座都使用聚四氟乙烯绝缘材料。 * 屏蔽[2]和保护:测试夹具 ...…

查看全部问答∨

一段嵌入式代码的理解

int main(void){         // disable JTAG port    DDPCONbits.JTAGEN = 0;           // 3.2 initialization    TRISB = 0;  & ...…

查看全部问答∨

问:请解释下面的c程序,最好是详细的解释。谢谢。

#define GPBCON    (*(volatile unsigned long  *)0x56000010) #define GPBDAT    (*(volatile unsigned long  *)0x56000014) # define GPB5_out    (1<<(5*2)) GPBCON  =&nbs ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved