系统时钟和定时器——PWM定时器

发布者:BlossomBeauty最新更新时间:2016-08-14 来源: eefocus关键字:系统时钟  定时器  PWM定时器 手机看文章 扫描二维码
随时随地手机看文章
时钟控制逻辑给整个芯片提供3种时钟:FCLK用于CPU核;HCLK用于AHB总线设备,比如CPU核、存储器控制器、中断控制器、DMA和USB主机模块等;PCLK用于APB总线上的设备,比如WATCHDOG、IIS、IIC、PWM、MMC、ADC、RTC等等。

S3C2440 CPU核的工作电压为1.2V时,主频可以达到300MHz;工作电压为1.3V时,主频可以达到400MHz。开发板为12MHz,需要通过时钟控制逻辑的PLL提高系统时钟。

S3C2440有两个PLL:MPLL和UPLL。UPLL专用于USB设备,MPLL用于设置FCLK、HCLK、PCLK。

系统时钟和定时器——PWM定时器 - 成 - 学海泛舟
                                                    图1     上电后MPLL的启动过程
LocK Time的长短由寄存器LOCKTIME设定。一般采用默认值。
查看芯片手册,MPLL计算公式如下图:
 
系统时钟和定时器——PWM定时器 - 成 - 学海泛舟

 其中 m=MDIV+8,        p=PDIV+2,        s=SDIV

CLKDIVN寄存器:用于设置FCLK、HCLK、PCLK 三者比例。各种时钟比例对应的寄存器设置如下图所示:

系统时钟和定时器——PWM定时器 - 成 - 学海泛舟

 

系统时钟和定时器——PWM定时器 - 成 - 学海泛舟
 
 
1、 PWM(Pulse Width  Modulation)定时器
S3C2440 有5个16位定时器。其中定时器0、1、2、3有PWM功能,即他们都有一个引脚,可以用过定时器来控制引脚周期性的高低电平变化;定时器4没有输出引脚。定时器时钟源为PCLK。内部结构如图所示:
系统时钟和定时器——PWM定时器 - 成 - 学海泛舟
定时器0 、1 共用第一个预分频器,定时器2 、3、 4 共用第2个预分频器。预分频器的输出进入第二级分频器,它有5种频率的时钟:2、4、8、16分频。预分频通过TCFG0设置,分频值(2、4、8、16)通过TCFG1设置。
 
 现在我们可以归结启动一个PWM功能可以分为以下几步:
1、设置TOUT0-TOUT3,这需要配置相关外部引脚为TOUT模式。外部引脚GPB与TOUT为复用引脚
2、设置定时器的输出频率,并且通过TCFG0设置prescaler(预分频)的值。通过TCFG1设置divider的值。
3、具体脉冲宽度要通过TCMPBn与TCNTBn两个寄存器的设置来完成。这步涉及到寄存器内部逻辑的工作流程。如下:
将TCMPBn和TCNTBn装入初始值,在设置TCON寄存器之后会启动定时器,这时将过TCMPBn与TCNTBn两个寄存器的值装入内部寄存器TCMPn和TCNTn中,在定时器n的工作频率下,TCNTn开始减一计数,在TCNTn的值等于TCMPn的值的时候,TOUTn翻转,当TCNTn的值达到0的时候,再次翻转,就这样周而复始,形成了脉冲。并且触发定时器n的中断(如果设置中断的话)。
 
4、具体控制要交给TCON寄存器。它有以下几个功能:(先看一下数据手册)
系统时钟和定时器——PWM定时器 - 成 - 学海泛舟
 
 由此可以看出,它有以下4个作用:
1、定时器的开始/停止。TCON[0]
2、手动更新。用于手动更新TCNTBn和TCMPBn,这里要注意的是在开始定时时,一定要把这位清零,否则是不能开启定时器。TCON[1]
3、输出反转。TOUTn不反转(0)/反转(1)                TCON[2]
4、自动加载。当定时器计数到0时,TCMPBn和TCNTBn寄存器的值自动装入内部寄存器TCMPn和TCNTn中。TCON[3]
程序分析如下:(这程序是赵春江老师的程序)

 

#include "2440addr.h"

#define U32 unsigned int

typedef unsigned char BOOL;

#define TRUE       1  

#define FALSE     0

 

BOOL stop;

 

static void __irq Key3_ISR(void)         /*暂停键,关闭蜂鸣器*/

{

       rSRCPND = rSRCPND | (0x1<<2); /*定义EINT2*/

       rINTPND = rINTPND | (0x1<<2);

      

       rTCON &= ~0x8;          /*禁止定时器自动重载,即关闭定时器0111*/

       stop = TRUE;

}

 

void __irq Key2_ISR(void)          /*重启键,开启蜂鸣器*/

