定时器详解

article/2025/10/10 23:36:47

1. 什么是定时器(timer)

定时器实际上就是Soc当中的一个内部外设。

(1)定时器与计数器

定时器常与计数器扯到一起,计数器也是soc当中的一个内部外设,计数器顾名思义是用来计数的,就和我们的秒表一样,秒表实际上就是一个计数器,每隔一个单位走一个格(就是计一个数),因为计数器的计数时间周期是固定的,因此到了一定时间只要用计数值*计数时间周期,就能得到一个时间段,这个时间段就是我们定的时间(这就是定时器了)。计数器和定时器其实是一回事。

(2)定时器/计数器作为SoC的外设,主要用来实现定时执行代码的功能。定时器相对于SoC来说,就好像闹钟相对于人来说意义一样。单核的CPU是单线程的,只能干一件事情,干完这件事情完去干另一件事情需要定时器来提醒。

2. 定时器有什么用

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

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

3. 定时器的原理

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

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

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

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

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

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

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

(4)蜂鸣器是一个发声的设备,

在ARM里面蜂鸣器是用定时器模块来驱动的。

5. S5PV210的定时器

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

(1)PWM定时器

这种是最常用的,平时所说的定时器一般指的是这个。像简单单片机(譬如51单片机)中的定时器也是这一类。

为什么叫PWM定时器,因为一般SoC中产生PWM信号都是靠这个定时器模块的。

(2)系统(指操作系统)定时器

系统定时器也是用来产生固定时间间隔(TCNTX时钟周期)信号的,称为systick,这个systick用来给操作系统提供tick信号。

产生systick作为操作系统的时间片(time slice)的。

一般做操作系统移植的时候,这里不会由我们自己来做,一般原厂提供的基础移植部分就已经包含了。

(3)看门狗定时器

看门狗定时器本质上也是一个定时器,和上面2个没有任何区别。

看门狗定时器可以设置在时间到了的时候产生中断,也可以选择发出复位信号复位CPU(比一般的定时器多了这个功能)。

定时器归零前去喂狗,要不然看门狗定时器会复位系统。如果程序跑飞了,就没人去喂狗了,看门狗定时器会复位系统。

普通的定时是产生一个中断,看门狗定时器是产生一个复位信号。

看门狗定时器在实践中应用很多,尤其是工业领域(环境复杂、干扰多)机器容易出问题,而且出问题后后果很严重,此时一般都会用看门狗来进行系统复位。

(4)实时时钟RTC(real time clock)

区分时间段和时间点:时间段是相对的,两个时间点相减就会得到一个时间段;而时间点是绝对的,是绝无仅有的一个时间点。

定时器关注的是时间段(而不是时间点),定时器计时从开启定时器的那一刻开始,到定时间段结束为止中断。RTC中工作用的是时间点(xx年x月x日x分x秒星期x)。

RTC和定时器的区别,就相当于是钟表(没有闹钟功能的那种)和闹钟(不能看时间的那种,比如风扇定时)的区别。

6. 为什么叫PWM定时器

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

(2)叫PWM定时器,是因为这个定时器天然是用来产生PWM波形的。(和普通定时器没啥区别,就像外卖自行车就是专门用来送外卖的,本质上还是自行车啊)

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

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

图中MUX(梯形)是多选一的开关

(5)S5PV210的PWM定时器框图简介

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

(6)预分频器和分频器

两级分频是串联(级联)的、所以两级分频的分频数是相乘的。
两级分频的分频系数分别在TCFG0和TCFG1两个寄存器中设置。(编程就是通过设置寄存器来控制硬件,寄存器就是硬件的窗口)

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

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

计算一下,两级分频下来,分频最小为1/2,最大分频为1/256 x 16(1/4096)

在PCLK_PSYS为66MHz的情况下(默认时钟设置就是66MHz的),此时两级分频后的时钟周期范围为0.03us到62.061us;

再结合TCNTB的值的设置(范围为1~2的32次方),可知能定出来的时间最长为266548.27s(折合74小时多,远远够用了)。

(7)TCNT&TCMP、TCNTB&TCMPB  TCNTO

TCNT&TCNTB是相对应的,TCNTB是有地址的寄存器,供程序员操作;TCNT在内部和TCNTB相对应,它没有寄存器地址,程序员不能编程访问这个寄存器。TCNTB的值一直保持程序员放进去的值,真正用来减的值是TCNT,刚开始TCNTB把写进来的值复制一份给了TCNT。TCNTO是用来实时读取TCNT寄存器的值的。

总结:因为TCNT寄存器不能读写,其功能是用来减1的,它是内部的。往TCNT里面写靠TCNTB,读靠TCNTO

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

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

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

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

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

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

7.  什么是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波形来调制电流进行调光。用来驱动蜂鸣器等设备。

8. 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波形的周期是TCNTBx时钟周期(PCLK_PSYS经过两级分频后得到的时钟周期)。注意这个周期是PWM中高电平+低电平的总时间,不是其中之一。

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

