的内部定时器。定时器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初始化代码
- void Timer0_Init(void)
- {
- rTCFG0 &=~(0xFF); //对TCFG0[0:15]清零
- rTCFG0 |=99; //定时器的预分频值为99
- rTCFG1 &=~(0x0f); //对TCFG1[0:3]清零
- rTCFG1 |=0x02; //选择定时器0,分频值为1/8
- rTCNTB0 =62500; //1s中断一次
- rTCON |=(1<<1); //手动更新TCNTB0的值
- rTCON =(1<<0)|(1<<3); //清除手动更新。自动重载,启动定时器0
- }
说明:
定时器输入时钟频率 = PCLK / {预分频值+1} / {分频值}
{预分频值} = 0~255
{分频值} = 2, 4, 8, 16
开发板设置的PCLK为50MHZ
定时器输入的时钟频率=(50MHZ)/(99+1)/8=62500HZ
//开发板的测试蜂鸣器的试验程序(我写出了详细的注释)
- #include "2440addr.h"
- #include "2440lib.h" //这个只使用了这个文件的延迟函数,和串口有关的函数
- void Beep_Freq_Set( U32 freq )
- {
- rGPBCON &=~3;
- rGPBCON |=2; //设置GPB0为OUT0
- rGPBUP=0x0; //使能上拉
- rTCFG0 &=~0xff;
- rTCFG0 |=15; //预分频值为15
- rTCFG1 &=~0x0f;
- rTCFG1 |=0x02; //分频值为8
- rTCNTB0 = (PCLK>>7)/freq; //设定定时器0计数缓冲器的值
- rTCMPB0 = rTCNTB0>>1; // 定时器0比较缓冲器的值,PWM输出占空比50%
- rTCON &= ~0x1f;
- rTCON |= 0xb; //自动重载,关闭变相,手动更新,开启定时器0
- rTCON &= ~2; //清除手动更新位
- }
- void Beep_Stop( void )
- {
- rGPBCON &= ~3; //set GPB0 as output
- rGPBCON |= 1;
- rGPBDAT &= ~1; //输出低电平
- }
- void Beep_Init(U32 freq, U32 ms)
- {
- Beep_Stop() ;
- Delay( ms ) ;
- Beep_Freq_Set( freq ) ;
- }
- void Main()
- {
- U16 freq=800;
- SelectFclk(2); //设置系统时钟 400M
- ChangeClockDivider(2, 1); //设置分频 1:4:8
- CalcBusClk(); //计算总线频率
- rGPHCON &=~((3<<4)|(3<<6));
- rGPHCON |=(2<<4)|(2<<6); //GPH2--TXD[0];GPH3--RXD[0]
- rGPHUP=0x00; //使能上拉功能
- Uart_Init(0,115200);
- Uart_Select(0);
- Uart_Printf( "\nBUZZER TEST ( PWM Control )\n" );
- Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !\n" ) ;
- Uart_Printf( "Press 'ESC' key to Exit this program !\n\n" );
- Beep_Init( freq ,50) ;
- while( 1 )
- {
- U8 key = Uart_Getch();
- if( key == '+' )
- {
- if( freq < 2000 ) //lci 20000
- freq += 10 ;
- Beep_Freq_Set( freq ) ;
- }
- if( key == '-' )
- {
- if( freq > 11 )
- freq -= 10 ;
- Beep_Freq_Set( freq ) ;
- }
- Uart_Printf( "\tFreq = %d\n", freq ) ;
- if( key == ESC_KEY )
- {
- Beep_Stop() ;
- return ;
- }
- }
- }
上一篇:S3C2440时钟电源管理
下一篇:S3C2440输入/输出端口
推荐阅读最新更新时间:2024-03-16 14:50
设计资源 培训 开发板 精华推荐
- 1.39亿美元!英飞凌宣布收购Siltectra,有望将晶圆生产芯片数
- 谷歌AI新突破:实时聊天中识别“谁说了什么”正确率高达92%
- 库存少 + “抽奖”机制不明确,小米手机 1 英镑抢购活动惹
- iPhone XS Max上的iOS 12.1证实已被越狱
- 微软、腾讯、英特尔“不务正业”种黄瓜,是因为人工智能
- 开源ARM7驱动拼接1024X1024LCD屏Proteus仿真源码
- LPC2138+LCD1602计数器proteus仿真与源码 添加注释的和改管脚
- ARM7 LPC2138数字频率计的设计源码与报告
- Linux-ARM之中断GIC分析
- 基于ARM7 ADUC7020+MPU6050的计步算法
- 给未来的电子工程师
- TI嵌入式直播月:深入探究嵌入式产品在工业和汽车中的新应用 第二场今天14:00 直播
- 求个16*64的LED点阵汉字显示 显示模式可以变换的 谢谢啊 急急急
- 将MCU和传感器集成到多节点为无线气象站供电
- 【TI白皮书分享】TI KeyStone II 架构助力构建绿色环保基站异构网络
- 求教 通过jtag口用ads1.2烧写mx27板子的问题
- How to deliver employee's welfare?This is knowledge(set diagram)
- 在IAR5.2版本上的定位问题
- 求超声波测距传感器
- 超低功耗的STM32L432测评开始啦~仅有5块,感兴趣的赶紧来申请吧!