S5PV210中的定时器

发布者:Yudie最新更新时间:2025-02-08 来源: cnblogs关键字:S5PV210  定时器 手机看文章 扫描二维码
随时随地手机看文章

什么是定时器?

  • 定时器是SoC中常见外设

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

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

定时器有什么用?

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

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

定时器的工作原理?

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

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

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

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

  • 这几个都是和时间有关的部件。

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

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

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

 S5PV210中的定时器

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

 

PWM定时器

 

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

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

 

系统定时器

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

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

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

看门狗定时器

  • 本质上也是一个定时器,和上面的2个定时器没有本质区别

  • 看门狗定时器可以设置在时间到的时候产生中断也可以选择发出复位信号复位CPU。

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

实时时钟RTC(real time clock)

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

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

  • RTC和定时器的区别就相当于钟表和闹钟的区别

S5PV210的PWM定时器1

为什么叫PWM定时器

  • 叫定时器说明它本质上的原理始定时器

  • 叫PWM定时器,是因为它天然就是用来产生PWM波形的

PWM定时器介绍

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

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

S5PV210的PWM定时器框图简介

  • 时钟源、预分频器、分频器 、TAMP&TCNTB、dead zone

 

S5PV210的PWM定时器2

预分频器与分频器

  • 两级分频是串联(级联)的,所以两级分频 是相乘的

  • 两级分频的分频系数分别在TCFG0和TCFG1两个寄存器中设置

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

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

  • 经计算,两级分频下来,分频最小为1/1(也可能是1/2),最大分频为1/256*16 (1/4096)

  • 在PCLK_PSYS为66MHz的情况下(默认就是66MHz),此时两级分频后始终范围位0.03us到62.061us;再结合TCNTB的设置(范围为1~2的32次方)得出能定出来的时间最长位266548.27s(折合74小时多,远远够用)

TCNT&TCMP、TCNTB&TCMPB、TCNTO

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

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

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

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

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

  • 但是现实生活中我们用定时器来工作的时候往往是需要循环的。那么最简单最笨的办法就是写代码反复重置寄存器的值(即每次中断处理isr中再次给TCNTB中赋值,再次刷到TCNT,再次启动定时器。)早期的一些单片机就是这样的。但是现在的高级SoC已经默认内置了这种循环定时工作模式,就是自动重装载机制

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

定时功能只需要TCNT TANTB 即可。 TANTO 寄存器用来做一些捕获计时。TCMPB用来生成PWM波形。

S5PV210的PWM定时器3

什么是PWM?

  • PWM(pulse wide modulation脉宽调制)

  • PWM波形是一个周期性波形,周期位T,在每个周期内由一个高电平和一个低电平组成。

  • PWM波形有两个重要参数:一个是周期T,另外一个是占空比duty(在一个周期内高电平所占这个周期的比例)。

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

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

PWM波形的生成原理

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

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

  • 后来因为定时器经常和PWM产生纠结在一起,所以设计SoC的时候就直接把定时器和一个GPIO引脚绑定起来了,然后再定时器内部设置了产生PWM的机制,可以更方便的利用定时器产生PWM波形。绑定后的患处就是GPIO的引脚是固定的不能随便换了。好处是不用进入isr自动生成PWM波形

  • 在S5PV210中,PWM波形的产生有两个寄存器很关键,一个是TCNTB,另外一个是TCMPB,一个决定了周期,一个决定了占空比。

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

  • 最终生成的PWM波形的占空比:TCMPB/TCNTB

输出电平翻转器

  • PWM定时器可以规定:当TCNT>TCMPB时为高电平,当TCNT

  • 也可以规定为:当TCNTTCMPB时为低电平。这两种规定下,计算是TCMP寄存器的值会变化

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

  • 电平反转器在电路上的是指就是一个电平取反,在编程上反映为一个寄存器位。写0就关闭输出电平反转,写1就开启电平反转,开启前和开启后刚好电平高低刚好相反

  • 一般实战中到底TCNT和TCMPB谁大谁小时不需要理论分析,只需要用示波器看一下实际出来的波形就知道了,如果犯了二舅直接开启电平翻转器就可以了。

死区生成器

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

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

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

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

  • 大部分人是用不到这个的,直接关掉死区生成器就可以了。

 蜂鸣器和PWM定时器编程实践1

