S3C2440PWM 定时器

本文介绍S3C2440A微控制器中定时器的功能特性,特别是PWM功能的实现原理及其配置过程。通过具体实例展示了如何设置定时器0以实现特定频率的PWM输出,用于控制蜂鸣器的发声频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

S3C2440A 有5个16位定时器。其中定时器0、1、2和3具有脉宽调制(PWM)功能。定时器4是一个无输出引脚

的内部定时器。定时器0还包含用于大电流驱动的死区发生器。
        定时器0和1共用一个8位预分频器,定时器2、3和4共用另外的8位预分频器。每个定时器都有一个可以生成5种

不同分频信号(1/2,1/4,1/8,1/16和TCLK)的时钟分频器。每个定时器模块从相应8位预分频器得到其自己的时钟信

号。8位预分频器是可编程的,并且按存储在TCFG0和TCFG1寄存器中的加载值来分频PCLK。
        定时计数缓冲寄存器(TCNTBn)包含了一个当使能了定时器时的被加载到递减计数器中的初始值。定时比较缓

寄存器(TCMPBn)包含了一个被加载到比较寄存器中的与递减计数器相比较的初始值。这种 TCNTBn 和CMPBn

的双缓冲特征保证了改变频率和占空比时定时器产生稳定的输出。 
    每个定时器有它自己的由定时器时钟驱动的 16 位递减计数器。当递减计数器到达零时,产生定时器中断请求通知

CPU定时器操作已经完成。当定时器计数器到达零时,相应的TCNTBn的值将自动被加载到递减计数器以继续下一次

操作。然而,如果定时器停止了,例如,在定时器运行模式期间清除 TCONn 的定时器使能位,TCNTBn的值将不会

被重新加载到计数器中。 
    TCMPBn的值是用于脉宽调制(PWM)。当递减计数器的值与定时器控制逻辑中的比较寄存器的值相匹配时定时

器控制逻辑改变输出电平。因此,比较寄存器决定PWM输出的开启时间(或关闭时间)。

以上为数据手册的描述

定时器专用寄存器有6种共17个寄存器
TCFG0  配置寄存器0
TCFG1 配置寄存器1
TCON 控制寄存器
TCNTBn  计数初值寄存器(5个)
TCMPBn 比较寄存器(4个)
TCNTOn 观察寄存器(5个)

 一个定时器0初始化代码

[cpp]  view plain  copy
  1. void Timer0_Init(void)  
  2. {  
  3.     rTCFG0 &=~(0xFF);   //对TCFG0[0:15]清零  
  4.     rTCFG0 |=99;        //定时器的预分频值为99   
  5.     rTCFG1 &=~(0x0f);   //对TCFG1[0:3]清零  
  6.     rTCFG1 |=0x02;      //选择定时器0,分频值为1/8  
  7.     rTCNTB0 =62500;     //1s中断一次  
  8.     rTCON  |=(1<<1);  //手动更新TCNTB0的值  
  9.     rTCON  =(1<<0)|(1<<3);  //清除手动更新。自动重载,启动定时器0  
  10. }  

说明:
定时器输入时钟频率 = PCLK / {预分频值+1} / {分频值} 
{预分频值} = 0~255 
{分频值} = 2, 4, 8, 16

 

开发板设置的PCLK为50MHZ

定时器输入的时钟频率=(50MHZ)/(99+1)/8=62500HZ

 //开发板的测试蜂鸣器的试验程序(我写出了详细的注释)

[cpp]  view plain  copy
  1. #include "2440addr.h"  
  2. #include "2440lib.h"    //这个只使用了这个文件的延迟函数,和串口有关的函数  
  3.   
  4. void Beep_Freq_Set( U32 freq )  
  5. {  
  6.   
  7.     rGPBCON &=~3;  
  8.     rGPBCON |=2;        //设置GPB0为OUT0  
  9.   
  10.     rGPBUP=0x0;     //使能上拉  
  11.   
  12.     rTCFG0 &=~0xff;  
  13.     rTCFG0 |=15;        //预分频值为15  
  14.       
  15.     rTCFG1 &=~0x0f;  
  16.     rTCFG1 |=0x02;  //分频值为8  
  17.       
  18.     rTCNTB0 = (PCLK>>7)/freq; //设定定时器0计数缓冲器的值     
  19.     rTCMPB0 = rTCNTB0>>1;     // 定时器0比较缓冲器的值,PWM输出占空比50%     
  20.     
  21.     rTCON &= ~0x1f;    
  22.     rTCON |= 0xb;   //自动重载,关闭变相,手动更新,开启定时器0     
  23.     rTCON &= ~2;            //清除手动更新位     
  24. }    
  25.     
  26. void Beep_Stop( void )    
  27. {    
  28.     rGPBCON &= ~3;          //set GPB0 as output     
  29.     rGPBCON |= 1;    
  30.     rGPBDAT &= ~1;       //输出低电平     
  31. }    
  32.   
  33. void Beep_Init(U32 freq, U32 ms)    
  34. {    
  35.     Beep_Stop() ;   
  36.     Delay( ms ) ;    
  37.     Beep_Freq_Set( freq ) ;     
  38. }  
  39.     
  40. void Main()  
  41. {  
  42.     U16 freq=800;  
  43.       
  44.     SelectFclk(2);  //设置系统时钟 400M       
  45.     ChangeClockDivider(2, 1);      //设置分频 1:4:8  
  46.     CalcBusClk();           //计算总线频率  
  47.       
  48.     rGPHCON &=~((3<<4)|(3<<6));     
  49.     rGPHCON |=(2<<4)|(2<<6);    //GPH2--TXD[0];GPH3--RXD[0]     
  50.     rGPHUP=0x00;        //使能上拉功能  
  51.           
  52.     Uart_Init(0,115200);  
  53.     Uart_Select(0);  
  54.       
  55.     Uart_Printf( "\nBUZZER TEST ( PWM Control )\n" );  
  56.     Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !\n" ) ;  
  57.     Uart_Printf( "Press 'ESC' key to Exit this program !\n\n" );  
  58.   
  59.     Beep_Init( freq ,50) ;  
  60.   
  61.     while( 1 )  
  62.     {  
  63.         U8 key = Uart_Getch();  
  64.   
  65.         if( key == '+' )  
  66.         {  
  67.             if( freq < 2000 )  //lci  20000  
  68.                 freq += 10 ;  
  69.                   
  70.             Beep_Freq_Set( freq ) ;  
  71.         }  
  72.   
  73.         if( key == '-' )  
  74.         {  
  75.             if( freq > 11 )  
  76.                 freq -= 10 ;  
  77.                   
  78.             Beep_Freq_Set( freq ) ;  
  79.         }  
  80.           
  81.         Uart_Printf( "\tFreq = %d\n", freq ) ;  
  82.         if( key == ESC_KEY )  
  83.         {  
  84.             Beep_Stop() ;  
  85.             return ;  
  86.         }  
  87.   
  88.     }  
  89. }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值