S3C2440PWM 定时器
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初始化代码
- 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 ;
- }
- }
- }
S3C2440PWM 定时器相关推荐
- 一文吃透JAVA定时器格式
JAVA 定时器时间格式 基本格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许使用的通配符 1 秒 是 0-59 , - ...
- Timer定时器开发
Timer定时器开发 定时器的作用是不占线程的等待一个确定时间,同样通过callback来通知定时器到期. 参考:https://github.com/sogou/workflow 定时器的创建 同样 ...
- linux定时器(crontab)实例
linux实验示例----实现每2分钟将"/etc"下面的文件打包存储到"/usr/lobal"目录下 ·Step1:编辑当前用户的crontab并保存 终端输 ...
- c语言程序设计分段定时器,单片机C语言编程定时器的几种表达方式
原标题:单片机C语言编程定时器的几种表达方式 吴鉴鹰单片机开发板地址 店铺:[吴鉴鹰的小铺] 地址:[https://item.taobao.com/item.htm?_u=ukgdp5a7629&a ...
- linux 内核按键抖动,Tiny4412 Linux驱动之按键(定时器防抖动) | 技术部落
按键抖动示意图 我们平常所用的按键为机械弹性开关,由于触点的弹性作用,按键在闭合时不会马上稳定的接通,而是有一段时间的抖动,在断开时也不会立即断开.抖动时间由按键的机械特性所决定,一般为5ms~10m ...
- mysql 定时器不能持续循环执行_定时器,不循环执行指定方法?如何解决?
⁽⁽ଘ你管我管你疯啊ଓ⁾⁾ 01-22 加粗 标红 插入代码 插入链接 插入图片 上传视频 请 登录 后发表内容 关闭 新增或编辑超链接 链接地址 关闭 插入视频 视频链接 messageScroll ...
- oracle定时器怎么开启,Oracle的定时器使用示例
下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. --Oracle定时job --数据库执行此脚本时时,请确保只执行一次,否则会引发错误! ...
- java 定时器获得外部参数_JMeter定时器使用小结
一.定时器的作用域 1.无论定时器位置在Sampler之前还是下面,定时器是在每个sampler(采样器)之前执行的,而不是之后: 2.当执行一个Sampler之前时,所有当前作用域内的定时器都会被执 ...
- PHP 毫秒级定时器,实现php毫秒定时器方法详解
描述 PHP编程语言是一种快速.简洁的服务端脚本编程语言,可以制作强大的交互性展现.在编程界PHP是完全免费的语言,在程序员身上使用非常的广泛,在编程中是大家高效的选择. PHP能实现的功能 1.可以 ...
- FPGA(4)晶振与计数器 -- 实现定时器(led定时闪烁、蜂鸣器频率控制(单响)、蜂鸣器报警(频带控制,多响))
目录 一.FPGA的晶振与定时器 二.定时器(led闪烁.蜂鸣器频率控制) 1.时钟上升沿.复位下降沿触发 2.复位,计数器清零 3.计数满1s时,计数器清零 4-1.led闪烁(每秒) 4-2.蜂鸣 ...
最新文章
- 【Java】身份证号码验证
- Opengl-立方体贴图(天空盒子)
- Entity Framework中IQueryable, IEnumerable, IList的区别
- 3.8 Anchor Boxes-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- MYSQL 定时任务
- LoRaWAN开放式实验平台
- vue-cli目录结构解析
- python records库_Python Records库使用举例
- 子类调用父类构造器的几种情况
- 微软全面拥抱 AI!
- 【剑指 offer】(十)—— 二进制形式 1 的个数
- C++11多线程中的detach()、join()、joinable()
- 中计算均方误差_为什么分类问题不使用均方误差作为代价函数
- python游戏开发引擎_【图片】有关Ren'Py引擎的游戏制作汉化教程【linux游戏吧】_百度贴吧...
- java并发增强工具_0318 guava并发工具
- 本人成功续费了。你的支付授权失败。请核对你的信息并重试,或尝试其他支付方式。请联系你的银行了。
- @async 注解使主线程不等待
- 基于云服务创建实时运营数据分析服务(一)
- c++#学生平均成绩,学号排序
- java天眼培训_Java天眼大型分布式跟踪系统 附带源码_IT教程网