蜂鸣器的工作原理

  • 蜂鸣器里面有2个金属片,离的很紧但没挨着,没电的时候两个弹簧片在弹簧本身张力的作用下彼此分开批次平行,有电的时候,两边充电,有异性电荷的吸引力作用下,两个片挨着。

  • 我们只要以快速的频率给蜂鸣器以快速的频率给蜂鸣器正负极供电、断电。进行这样的循环,蜂鸣器的两个弹簧片就会挨着和分开循形成敲击。

  • 因为人的耳朵能听见的身音频率有限制(20Hz~20000Hz),我们做实验时一般给2KHz频率,大部分人能听到。

  • 频率高低会影响声音的音频,一般音频越低,身音越低沉,身音越高,身音越尖锐。

  • 根据以上的分析,可以看出只要用PWM波形的电压信号来驱动蜂鸣器,吧PWM波形的周期T设置为要发出的声音信号的频率分之1就可以。PWM的占空比只要确保能驱动蜂鸣器就可以。一般的引脚的驱动能力都不够,所以一般蜂鸣器都胡勇三极管来放大

原理图和硬件信息

  • 查阅原理图可知:开发板底板上的蜂鸣器通过GPD0_2(XpwmTOUT2)引脚连接在SoC上。

  • GPD0_2引脚通过限流电阻接在三极管基极上,引脚有电,蜂鸣器就会有电(三极管导通);引脚没电蜂鸣器就会没电(三极管截止)。这些都是硬件工程师的问题,软件工程师只需要写程序控制GPD0_2引脚的电平产生PWM波形就可以了。

  • GPD0CON(0xE02000A0),要把bit8~bit11设置成0b0010(功能位TOUT_2,就是把这个引脚设置为PWM输出功能)

  • 从GPDO_2引脚可以反推出使用的是timer2这个PWM定时器

PWM定时器的主要寄存器详解

  • 相关的寄存器有TCFG0,TCFG1 、TCON、 TCNTB2 、TCMPB2 、TCONO2

蜂鸣器和PWM定时器编程实践2 

基于uart——stdio项目源码来添加PWM定时器驱动蜂鸣器实验

注意:PWM定时器来产生PWM波形时是不需要中断干预的。

 

看门狗定时器

什么是看门狗、有什么用?

  • 看门狗定时器和普通的定时器 并无本质区别。定时器可以设定一个时间,在这个时间完成之前定时器不断计时,时间到的时候定时器会复位CPU(重启系统)

  • 系统正常工作的时候当然不希望被重启,但是系统受到干扰、或者极端环境下可能会产生异常工作或者不工作,这种状态可能会造成不良影响(至少是不工作)此时的解决方案是重启系统。

  • 普通设备重启不是问题,但是有些设备人工重启存在困难。这时候我们希望系统能自己检测自己是否跑飞,并且在意识到自己跑飞的时候,可以很快的自我重启。这个功能就要靠看门狗定时器实现

  • 典型应用情景是:我们在应用程序中打开看门狗设备,初始化好给他一个时间,然后应用程序会使用一个线程来喂狗,这个线程的执行时间是安全短于看门狗的复位时间。当系统(或者应用程序)异常后,喂狗线程自然就不工作了,然后到时候看门狗就会复位

补充:实战中有时候为了绝对的可靠,我们并不会用SoC中自带的看门狗,而是使用专门的外置的看门狗芯片来实现看门狗。

S5PV210看门狗定时器的结构框图

  • PCLK_PSYS经过两级分频后生成WDT(watchdog timer )的时钟周期然后把要定的时间写到WTDAT中,刷到WTCNT寄存器中去减1,减到0时(定时间到)产生复位信号或者中断信号。

  • 典型应用中是配置为产生复位信号,应该在WTCNT寄存器减到0时之前给WTDAT寄存器中重新写值以喂狗

看门狗定时器的主要寄存器

  • WTCON    WTDAT    WTCNT   WTCLRINT

看门狗定时器的编程实战

  • 产生中断信号

  • 产生复位信号

实时时钟RTC

何为实时时钟

  • real time clock,真实时间,就是所谓的xx年xx月xx日xx时xx分xx秒星期x

  • RTC是SoC中一个内部外设,RTC有自己独立的晶振提供RTC时钟源(32.768KHz),内部有一些寄存器用来记录时间(年月日时分秒)。一般情况下为了在系统关机时间仍在走,还会给RTC提供一个电池供电。

