历史上的今天
今天是:2025年01月23日(星期四)
2020年01月23日 | 【ARM】定时器
2020-01-23 来源:eefocus
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 Examplen");
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 }
上一篇:【ARM】AD转换器
下一篇:【ARM】串行通信
史海拾趣
|
想用2262,2272做遥控小车,怎样才能使小车前进的同时转弯? 想用2262,2272做个遥控小车,可这个芯片在同一时段只能有一个端口输出,前进时就不能转弯了,不知道该怎样解决,请大家想想,给点思路,用单片机控制也行。… 查看全部问答> |
|
请教如何在Win CE 下开发Driver【或寻北京兼职人员】 想请教一下如何开发Win CE 下的Dirver。 开发流程,用到的技术,是怎么样子的。 希望能帮忙找点例子和相关的文档。 我这边有个嵌入式的项目,目前准备自学后再做。 也希望能得到嵌入式工程师的帮助,大家一起接下这个单子。 如果有兴趣的可以 ...… 查看全部问答> |
|
verilog中 比如always @(posedge clk)//CLK频率为125MHZ. 8ns周期 begin ...... end 实际begin end中的语句执行一次 要多少时间啊… 查看全部问答> |
|
最近玩launchpad,写了个简单的小程序通过msp430g2553内部测量温度,然后通过串口通信上传给电脑,但是没有加上校正,只能简单的使用… 查看全部问答> |




