PWM定时器

  PWN:脉冲宽度调制

  每个定时器都有一个专用的由定时器时钟驱动的16位递减计数器。当递减计数器的计数值达到0的时候,就会产生定时中断请求来通知CPU定时器操作完成。当定时器递减计数器达到0的时候,相应的TCNTBn的值会自动重载到递减计数器中以继续下次操作。

  但是,如果定时器停止了,比如在定时器运行时清除TCON中的定时器使能位,TCNTBn的值不会被重载到递减计数器中

  TCMPBn的值用于脉冲宽度调制(PWM)。当定时器的递减计数器的值和比较寄存器的值相匹配的时候,定时器控制逻辑将改变输出电平。因此,比较寄存器决定了PWM输出的开关时间。

定时吕控制寄存器(TCON)

  定时器控制寄存器主要用于自动重载、定时器自动更新、定时器启停、输出翻转控制等

定时器n计数缓冲寄存器(TCNTBn)

  这个寄存器用于PWM定时器的时间计数

定时器n比较缓冲寄存器(TCMPBn)

  这个寄存器用于PWM波形输出占空比的设置


看门狗定时器

  看门狗(WatchDog)定时器和PWM定时器功能目的不一样。

特点

  需要不停地接收信号(一些外置看门狗芯片)或重新设置计数值(如S3C2410X的看门狗控制器),保持计数值不为0.一旦一段时间接收不到信号,或计数值到0,看门狗定时器将发出复位信号复位系统或产生中断。

作用

  看门狗定时器的作用是微控制器受到干扰进入错误状态后,使系统在一定时间间隔内复位。因此看门狗定时器是保证系统长期、可靠和稳定运行的有效措施。

  一旦看门狗定时器被允许,看门狗定时器数据寄存器(WTDAT)的值不能被自动地装载到看门狗计数器(WTCNT)中。因此,看门狗定时器启动前要将一个初始值写入看门狗计数器(WTCNT)中。

程序设计流程

  由于看门狗定时器是对系统的复位或者中断的操作,所以不需要外围的硬件电路。要实现看门狗定时器的功能,只需要对看门狗定时器的寄存器组进行操作,即对看门狗定时器的控制寄存器(WTCNT)进行操作。

  1)设置看门狗定时器中断操作包括全局中断和看门狗中断的全能及看门狗中断向量的定义,如果只是进行复位操作,这一步可以不用设置

  2)对看门狗控制寄存器(WTCON)的设置,包括设置预分频比例因子、分频器的分频值、中断全能和复位全能等

  3)对看门狗数据寄存器(WTDAT)和看门狗计数寄存器(WTCNT)的设置

  4)启动看门狗定时器


看门狗例子

 #include "2410lib.h"

 void watchdog_test(void);

 int main()

 {

    sys_init();

    uart_printf("\n Embest Arm S3CEB2410 Evaluation Board!\n");  

    watchdog_test();

 while();

 }

 void  __irq watchdog_int(void) ;//__attribute__((interrupt ("IRQ")));

 INT8T f_ucSecondNo;

 void watchdog_test(void)

 {   f_ucSecondNo = ;

    uart_printf("\n WatchDog Timer Test Example\n");

    uart_printf(" 10 seconds:\n");

    rSRCPND|=0x0200;

    rINTPND|=0x200;

 //ClearPending(BIT_WDT);                        // clear interrupt pending bit

    pISR_WDT = (unsigned)watchdog_int;              // Initialize WDT interrupt handler entry

    rWTCON = ((PCLK/-)<<)|(<<)|(<<);   // 1M,1/128, enable interrupt

    rWTDAT = ;                                  // 1M/128=7812

    rWTCNT = ;

    rWTCON = rWTCON & ~;

 //rWTCON = rWTCON | 1;                          // enable restart                

    rWTCON |=(<<);                                // start watchdog timer

    rINTMOD &= ~(BIT_WDT);

    rINTMSK &= ~(BIT_WDT);

 while((f_ucSecondNo)<);

    rINTMSK |= BIT_WDT;                             // mask watchdog timer interrupt

    uart_printf(" end.\n");      

 }

 void __irq watchdog_int(void)

 {

    ClearPending(BIT_WDT);

    f_ucSecondNo++;  

 if(f_ucSecondNo<)

        uart_printf(" %3ds ",f_ucSecondNo);

 else

        uart_printf("\n O.K.");

 }

最新文章

  1. thinkphp3.2.3分页
  2. 使用sklearn优雅地进行数据挖掘
  3. objc/runtime
  4. bootstrap初接触
  5. djngo快速实现--使用Bootstrap
  6. scau 8633 回文划分
  7. MySQL 中随机抽样:order by rand limit 的替代方案
  8. Using jQuery to add a dynamic “Back To Top” floating button with smooth scroll
  9. Entity Framework 学习整理(分播客整理)
  10. [Linked List]Palindrome Linked List
  11. DevExpress ASP.NET 使用经验谈(3)-XPO对象的使用(使用指定数据连接)
  12. jsoup 使用总结4--高级用法之 script js 脚本
  13. Linq中的Select与Select many
  14. Methods to reduce the number of pipeline stages
  15. Android Studio Xposed模块编写(一)
  16. C语言利用SMTP协议发送邮件
  17. 移动文件流的读写指针---fseek
  18. 3、Redis中对String类型的操作命令
  19. php计算中英文混合或中文字符串的字数
  20. java线程面试手写题

热门文章

  1. asiHttpRequst 学习地址
  2. (原)ubuntu中安装kate
  3. 听听各位对Ubuntu的UI的看法
  4. iOS presentedViewController和presentingViewController的区别
  5. nullpointerxception——处理思路
  6. MATLAB R2018a 安装教程
  7. 微信小程序-从零开始制作一个跑步微信小程序
  8. Android启动过程深入解析
  9. 【转】我的第一次和最后一次 Hackathon 经历
  10. C++中的成员对象