S5PV210系列 (裸机十一)之 定时器、看门狗和RTC(一)

什么是定时器(timer)

定时器是SoC中常见外设

(1)定时器与计数器。计数器是用来计数的(每隔一个固定时间会计一个数);因为计数器的计数时间周期是固定的,因此到了一定时间只要用计数值 × 计数时间周期,就能得到一个时间段,这个时间段就是我们定的时间( 这就是定时器了)

(2) 定时器 / 计数器 作为 SoC 的外设,主要用来实现定时执行代码的功能。定时器相对于 SoC 来说,就好像闹钟相对于人来说意义一样。

定时器有什么用

(1)定时器可以让SoC在执行主程序的同时,可以(通过定时器)具有计时功能,到了一定时间(计时结束)后,定时器会产生中断提醒CPU,CPU会去处理中断并执行定时器中断的ISR。从而去执行预先设定好的事件。

(2)定时器就好象是CPU的一个秘书一样,这个秘书专门管帮CPU来计时,并到时间后提醒CPU要做某件事情。所以CPU有了定时器之后,只需预先把自己xx时间之后必须要做的事情绑定到定时器中断ISR即可,到了时间之后定时器就会以中断的方式提醒CPU来处理这个事情。

定时器的原理

(1)定时器计时其实是通过计数来实现的。定时器内部有一个计数器,这个计数器根据一个时钟(这个时钟源来自于 ARM 的 APB 总线,然后经过时钟模块内部的分频器来分频得到)来工作。每隔一个时钟周期,计数器就计数一次,定时器的时间就是计数器计数值 × 时钟周期。

(2)定时器内部有 1 个寄存器 TCNT,计时开始时我们会把一个总的计数值(譬如说300)放入 TCNT 寄存器中,然后每隔一个时钟周期(假设为1ms)TCNT 中的值会自动减 1(硬件自动完成,不需要 CPU 软件去干预),直到 TCNT 中减为 0的时候,TCNT 就会触发定时器中断。

(3)定时时间是由 2 个东西共同决定的:一个是 TCNT 中的计数值,一个是时钟周期。譬如上例中,定时周期就为 300×1ms = 300ms。

定时器和看门狗、RTC、蜂鸣器的关系

(1)这几个东西都是和时间有关的部件。

(2)看门狗其实就是一个定时器,只不过定时时间到了之后不只是中断,还可以复位CPU

(3)RTC是实时时钟,它和定时器的差别就好象闹钟(定时器)和钟表(RTC)的差别一样。

(4)蜂鸣器是一个发声设备,在 ARM 里面蜂鸣器是用定时器模块来驱动的。

S5PV210中的定时器

在 S5PV210 内部,一共有 4 类定时器件。这 4 类定时器件的功能、特征是不同的。

PWM 定时器
(1)这种是最常用的,平时所说的定时器一般指的是这个。像简单单片机(譬如 51单片机)中的定时器也是这类。
(2)为什么叫 PWM 定时器,因为一般 SoC 中产生 PWM 信号都是靠这个定时器模块的。

系统定时器
(1)系统(指的是操作系统)定时器,系统定时器也是用来产生固定时间间隔( TCNT × 时钟周期)信号的,称为 systick,这个 systick 用来给操作系统提供 tick信号。
(2)产生 systick 作为操作系统的时间片(time slice)的。
(3)一般做操作系统移植的时候,这里不会由我们自己来做,一般原厂提供的基础移植部分就已经包含了,所以这里我也从来没有研究过。

看门狗定时器
(1)看门狗定时器本质上也是一个定时器,和上面 2 个没有任何本质区别。
(2)看门狗定时器可以设置在时间到了的时候产生中断,也可以选择发出复位信号复位 CPU。
(3)看门狗定时器在实践中应用很多,尤其是工业领域(环境复杂、干扰多)机器容易出问题,而且出问题后后果很严重,此时一般都会用看门狗来进行系统复位。本章节会用 2节课 来对 210 中的看门狗进行讲解和编程。

实时时钟 RTC(real time clock)
(1)区分时间段和时间点。时间段是相对的,两个时间点相减就会得到一个时间段;而时间点是绝对的,是绝无仅有的一个时间点。
(2)定时器关注的是时间段(而不是时间点),定时器计时从开启定时器的那一刻开始,到定的时间段结束为止产生中断;RTC 中工作用的是时间点(xx年x月x日x时x分x秒星期x)。
(3)RTC 和 定时器 的区别,就相当于是钟表和闹钟的区别。

S5PV210的PWM定时器

为什么叫PWM定时器

(1)叫定时器说明它本质上的原理是定时器

(2)叫PWM定时器,是因为这个定时器天然是用来产生PWM波形的。

PWM定时器介绍

(1) S5PV210 有 5 个 PWM 定时器。其中 0、1、2、3 各自对应一个外部 GPIO,可以通过这些对应的 GPIO 产生 PWM 波形信号并输出;timer4 没有对应的外部GPIO(因此不是为了生成 PWM 波形而是为了产生内部定时器中断而生的)

(2) S5PV210 的 5 个 PWM 定时器的时钟源为 PCLK_PSYS,timer0 和 timer1 共同使用一个预分频器、timer2、3、4 共同使用一个预分频器;每个 timer 有一个专用的独立的分频器;预分频器和分频器构成了 2 级分频系统,将 PCLK_PSYS 两级分频后生成的时钟供给 timer 模块作为时钟周期。

S5PV210的PWM定时器框图简介

(1)关键点:时钟源、预分频器、分频器、TCMPB&TCNTB、dead zone

这里写图片描述

预分频器与分频器

(1)两级分频是串联(级联)的,所以两级分频的分频数是相乘的。

