GT2440非操作系统下使蜂鸣器响

1.S3C2440APWM定时器简介

vS3C2440A 具有 5个16 位定时器,每个定时器可以按照中断模式或 DMA 模式工作。

(1)其中定时器 0~3具有外部引脚输出,可以用它们来得到  

          PWM波或者产生定时中断。定时器 0 具有死区发生器, 

          通常用于大电流设备应用。

(2)定时器 4 是一个内部定时器不具有对外输出口线。

特性:

1-5个 16 位定时器可以工作在中断模式或 DMA 模式;

2-2 个 8 位预分频器和 2 个 5 位分割器;

3-输出波形的占空比可编程控制(PWM)

4-自动加载模式或单触发脉冲模式

5-死区产生器


S3C2440A的PWM图

1)用作PWM调制波的输出

     定时器计数缓冲寄存器TCNTBn中有一个初始值,当定时器使能时,这个初始值就加载到计数寄存器TCNTn中。

     定时器比较缓冲寄存器TCMPBn中也有一个初始值,这个值加载到比较寄存器TCMPn中,用来和计数寄存器TCNTn作比较。当TCNTn中的值倒计数到了TCMPn中的值。此时TOUTn输出电平就会产生翻转。输出一个占空比可调的PWM波

2)用作定时中断

     每个定时器都有一个通过定时器驱动的 16 位计时寄存器 TCNTn。当倒计数到达 0时,就发生定时器中断,这个中断通知 CPU 定时器定时已经完成。并且此时相应的 TCNTBn 寄存器中的值会自动重载到计时器TCNTn中,这样就可以继续下一轮定时器操作了。

     但是,如果在定时器运行模式下,当定时器停止,。清除了寄存器TCONn 中的定时器使能位,那么 TCNTBn 的值就不会被重载到计时器TCNTn中了。

定时器(除了定时器4)都具有四个寄存器TCNTBnTCNTnTCMPBnTCMPn

双缓冲和自动重载:

     TCNTBn和TCMPBn 的值在定时器值达到 0 时分别载入TCNTn和TCMPn。当 TCNTn 达到 0 时,如果中断使能,中断请求将会产生。(TCNTn 和 TCMPn 是内部寄存器,TCNTn 寄存器的值可以通过 TCNTOn 寄存器读出)

定时器这种双缓冲特性可以在不停止当前定时器操作的前提下改变下次的加载值,所以即使设置了新的定时值,当前的定时器操作也会正常完成。

注意的是:TCNTBn寄存器的值,并不是当前状态下的计数值,而是下次将加载的计数值。当TCNTn寄存器的值到达0时,TCNTBn寄存器的值加载到TCNTn寄存器(自动重载使能情况下)。

生成PWM脉冲波的总结

     PWM 脉冲频率由 TCNTBn 决定。PWM 脉冲宽度值则由 TCMPBn 的值来决定。基于双缓冲器的特性,下一个 PWM 周期的 TCMPBn 值可以通过 ISR 或其它手段,在当前 PWM 周期中的任何一点写入。

源代码:

