【ARM】定时器
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)启动看门狗定时器
看门狗例子
1 #include "2410lib.h" 2 3 void watchdog_test(void); 4 5 int main() 6 7 { 8 9 sys_init(); 10 11 uart_printf("\n Embest Arm S3CEB2410 Evaluation Board!\n"); 12 13 watchdog_test(); 14 15 while(1); 16 17 } 18 19 void __irq watchdog_int(void) ;//__attribute__((interrupt ("IRQ"))); 20 21 INT8T f_ucSecondNo; 22 23 void watchdog_test(void) 24 25 { f_ucSecondNo = 0; 26 27 uart_printf("\n WatchDog Timer Test Example\n"); 28 29 uart_printf(" 10 seconds:\n"); 30 31 rSRCPND|=0x0200; 32 33 rINTPND|=0x200; 34 35 //ClearPending(BIT_WDT); // clear interrupt pending bit 36 37 pISR_WDT = (unsigned)watchdog_int; // Initialize WDT interrupt handler entry 38 39 rWTCON = ((PCLK/1000000-1)<<8)|(3<<3)|(1<<2); // 1M,1/128, enable interrupt 40 41 rWTDAT = 7812; // 1M/128=7812 42 43 rWTCNT = 7812; 44 45 rWTCON = rWTCON & ~1; 46 47 //rWTCON = rWTCON | 1; // enable restart 48 49 rWTCON |=(1<<5); // start watchdog timer 50 51 rINTMOD &= ~(BIT_WDT); 52 53 rINTMSK &= ~(BIT_WDT); 54 55 while((f_ucSecondNo)<11); 56 57 rINTMSK |= BIT_WDT; // mask watchdog timer interrupt 58 59 uart_printf(" end.\n"); 60 61 } 62 63 64 65 void __irq watchdog_int(void) 66 67 { 68 69 ClearPending(BIT_WDT); 70 71 f_ucSecondNo++; 72 73 if(f_ucSecondNo<11) 74 75 uart_printf(" %3ds ",f_ucSecondNo); 76 77 else 78 79 uart_printf("\n O.K."); 80 81 }