S5PV210实时时钟的结构框图

  • 时间寄存器7个

  • 闹钟发生器

闹钟发生器

  • 可以定闹钟时间,到时间会产生RTC alarm interrupt,通知系统闹钟定时到了

  • 闹钟定时时定的时间点,而timer定时是定的时间段

S5PV210实时时钟的主要寄存器

  • INTP  中断挂起寄存器

  • RTCCON  RTC控制寄存器

  • RTCALM ALMxxx  闹钟功能相关寄存器

  • BCDxxx  时间寄存器

BCD码

  • RTC中所有的时间(年月日时分秒星期,包括时钟)都是BCD编码的

  • BCD码本质上是对数字的一种编码。用来解决由56得到0x56的问题,或者有0x56得到56的问题,也就是我们希望十进制的56可以被编码为56(这里的56不是十进制的56而是两个数字5和6)

  • BCD码的作用就是可以将十进制数拆成组成这个十进制数的编码,编程编码后就没有了位数的限制。譬如有一个很大的数:123456789123456789如果这个数字纯粹当数字来处理就超过了int的范围,计算机无法处理。要想让计算机处理这个数首先要能表达这个数,表达的方式是先把这个数转成对应的额BCD码(123456789123456789)

  • BCD码在计算机中可以用十六进制的形式来表示,也就是说十进制的56,在计算机中0x56来表达(暂时存储和运算)

  • 需要2个函数,一个是BCD转十进制,一个是十进制转BCD,当我们需要设置时间时(譬如设置位23分),我们需要将这个23转成0x23然后再赋值给相应的寄存器BCDMIN。当我们需要从寄存器BCDMIN中读取一个时间时(譬如读取到的是0x59),需要将之当作BCD码转成十进制再显示(0x59当作BCD码就是59,转成十进制就是59,所以显示就是59)

RTC编程实战

设置实践和读取显示时间

  • 为了安全,默认情况下RTC镀锡而是禁止的,此时写RTC的时间是不允许的,当我们要更改RTC的时间是,应该先打开RTC的读写开关,然后再进行读写操作,操作完了后立即关闭读写开关

  • 读写RTC寄存器时,一定要注意BCD码和十进制之间的切换

  • 年的问题。S5PV210中做了个设定,BCDYEAR寄存器存的不是完整的年数(譬如今年2015年),而是基于2000年的偏移量来存储的。(譬如今年是2015年)而是基于2000年的偏移量买来存储的。烹饪与今年2015世纪存的就是15(1500~2000),还有一些芯片是以1970年为奇点。


关键字:S5PV210  定时器 引用地址:S5PV210中的定时器

上一篇:嵌入式Linux驱动开发日记
下一篇:android2.3 -添加自定义按键:作唤醒功能 .

推荐阅读最新更新时间:2026-03-21 10:33