S3C2440A各功能引脚初始化:
void Port_Init(void)
{
    //CAUTION:Follow the configuration order for setting the ports. 
    // 1) setting value(GPnDAT) 
    // 2) setting control register  (GPnCON)
    // 3) configure pull-up resistor(GPnUP)  

    //32bit data bus configuration  
    //*** PORT A GROUP
    //Ports  : GPA22 GPA21  GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12  
    //Signal : nFCE nRSTOUT nFRE   nFWE  ALE   CLE  nGCS5 nGCS4 nGCS3 nGCS2 nGCS1 
    //Binary :  1     1      1  , 1   1   1    1   ,  1     1     1     1
    //Ports  : GPA11   GPA10  GPA9   GPA8   GPA7   GPA6   GPA5   GPA4   GPA3   GPA2   GPA1  GPA0
    //Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0 
    //Binary :  1       1      1      1   , 1       1      1      1   ,  1       1     1      1         
    rGPACON = 0x7fffff; 

    //**** PORT B GROUP
    //Ports  : GPB10    GPB9    GPB8    GPB7    GPB6     GPB5    GPB4   GPB3   GPB2     GPB1      GPB0
    //Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
    //Setting: OUTPUT  OUTPUT   OUTPUT  OUTPUT   OUTPUT   OUTPUT   OUTPUT OUTPUT OUTPUT   OUTPUT    OUTPUT 
    //Binary :   01  ,  01       01  ,   01      01   ,  01       01  ,   01     01   ,  01        01  
    rGPBCON = 0x155555;
    rGPBUP  = 0x7ff;     // The pull up function is disabled GPB[10:0]

    //*** PORT C GROUP
    //Ports  : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8  GPC7   GPC6   GPC5 GPC4 GPC3  GPC2  GPC1 GPC0
    //Signal : VD7   VD6   VD5   VD4   VD3   VD2   VD1  VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND  
    //Binary :  10   10  , 10    10  , 10    10  , 10   10  , 10     10  ,  10   10 , 10     10 , 10   10
    rGPCCON = 0xaaaaaaaa;       
    rGPCUP  = 0xffff;     // The pull up function is disabled GPC[15:0] 

    //*** PORT D GROUP
    //Ports  : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
    //Signal : VD23  VD22  VD21  VD20  VD19  VD18  VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9  VD8
    //Binary : 10    10  , 10    10  , 10    10  , 10   10 , 10   10 , 10   10 , 10   10 ,10   10
    rGPDCON = 0xaaaaaaaa;       
    rGPDUP  = 0xffff;     // The pull up function is disabled GPD[15:0]

    //*** PORT E GROUP
    //Ports  : GPE15  GPE14 GPE13   GPE12   GPE11   GPE10   GPE9    GPE8     GPE7  GPE6  GPE5   GPE4  
    //Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK I2SSDO 
    //Binary :  10     10  ,  10      10  ,  10      10   ,  10      10   ,   10    10  , 10     10  ,     
    //-------------------------------------------------------------------------------------------------------
    //Ports  :  GPE3   GPE2  GPE1    GPE0    
    //Signal : I2SSDI CDCLK I2SSCLK I2SLRCK     
    //Binary :  10     10  ,  10      10 
    rGPECON = 0xaaaaaaaa;       
    rGPEUP  = 0xffff;     // The pull up function is disabled GPE[15:0]

	
    //*** PORT F GROUP
    //Ports  : GPF7   GPF6   GPF5   GPF4      GPF3     GPF2  GPF1   GPF0
    //Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
    //Setting: Output Output Output Output    EINT3    EINT2 EINT1  EINT0
    //Binary :  01      01 ,  01     01  ,     10       10  , 10     10
    rGPFCON = 0x55aa;
    rGPFUP  = 0xff;     // The pull up function is disabled GPF[7:0]

    //*** PORT G GROUP
    //Ports  : GPG15 GPG14 GPG13 GPG12 GPG11    GPG10    GPG9     GPG8     GPG7      GPG6    
    //Signal : nYPON  YMON nXPON XMON  EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
    //Setting: nYPON  YMON nXPON XMON  EINT19  Output   Output   Output   SPICLK1    SPIMOSI1
    //Binary :   11    11 , 11    11  , 10      01    ,   01       01   ,    11         11
    //-----------------------------------------------------------------------------------------
    //Ports  :    GPG5       GPG4    GPG3    GPG2    GPG1    GPG0    
    //Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
    //Setting:  SPIMISO1  LCD_PWRDN EINT11   nSS0   EINT9    EINT8
    //Binary :     11         11   ,  10      11  ,  10        10
    rGPGCON = 0xff95ffba;
    rGPGUP  = 0xffff;    // The pull up function is disabled GPG[15:0]

    //*** PORT H GROUP
    //Ports  :  GPH10    GPH9  GPH8 GPH7  GPH6  GPH5 GPH4 GPH3 GPH2 GPH1  GPH0 
    //Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
    //Binary :   10   ,  10     10 , 11    11  , 10   10 , 10   10 , 10    10
    rGPHCON = 0x2afaaa;
    rGPHUP  = 0x7ff;    // The pull up function is disabled GPH[10:0]

    // Added for S3C2440, DonGo
    //PORT J GROUP
    //Ports	:  GPJ12    GPJ11     GPJ10	GPJ9  GPJ8      GPJ7	GPJ6  GPJ5	GPJ4  GPJ3  GPJ2  GPJ1  GPJ0
    //Signal : CAMRESET CAMCLKOUT CAMHREF CAMVS CAMPCLKIN CAMD7 CAMD6 CAMD5 CAMD4 CAMD3 CAMD2 CAMD1 CAMD0
    //Setting: Out      Out      CAMHREF CAMVS CAMPCLKIN CAMD7 CAMD6 CAMD5 CAMD4 CAMD3 CAMD2 CAMD1 CAMD0
    //Binary : 01	  01        10      10    10        10    10    10    10    10    10    10    10
    //PU_OFF : 1	  0 		1	    1     1         1     1     1		1	1     1     1     1
    //---------------------------------------------------------------------------------------
    rGPJDAT = (1<<12)|(0<<11);
    rGPJCON = 0x016aaaa;
    rGPJUP	= ~((0<<12)|(1<<11));

    rGPJDAT = (0<<12)|(0<<11);
    rGPJCON = 0x016aaaa;
    rGPJUP	= 0x1fff;//~((1<<12)|(1<<11));

	
    //rGPJCON = 0x02aaaaaa;
    //rGPJUP  = 0x1fff;    // The pull up function is disabled GPH[10:0]

    //External interrupt will be falling edge triggered. 
    rEXTINT0 = 0x22222222;    // EINT[7:0]
    rEXTINT1 = 0x22222222;    // EINT[15:8]
    rEXTINT2 = 0x22222222;    // EINT[23:16]
}

下面是定时器初始化,让PB0输出PWM信号

void Timer_Pwm(void)
{
    rGPBCON &= ~3;            //set GPB0 as tout0, pwm output
    rGPBCON |= 2;
//这段代码主要是设置PB0引脚为输出;rGPBCON=00|10
//设置预分频值都是15;prescaler = 15+1
rTCFG0 &= ~0xff;
rTCFG0 |= 15;

 

//设置分割值为1/8
rTCFG1 &= ~0xf;
rTCFG1 |= 2;
//MCLK=50000000   50MHZ

//定时器输入时钟频率计算公式 = MCLK/{prescaler+1}/{divider value}=50000000/16/8=390625
//定时器时钟频率也就是说一秒内Timer0会进行390625次递减和比较操作,假设我们现在是要让Timer0每1秒产生一次中断的话,我们应该设置rTCNPB0=390625,rTCMPB0=0

rTCNTB0 = 390625;
rTCMPB0 = rTCNTB0>>1;    // 50%    0.5s
//自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
rTCON &= ~0x1f;
rTCON |= 0xb;			//disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
//打开定时器
rTCON &= ~2;
}
原本想在这里继续写下通过pwm定时器延时,但发现后面的看门狗也是一种定时器,可以用做延时,所以我将把他们放在下篇博客中,以便进行对比。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值