TCMPB就是用来和TCNT进行比较的,一旦TCNT的值比TCMPB小,GPIO电平就会翻转

上图上侧水平的代表TCMPB,斜的代表TCNTB

9. 输出电平翻转器

(1)PWM定时器可以规定:当TCNT>TCMPB时为高电平,当TCNT<TCMPB时为低电平。也可以规定:当当TCNT>TCMPB时为低电平,当TCNT<TCMPB时为高电平。在这两种规定下,计算TCMP寄存器的值会变化。

(2)基于上面讲的,当Duty从30%变到70%时,我们TCMPB寄存器中的值就要改(譬如TCNTB中是300时,TCMPB就要从210变化到90)。这样的改板可以满足需要,但是计算有点麻烦。于是乎210的PWM定时器帮我们提供了一个友好的工具叫电平翻转器。

(3)电平翻转器在电路上的实质就是一个电平取反的部件,在编程上反映为一个寄存器位。写0就是关闭输出电平反转,写1就开启输出电平反转。开启后和开启前输出电平刚好高低反转。(输出电平一反转30%的duty就变成70%了)

(4)实战中到底死TCNT和TCMPB谁大谁小时高电平还是低电平,一般不用理论分析,只要写个代码然后用示波器实际看一下出来的波形就知道了;如果反了直接开启电平翻转器即可。

10. 死区生成器

(1)PWM有一个应用就是用在功率电路中用来对交流电压进行整流。整流时2路整流分别在正电平和负电平时导通工作,不能同时导通(同时导通会直接短路 ,瞬间的同事导通都会导致电路烧毁)。大功率的开关电源、逆变器等设备广泛使用了整流技术。特别是逆变器,用SoC的GPIO输出的PWM波形来分别驱动2路整流的IGBT。

(2)PWM波形用来做整流时要求不能同时高或者低,因为会短路。但是实际电路是不会理想的,不可能同时上升/下降沿,所以比较安全的做法是留死区。

(3)死区这东西离不了也多不了。死区少了容易短路。死区多了控制精度低了不利于产品性能的提升。

(4)S5PV210给大家提供了自带的死区生成器,只要开启死区生成器,生产出来的PWM波形就自带了死区控制功能,用户不用再自己去操心死区问题。

(5)大部分人工作是用不到这个的,直接关掉死区生成器即可。

 


http://chatgpt.dhexx.cn/article/QguaJDwk.shtml

相关文章

定时器(Timer)

一、定时器是什么&#xff1f; 定时器类似于我们生活中的闹钟&#xff0c;可以设定一个时间来提醒我们。 而定时器是指定一个时间去执行一个任务&#xff0c;让程序去代替人工准时操作。 标准库中的定时器: Timer 方法作用void schedule(TimerTask task, long delay)指定dela…

STM32-定时器详解

目录 前言 一、定时器基本介绍 1. STM32定时器 2. 通用定时器功能和特点 3. 计数器模式 4. 定时器工作原理 a.定时器框图 b.时钟产生器部分 c.时基单元 d.输入捕获通道 e.输出比较通道&#xff08;PWM&#xff09; 二、定时器中断应用 1.内部时钟选择 2.计数器模式 …

typedef和#define

typedef是c语言中一个重要的关键字其作用是为一种数据类型定义了一个新的名字这里的类型包括&#xff08;int&#xff0c;char,double 等)和自定义数据类型&#xff0c;通俗一点来说就是为一种数据类型起一个别名 举个例子&#xff1a; 定义一个整型变量a并将其初始化为666&a…

typedef和define的区别、typedef的具体用法

typedef最核心的用法&#xff1a;给数据类型取别名&#xff0c;这个别名既可以是此数据类型的替换&#xff0c;也是指向此数据类型的指针。 具体用法&#xff08;对普通数据类型取别名&#xff09;&#xff1a; 对结构体数据类型取别名&#xff1a; typedef与define的区别&…

#define与typedef的区别

目录 &#xff08;1&#xff09;原理不同 &#xff08;2&#xff09;功能不同 &#xff08;3&#xff09;作用域不同 &#xff08;4&#xff09;对指针的操作不同 &#xff08;5&#xff09;补充 a.指针常量 b.常量指针 typedef和define都是替一个对象取一个别名&#x…

C语言中的typedef

C语言中的"typedef" 一、什么是typedef typedef是用于定义新的类型名&#xff0c;在编程中可以用typedef来定义新的类型名来代替已有的类型名 格式&#xff1a; typedef 已有类型名 新的类型名 通俗点说&#xff0c;就是为已有的类型取别名&#xff0c;例如 老鼠&am…

define 与typedef的区别

define 与typedef大体功能都是使用时给一个对象取一个别名&#xff0c;增强程序的可读性&#xff0c;但它们在使用时有以下几点区别&#xff1a; 1.定义不一样 define定义后面不用加分号&#xff0c;并且它的别名在对象的前面 typedef需要加分号&#xff0c;并且它的别后面替…