(2)两级分频的分频系数分别在TCFG0和TCFG1两个寄存器中设置。

(3)预分频器有2个,prescaler0 为 timer0 & timer1 共用;prescaler1 为timer2、3、4共用;两个 prescaler 都是 8 个 bit 位,因此 prescaler value 范围为 0〜255;所以预分频器的分频值范围为 1〜256 (注意实际分频值为prescaler value + 1)。

(4)分频器实质上是一个MUX开关,多选一开关决定了走哪个分频系数路线。可以选择的有1/1,1/2,1/4,1/8,1/16等。

(5)计算一下,两级分频下来,分频最小为1/1(也可能是1/2),最大分频为1/256×16(1/4096).

(6)在PCLK_PSYS为66MHz的情况下(默认时钟设置就是66MHz的),此时两级分频后的时钟周期范围为0.03us到62.061us;再结合TCNTB的值的设置(范围为1〜2的32次方),可知能定出来的时间最长为266548.27s(折合74小时多,远远够用了)。

TCNT&TCMP、TCNTB&TCMPB、TCNTO

(1) TCNT 和 TCNTB 是相对应的,TCNTB 是有地址的寄存器,供程序员操作;TCNT 在内部和 TCNTB 相对应,它没有寄存器地址,程序员不能编程访问这个寄存器。

(2) TCNT 寄存器功能就是用来减 1 的,它是内部的不能读写;我们向 TCNT 中写要通过TCNTB往进写;读取TCNT寄存器中的值要通过读取相对应的TCNTO寄存器。

(3)工作流程就是:我们事先算好 TCNT 寄存器中开始减的那个数(譬如 300 ),然后将之写入 TCNTB 寄存器中,在启动 timer 前,将 TCNTB 中的值刷到TCNT 寄存器中(有一位寄存器专门用来操作刷数据过去的),刷过去后就可以启动定时器开始计时;在计时过程中如果想知道 TCNT 寄存器中的值减到多少了,可以读取相应的 TCNTO 寄存器来得知。

(4)定时功能只需要 TCNT、TCNTB 两个即可;TCNTO 寄存器用来做一些捕获计时;TCMPB 用来生成 PWM 波形。

自动重载和双缓冲( auto-reload and double buffering )

(1)定时器工作的时候,一次定时算一个工作循环。定时器默认是单个循环工作的,也就是说定时一次,计时一次,到期中断一次就完了。下次如果还要再定时中断,需要另外设置。

(2)但是现实中用定时器来做的时候往往是循环的,最简单最笨的方法就是写代码反复重置定时器寄存器的值(在每次中断处理的 isr 中再次给 TCNTB 中赋值,再次刷到 TCNT 中再次启动定时器),早期的单片机定时器就是这样的;但是现在的高级 SoC 中的定时器已经默认内置了这种循环定时工作模式,就叫自动装载(auto-reload)机制。

(3)自动装载机制就是当定时器初始化好开始计时后再不用管了,他一个周期到了后会自己从 TCNTB 中再次装载值到 TCNT 中,再次启动定时器开始下个循环。

S5PV210的PWM定时器

什么是PWM?

(1)PWM(pulse wide modulation 脉宽调制)

(2)PWM波形是一个周期性波形,周期为T,在每个周期内波形是完全相同的。每个周期内由一个高电平和一个低电平组成。

(3)PWM波形有2个重要参数:一个是周期T,另一个是占空比duty(占空比就是一个周期内高电平的时间除以周期时间的商)。

(4)对于一个PWM波形,知道了周期T和占空比duty,就可以算出这个波形的所有细节。譬如高电平时间为T*duty,低电平时间为T*(1-duty)。

(5)PWM波形有很多用处,譬如通信上用PWM来进行脉宽调制对基波进行载波调制;在发光二极管LED照明领域可以用PWM波形来调制电流进行调光;用来驱动蜂鸣器等设备。

PWM波形的生成原理

(1)PWM波形其实就是用时间来控制电平高低,所以用定时器来实现PWM波形是天经地义的。

(2)早期的简单单片机里(譬如51单片机)是没有专用的PWM定时器的,那时候我们需要自己结合 GPIO 和定时器模块来手工生产 PWM波形(流程是这样:先将 GPIO 引脚电平拉高、同时启动定时器定 T*duty 时间,时间到了在 isr 中将电平拉低,然后定时 T*(1-duty) 后再次启动定时器,然后时间到了后在 isr 中将电平拉高,然后再定时 T*duty 时间再次启动定时器····如此循环即可得到周期为T,占空比为 duty 的 PWM 波形)。

(3)后来因为定时器经常和 PWM 产生纠结一起,所以设计 SoC 的时候就直接把定时器和一个 GPIO 引脚内部绑定起来了,然后在定时器内部给我们设置了 PWM 产生的机制,可以更方便的利用定时器产生 PWM 波形。此时我们利用 PWM 定时器来产生 PWM 波形再不用中断了。绑定了之后坏处就是 GPIO 引脚是固定的、死板的、不能随便换的;好处是不用进入中断 isr 中,直接可以生成 PWM。

(4)在 S5PV210 中,PWM 波形产生有 2 个寄存器很关键,一个是 TCNTB、一个是 TCMPB。其中,TCNTB 决定了 PWM 波形的周期,TCMPB 决定了 PWM 波形的占空比。

(5)最终生成的 PWM 波形的周期是:TCNTB × 时钟周期( PCLK_PSYS 经过两极分频后得到的时钟周期)。注意这个周期是 PWM 中高电平+低电平的总时间,不是其中之一。

(6)最终生成的 PWM 波形的占空比是:TCMPB / TCNTB

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值