S5PV210中的定时器
什么是定时器? 定时器是SoC中常见外设 定时器与计数器。计数器是用来计数的(每隔一个固定时间会计一个数),因为计数器的技术时间周期是固定的,因此到了一定时间,只要用计数值乘以技术的时间周期就能得到一个时间段。这个时间段就是我们定的时间(这就是定时器了)。 定时器/计数器作为SoC的外设,主要用来实现定时执行代码功能,定时器相对于SoC来说,就好像闹钟相对于人来说意义一样 定时器有什么用? 定时器可以让SoC在执行主程序的同时,可以(通过定时器)具有计时功能,到了一定时间(计时结束)后,定时器会产生中断提醒CPU,CPU回去处理中断并执行定时器中断的isr从而去执行预先设定好的事件。 定时器就好像是CPU的秘书一样,这
[单片机]
S5PV210时钟,看门狗定时器
晶振:时钟源(操作主要有两个,倍频,分频) A8的时钟源: 时钟域,每个时钟域(不同的最高频率和最低频率)管理着不同的电路模块: 不同的时钟域对应不同电路模块表 时钟电路:懂得看时钟电路(时钟源选择开关配置(MUX_apll),倍频的配置(APLL),分频的配置(DIV_apll)) 更具体可参看arm,007笔记 ----------------------------------------------------------------------------------------------- 看门狗定时器: 功能: 1、定时器:设置一个定时器基准频率,设置一个超时数据值,数据值根据频率来不断减1,减为0
[单片机]
<font color='red'>S5PV210</font>时钟,看门狗<font color='red'>定时器</font>
Linux-3.0.8中基于S5PV210的IRQ模块代码追踪和分析
init/main.c: 1 asmlinkage void start_kernel(void) 2 { 3 ...... 4 early_irq_init(); 5 init_IRQ(); 6 ...... 7 } early_irq_init()函数有两种实现,一种是基于radix tree,一种是定义静态数组,如果要使用radix tree实现的,那么需要打开SPARSE_IRQ配置选项,由于我对数据结构不了解,所以分析以下静态数组实现方式版本的。 /kernel/irq/irqdesc.c 1 struct irq_desc irq_desc __cacheline_aligned_in_
[单片机]
tslib移植(针对s5pv210,cw210开发板)
tslib移植:   tslib是为了控制触摸屏的开源程序,那么为了用于我的开发板(cortex-a8系列的cw210开发板),那么要有特定的配置才能用于指定的开发板。 1.下载tslib-1.4.tar.gz 2.解压: ##tar zxvf tslib-1.4.tar.gz 3.配置: ##cd tslib ##./autogen.sh ##./configure --prefix=$(pwd)/_install --host=arm-linux ac_cv_func_malloc_0_nonnull=yes ps:--prefix=$(pwd)/_install是指定安装目录为当前目录的_install目录 --host
[单片机]
tslib移植(针对<font color='red'>s5pv210</font>,cw210开发板)
S5PV210 点亮Led
GPC1CON, R/W, Address = 0xE020_0080 GPC1DAT, R/W, Address = 0xE020_0084 举例 #define GPC1CON *((volatile unsigned int*)0xE0200080) #define GPC1DAT *((volatile unsigned int*)0xE0200084) *(unsigned int*)GPC1CON &= ~(0xf 12); *(unsigned int*)GPC1CON |= (0x1 12); *(unsigned int*)GPC1DAT &= ~(0x1 3); *(un
[单片机]
<font color='red'>S5PV210</font> 点亮Led
s5pv210 的启动
1、开发板已启动从0x0获取数据(内部64k的硬盘,里面含有三星固化的BL0段代码),将其读到a8软核中,进行运算,主要用于初始化时钟,96k的内部IRAM.并负责 指定启动设备(通常为外部硬盘),从指定的启动设备中拷贝BL1段代码(不超过16k)到I RAM中(96k),并从BL1代码的启示位置开始运行. 2、BL1段代码再从启动设备中取BL1段后面的代码BL2段代码,也将其拷贝到96k的IRAM中(BL1,BL2属于u-boot部分)。并从BL2的起始地址开始运行。 3、然后BL2段代码初始化外部内存以及其他的配置,并将硬盘启动设备中的内核,根文件系统加载到SDRAM中(512m)再到OS开始的起始位置开始运行,并挂载根文件
[单片机]
<font color='red'>s5pv210</font> 的启动
基于s5pv210嵌入式linux系统sqlite3数据库移植
1、下载源码 http://www.sqlite.org/download.html 最新源码为3080100 2、解压 tar xvf XXXXX 3、配置编译环境 运行 ./configure –host=你的交叉编译工具的前缀 –prefix=你想编译安装的位置 我的host为arm-none-linux-gnueabi,prefix为/home/linux/sqlit3-arm 运行后会生成Makefile文件。 4、编译并安装 编译:make 安装:make install 安装完成后会在你设定的目录下生成安装好的文件: bin、include、lib、share bin:为编译完成的sqlite3可执行文件
[单片机]
基于<font color='red'>s5pv210</font>嵌入式linux系统sqlite3数据库移植
【ARM裸机s5pv210 】程序烧录
1.SD卡刷uboot   准备工作   (1)securcrt(115200,数据流控制全不选)   (2)usb转串口驱动   (3)破坏iNand中的bootloader已从SD2启动   (4)九鼎x210_fusingtool.exe   (5)准备好的uboot.bin   流程   (1)使用x210_fusingtool将uboot.bin刷入SD卡   (2)板子启动方式选择emmc启动   板子启动流程   开机- 读iNand的uboot失败 - 读SD卡uboot成功 - 运行nandflash中的系统 2.用fastboot刷机   准备工作   (1)OTG数据线,禁用数字签名   (2)fastboo
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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