{

       rSRCPND = rSRCPND | 0x1; /*定义EINT0*/

       rINTPND = rINTPND | 0x1;

      

       stop = FALSE;

}

 

 

void delay(int a)

{

       int k;

       for(k=0;k

              ;

}

 

void Main(void)

{

       int freq;

      

       rGPBCON = 0x155556;        /*B0为TOUT0,B5~B8为输出,给LED      0001 0101 0101 0101 0101 0110*/

       rGPBUP  = 0x7ff;          /*0111 1111 1111关闭上拉使能*/

       rGPFCON = 0xaaaa;             /*F口为EINT,给按钮               1010 1010 1010 1010*/

       /*按钮的一些必要配置*/

       rSRCPND = 0x0f;               /*中断设置*/

       rINTMSK = ~0x0f;

       rINTPND =0x0f;

       rEXTINT0 = 0x2222;             /*EINT0/EINT1均设置为下降沿触发*/

      

       freq = 2500;

      

       rTCFG0 &= 0xFFFF00;

       rTCFG0 |= 0x31;    /*prescal 是49 3*16+1=49 timer0 and timer1*/

       rTCFG1 &= ~0xF;    /*低四位清零 divider value=1/2,因为PCLK为50MHz,所以50MHz/50/2=500kHz/

       rTCNTB0 = 5000;    /*定时器计数初始值*/

       rTCMPB0 = freq;    /*定时器比较值*/

       rTCON &= ~0x1F;       

       rTCON |= 0xf;              /*死区无效,自动装载,电平反转,手动更新,定时器开启*/

       rTCON &= ~0x2 ;  /*手动更新位清零,PWM开始工作*/

      

       pISR_EINT0 = (U32)Key2_ISR;

       pISR_EINT2 = (U32)Key3_ISR;

 

       stop = FALSE;

      

       rGPBDAT = ~0x60;              /*两个LED亮*/

      

       while(1)

       {

              /*频率递增*/

              for ( ; freq<4950 ; )

              {

                     freq+=10;

                     rTCMPB0 = freq;          /*重新赋值*/

                     delay(20000);

                    

                     while (stop == TRUE)          /*是否暂停*/

                     {

                            delay(1000);

                            if (stop ==FALSE)        /*判断是否重启*/

                            {

                                   rTCON &= ~0x1F;

                                   rTCON |= 0xf;

                                   rTCON &= ~0x2 ;               /*恢复PWM功能*/

                            }

                     }

                     /*4个LED随着频率的高低,时灭时亮。灯亮的数目4-3-2-1*/

                     if(freq == 100)

                            rGPBDAT = ~0x560; /*0001 1110 0000 取反之后1110 0001 1111*/

                     if(freq == 1300)

                     rGPBDAT = ~0x160;         /*1110 0000   取反之后   0001 1111*/

                     if(freq == 2500)

                            rGPBDAT = ~0x60; /*0110 0000    取反之后    1001 1111*/

                     if(freq == 3700)

                            rGPBDAT = ~0x20; /*0010 0000   取反之后     1101 1111*/

                     if(freq == 4900)

                            rGPBDAT = ~0x0; /*0000         取反之后     1111111111*/

                           

              }

             

              /*频率递减*/

              for( ; freq>50 ; )

              {

                     freq-=10;

                     rTCMPB0 = freq;

                     delay(20000);

                     while (stop == TRUE)

                     {

                            delay(1000);

                            if (stop ==FALSE)

                            {

                                   rTCON &= ~0x1F;

                                   rTCON |= 0xf;

                                   rTCON &= ~0x2 ;

                            }

                     }

                     if(freq == 100)

                            rGPBDAT = ~0x560;

                     if(freq == 1300)

                            rGPBDAT = ~0x160;

                     if(freq == 2500)

                            rGPBDAT = ~0x60;

                     if(freq == 3700)

                            rGPBDAT = ~0x20;

                     if(freq == 4900)

                            rGPBDAT = ~0x0;

              }

       }    

}

 

TOUT输出的波形是:
  
系统时钟和定时器——PWM定时器 - 成 - 学海泛舟
 上图是频率上升时的大致波形图。由此可以看出高电平在每个周期中维持的时间越来越长,低电平时间越来越短。频率下降时的波形图正好相反。
关键字:系统时钟  定时器  PWM定时器 引用地址:系统时钟和定时器——PWM定时器

上一篇:系统时钟和定时器——看门狗定时器
下一篇:S3C2440外部中断之按键中断

推荐阅读最新更新时间:2024-03-16 15:04

51单片机-定时器中断函数的使用
1.定时器与延时的区别 大家可能会觉得我们用延时函数照样可以实现上一讲代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效率。 而定时器是不需要占用CPU的使用权的,它是独立自己运行的,就像我们在第一讲的时候提到调好5分钟的闹钟,在这5分钟里我们可以随意执行任务,也可以什么事都不做,但是5分钟过后闹钟响了就要执行相关的任务了。 所以上一讲的代码的实现原理就是每隔51微秒,有个变量会自加1,过了1000个51微秒的时候LED的状态才会改变,可以说CPU在51ms的时间里基本没什么事做,只是在51微秒到了的时候做了“cnt++;”这样简单的任务,然
[单片机]
51单片机-<font color='red'>定时器</font>中断函数的使用
STM32定时器学习笔记
TIMx是由16位计数器,预分频器,自动装载寄存器构成 计数器:16位(0-65535) 预分频器16位(寄存器控制的计数器) 预分频为1是每一个时间脉冲计数器加1,预分频为2每两个时间脉冲计1. 自动装载寄存器:每次溢出事件的自动装载设置的计数值。 深度剖析:、 计数器的范围(0-65535) 预分频器的范围(0-65535) 由于STM32F103最大支持的频率是72Mhz,所以设置的时候应该注意二者之间的,一般自动装载计数器设置较大若设置10000-1,将预分频书设置为72-1,可以实现1s的计时。可以理解为每72个时钟脉冲计数器加1,计数器加到10000-1的时候定时器产生一次溢出事件。
[单片机]
stm32f103基本定时器定时器中断服务程序里面输出脉冲波形
main.c /**定时器中断TIM3方式,(当基本定时器不用PWM输出) 设计两路输出两路脉冲波: 周期:100us,占空比80% 周期:100us,占空比20%**/ int main(void) { LED_Init();//pc14引脚初始化 BEEP_Init();/pc13引脚初始化 TIME_Init();//定时器初始化 while(1); } time.c #include stm32f10x.h #include time.h #include delay.h #include beep.h #include stdio.h void TIME_Init(void) {
[单片机]
stm32f103基本<font color='red'>定时器</font>,<font color='red'>定时器</font>中断服务程序里面输出脉冲波形
MSP430F249_TimerA定时器
/****************************************************************** ** ** File : TimerA.c | Timer Interrupt | ** Version : 1.0 ** Description: TimerA Interrupt ** Author : LightWu ** Date : 2013-4-16
[单片机]
stm32F40x系统滴答定时器计算方法及应用
系统滴答定时器计算方法,在这记录一下,防止时间久了遗忘 下图是:时钟树的一小部分:在STM32F4xx中文参考手册.pdf文档第107页可以找到。 框架图: 控制状态寄存器: SysTick- CTRL 自动重装载寄存器:SysTick- LOAD 当前值寄存器: SysTick- VAL 校准值寄存器: SysTick- CALIB 上面框架图是来自于:Cortex M3权威指南(中文).pdf 文档第282-315页 1、换算与时钟源选择 外部时钟源: HCLK = 168MHz / 8 内核时钟: HCLK = 168MHz 这里选择了 168MHz / 8 = 21MHz
[单片机]
stm32F40x<font color='red'>系统</font>滴答<font color='red'>定时器</font>计算方法及应用
系统时钟定时器——看门狗定时器
看门狗定时器和普通定时器一样。只是普通定时器一般是段一段时间,待时间结束后,进入中断处理程序中,而看门狗在定义的时间结束时,并不希望中断发生,为了防止中断发生,就要在中断发生前,对看门狗定时器某些寄存器进行重新赋值,使它重新开始计数,俗称喂狗操作。 WATCHDOG定时器所涉及的寄存器如下: 1、WTCON寄存器 用于设置预分频系数、选择工作频率、决定是否使能中断、是否启用WATDOG功能(即是否输出复位信号)。 WATDOG定时器工作频率=PCLK/(prescaler value+1)/(divider value) prescaler value=0~255; divider value=16,32,64,128;
[单片机]
<font color='red'>系统</font><font color='red'>时钟</font>和<font color='red'>定时器</font>——看门狗<font color='red'>定时器</font>
利用定时器0写秒表(注释)
利用定时器定时出秒表时间,通过共阴数码管将所定时的时间显示出来。 #include reg52.h #define uchar unsigned char #define uint unsigned int uchar code table = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共阴段码表 uchar code table_SMG = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//位选 //------------------------变量区----------------
[单片机]
利用<font color='red'>定时器</font>0写秒表(注释)
AT89S52的看门狗定时器详情分析
  AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。   AT89S52主要性能:   1、与MCS-51单片机产品兼容;   2、8K字节在系统可编程Flash存储器;   3、1000次擦写周期;   4、全静态操作:0Hz-33MHz;   5、三级加密程序存储器;   6、32个可编程I/O口线;   7、
[单片机]
AT89S52的看门狗<font color='red'>定时器</font>详情分析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved