微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440PWM 定时器

S3C2440PWM 定时器

时间:11-21 来源:互联网 点击:
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初始化代码

[cpp]view plaincopy

  1. voidTimer0_Init(void)
  2. {
  3. rTCFG0&=~(0xFF);//对TCFG0[0:15]清零
  4. rTCFG0|=99;//定时器的预分频值为99
  5. rTCFG1&=~(0x0f);//对TCFG1[0:3]清零
  6. rTCFG1|=0x02;//选择定时器0,分频值为1/8
  7. rTCNTB0=62500;//1s中断一次
  8. rTCON|=(1<1);//手动更新TCNTB0的值
  9. rTCON=(1<0)|(1<3);//清除手动更新。自动重载,启动定时器0
  10. }

说明:
定时器输入时钟频率 = PCLK / {预分频值+1} / {分频值}
{预分频值} = 0~255
{分频值} = 2, 4, 8, 16

开发板设置的PCLK为50MHZ

定时器输入的时钟频率=(50MHZ)/(99+1)/8=62500HZ

//开发板的测试蜂鸣器的试验程序(我写出了详细的注释)

  1. #include"2440addr.h"
  2. #include"2440lib.h"//这个只使用了这个文件的延迟函数,和串口有关的函数
  3. voidBeep_Freq_Set(U32freq)
  4. {
  5. rGPBCON&=~3;
  6. rGPBCON|=2;//设置GPB0为OUT0
  7. rGPBUP=0x0;//使能上拉
  8. rTCFG0&=~0xff;
  9. rTCFG0|=15;//预分频值为15
  10. rTCFG1&=~0x0f;
  11. rTCFG1|=0x02;//分频值为8
  12. rTCNTB0=(PCLK>>7)/freq;//设定定时器0计数缓冲器的值
  13. rTCMPB0=rTCNTB0>>1;//定时器0比较缓冲器的值,PWM输出占空比50%
  14. rTCON&=~0x1f;
  15. rTCON|=0xb;//自动重载,关闭变相,手动更新,开启定时器0
  16. rTCON&=~2;//清除手动更新位
  17. }
  18. voidBeep_Stop(void)
  19. {
  20. rGPBCON&=~3;//setGPB0asoutput
  21. rGPBCON|=1;
  22. rGPBDAT&=~1;//输出低电平
  23. }
  24. voidBeep_Init(U32freq,U32ms)
  25. {
  26. Beep_Stop();
  27. Delay(ms);
  28. Beep_Freq_Set(freq);
  29. }
  30. voidMain()
  31. {
  32. U16freq=800;
  33. SelectFclk(2);//设置系统时钟400M
  34. ChangeClockDivider(2,1);//设置分频1:4:8
  35. CalcBusClk();//计算总线频率
  36. rGPHCON&=~((3<4)|(3<6));
  37. rGPHCON|=(2<4)|(2<6);//GPH2--TXD[0];GPH3--RXD[0]
  38. rGPHUP=0x00;//使能上拉功能
  39. Uart_Init(0,115200);
  40. Uart_Select(0);
  41. Uart_Printf("\nBUZZERTEST(PWMControl)\n");
  42. Uart_Printf("Press+/-toincrease/reducethefrequencyofBUZZER!\n");
  43. Uart_Printf("PressESCkeytoExitthisprogram!\n\n");
  44. Beep_Init(freq,50);
  45. while(1)
  46. {
  47. U8key=Uart_Getch();
  48. if(key==+)
  49. {
  50. if(freq<2000)//lci20000
  51. freq+=10;
  52. Beep_Freq_Set(freq);
  53. }
  54. if(key==-)
  55. {
  56. if(freq>11)
  57. freq-=10;
  58. Beep_Freq_Set(freq);
  59. }
  60. Uart_Printf("\tFreq=%d\n",freq);
  61. if(key==ESC_KEY)
  62. {
  63. Beep_Stop();
  64. return;
  65. }
  66. }
  67. }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top