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.等候中止产生,中止处理函数中铲除中止
依托这几步,有以下寄存器咱们需求留意
首要,设置PCLK到守时器的分频份额,有两种时钟,分别是01守时器和234守时器
然后进行第2次分频
可选择1/2%201/4%201/8%201/16几种时钟,时钟源是从上一个寄存器分频来的
设置守时器的主动重载和发动守时器,留意在这个寄存器中,请用手动更新了之后有必要再次清零,不然守时器无法运转
我之前就遇到过这个问题
设置守时器主动重载的值
再然后依照之前的设置中止的方法设置中止,守时器没有次级源,以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