您的位置 首页 被动

根据S3C2440A定时器的正确使用方法

基于S3C2440A定时器的正确使用方法-定时器0和1共用一个8位预分频器,定时器2、3和4共用另外的8位预分频器。每个定时器都有一个可以生成5种不同分频信号(1/2,1/4,1/8,1/16和TCLK)的时钟分频器。每个定时器模块从相应8位预分频器得到时钟的时钟分频器中得到其自己的时钟信号。8位预分频器是可编程的,并且按存储在TCFG0和TCFG1寄存器中的加载值来分频PCLK

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

每个守时器有它自己的由守时器时钟驱动的16位递减计数器。当递减计数器抵达零时,产生守时器中止请求告诉CPU守时器操作现已完结。当守时器计数器抵达零时,相应的TCNTBn的值将主动被加载到递减计数器以持续下一次操作

关于守时器的运用有两种形式,榜首是一般守时第二是PWM输出

先说一般守时,一般守时器的运用流程都会包括这几步

1.在低功耗寄存器里边启用相应的守时器外设

2.设置时钟分频比,获取守时器的计数时钟

3.设置守时器的守时值(重载值),装备中端,发动守时器

4.等候中止产生,中止处理函数中铲除中止

依托这几步,有以下寄存器咱们需求留意

根据S3C2440A守时器的正确运用方法

首要,设置PCLK到守时器的分频份额,有两种时钟,分别是01守时器和234守时器

然后进行第2次分频

可选择1/2%201/4%201/8%201/16几种时钟,时钟源是从上一个寄存器分频来的

设置守时器的主动重载和发动守时器,留意在这个寄存器中,请用手动更新了之后有必要再次清零,不然守时器无法运转

根据S3C2440A守时器的正确运用方法

我之前就遇到过这个问题

设置守时器主动重载的值

再然后依照之前的设置中止的方法设置中止,守时器没有次级源,以TIme0为例

1.源挂起srcpend

2.中止形式intmode

3.中止屏蔽intmask

4.中止挂起intpend

使能中止之后守时器就能够正常运用了

详细代码如下:

TImer.c

#include“TImer.h”u8TImer0Up=0;void__irqtimer0(){rSRCPND“=(1《《10);//铲除源挂起rINTPND|=(1《《10);//铲除中止挂起timer0Up=1;}//守时器初始化//prescaler8为分频器值,0-255//mux守时器的选通输入01/211/421/831/16//守时器的重载值voidInitTimer0(u8prescaler,u8mux,u16count){rCLKCON|=(1《《8);//翻开timer时钟rTCFG0&=~0xff;//清零分频器rTCFG0|=prescaler;//设置预分频器rTCFG1&=~(0x0f《《0);rTCFG1|=(mux《《0);//设置选通输入//设置守时器的计数值rTCMPB0=0x0;rTCNTB0=count;//设定初值//发动守时器rTCON|=(1《《1);//更新TCNTB0和TCMPB0rTCON|=(1《《3);//发动主动重载rTCON&=~(1《《1);//清零手动更新rSRCPND|=(1《《10);//铲除源挂起rINTPND|=(1《《10);//铲除中止挂起rINTMOD&=~(1《《10);//设置中止形式为IRQ形式rINTMSK&=~(1《《10);//使能守时器中止pISR_TIMER0=(unsigned)timer0;//设置中止地址rTCON|=(1《《0);//发动守时器0}

Timer.h

#ifndef__TIMER_H#define__TIMER_H#include”2440addr.h“#include”led.h“#include”uart0.h“externu8timer0Up;voidInitTimer0(u8prescaler,u8mux,u16count);#endif

PWM波形输出时需求留意几个其他寄存器

榜首:PWM输出不需求敞开中止,可是要设置相应的引脚复用功用为pwm功用,如图,TCLK

第二,运用pwm功用有必要要使能比较寄存器,也便是

第三,根据需求看是否需求反向,何为反向呢

便是TCNT

Pwm.c

#include”pwm.h“//compare比较寄存器的值voidTomer0PwmInit(u8prescaler,u8mux,u16count,u16compare){rGPBCON&=~3;rGPBCON”=2;//设置GPB0为OUT0rGPBUP=0x0;//使能上拉                 rCLKCON|=(1《《8);//翻开timer时钟rTCFG0&=~0xff;//清零分频器rTCFG0|=prescaler;//设置预分频器rTCFG1&=~(0x0f《《0);rTCFG1|=(mux《《0);//设置选通输入//设置守时器的计数值             rTCMPB0=compare;//比较寄存器的值rTCNTB0=count;//设定初值//发动守时器rTCON|=(1《《1);//更新TCNTB0和TCMPB0rTCON|=(1《《3);//发动主动重载rTCON&=~(1《《1);//清零手动           更新rTCON|=(1《《0);//发动守时器0}

Pwm.h

#ifndef__PWM_H_#define__PWM_H_#include“2440addr.h”#include“def.h”//compare比较寄存器的值voidTomer0PwmInit(u8prescaler,u8mux,u16count,u16compare);#endif

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/347003.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部