C语言学习笔记---typedef 简介

在单片机和操作系统中 typedef 会经常用到&#xff0c;它可以为某一个类型自定义名称。和#define比较类似。但是又有不同的地方。 typedef 创建的符号只能用于数据类型&#xff0c;不能用于值。而#define 创建的符号可以用于值。typedef 是由编译器来解释&#xff0c;而不是预…

typedef介绍

[20210330更新]&#xff1a;这篇博客写的时间有点久了:)。本次更新修改了博客内容中的错误和表述不当的地方。 本文介绍C语言中的关键字 typedef 的用法。 1 概述 typedef 为C语言的关键字&#xff0c;作用是为一种数据类型定义一个新名字&#xff0c;这里的数据类型包括内部…

【C语言】typedef的使用

目录 一、什么是typedef 二、typedef用法 1、对于数据类型使用例如&#xff1a; 2、对于指针的使用例如 3、对于结构体的使用 三、进阶typedef 1、数组指针 2、指针函数 3、Int *(*array[3])(int); 4、Void (*funA(int,void(*funB)(int)))(int); 四、Typedef与defin…

ubuntu etc 设置权限777带来的问题

ubuntu etc 设置权限777带来的问题--sudoers权限错误 在一次工作中&#xff0c;在ubutu通过命令行输入 sudo chmod -R 777 /etc 命令&#xff0c;误将etc目录权限更改为了777&#xff08;rwxrwxrwx&#xff09; 导致服务器无法ssh远程连接&#xff0c;而且sudo命令无法使用 提…

Linux修改文件权限为777

将文件权限改为777的命令为chmod 777 文件名 777说明&#xff1a; 你可以在linux终端先输入ll,可以看到如: -rwx-r--r-- (一共10个参数) 第一个跟参数跟chmod无关,先不管. 2-4参数:属于user 5-7参数:属于group 8-10参数:属于others 接下来就简单了:r>可读 w>可写 x&…

文件权限777

一个文件的权限为777(linux中 ls -l xxx.xxx &#xff08;xxx.xxx是文件名,查看的是xxx文件之中的文件权限)) 这三个数字分别表示&#xff1a;不同用户或用户组的权限。 第一个数字表示文件所有者的权限 第二个数字 表示与文件所有者同属一个用户组的其他用户的权限 第三个数…

Linux-权限管理(你听过777、755、644吗)

文章目录 组rwx权限修改权限-chmod修改文件所有者-chown修改文件所在组-chgrp 组 linux 中每个文件有所有者、所在组、其它组的概念。 类似linux 中的每个用户必须属于一个组&#xff0c;不能独立于组外&#xff0c;组的相关操作可参考&#xff1a;Linux-用户管理 所有者 文件…

Linux文件属性的777权限

一、文件属性概述 Linux系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c;Linux系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的规定。在Linux中我们可以使用…

Linux的777权限

Linux的每个文件一般都有三个权限 r–读&#xff0c;w–写&#xff0c;x–执行&#xff0c;其分别对应的数值为4&#xff0c;2&#xff0c;1。 输入ll可以查看到文件的权限。 聪明的同学已经看出来了——7即代表有读、写和执行的权限。那么为什么是三个7呢&#xff1f;“三”是…

Linux 777 权限表示什么,各数字又是什么含义?

最近在面试中&#xff0c;问到了 Linux 777 权限表示什么&#xff0c;各数字的含义又是什么。小格子通过自己的理解和查找的资料&#xff0c;做了如下总结&#xff0c;希望读者们遇到此问题时&#xff0c;可以快速又正确的回答。 1、三种权限 Linux 下的每个文件都有以下三种…

C语言移位运算(<<)

上来个题目给大家感受下 解题 #include<stdio.h> int main() {int x;while(scanf("%d",&x)!EOF){printf("%d\n",1<<x);}return 0; } 输出结果 其他&#xff1a; 运算符含义 运算符含义描述<<左移二进制数左移x位&#xff0c;高…

为什么我的C语言移位操作达不到效果??

为什么我的C语言移位操作达不到效果&#xff1f;&#xff1f;&#x1f632;&#x1f632; 今天下午在对蓝牙数据处理的时候发现&#xff1a; wrwr<<8read_Buffer[2];write(44,wr,0); 达不到预期效果&#xff1b;但把上述代码改为wrwr*256read_Buffer[2];write(44,wr,0…

C语言之移位操作符、位操作符详解

目录 1、移位操作符 2、位操作符 1、移位操作符 分为左移操作符&#xff08;<<&#xff09;和右移操作符(>>)。 左移操作符&#xff1a; 移位规则&#xff1a;左边抛弃&#xff0c;右边补0。 什么意思呢&#xff0c;现在就让我来仔细讲解一番。 比如我们定义…