1 #include <rtthread.h>
2 #include <rtdevice.h>
3 #include <finsh.h>
4
5 #ifdef RT_USING_HWTIMER
6
7 #define TIMER "timer0"
8
timer_timeout_cb(rt_device_t dev,rt_size_t size)9 static rt_err_t timer_timeout_cb(rt_device_t dev, rt_size_t size)
10 {
11 rt_kprintf("enter hardware timer isr\n");
12
13 return 0;
14 }
15
hwtimer(void)16 int hwtimer(void)
17 {
18 rt_err_t err;
19 rt_hwtimerval_t val;
20 rt_device_t dev = RT_NULL;
21 rt_tick_t tick;
22 rt_hwtimer_mode_t mode;
23 int freq = 10000;
24 int t = 5;
25
26 if ((dev = rt_device_find(TIMER)) == RT_NULL)
27 {
28 rt_kprintf("No Device: %s\n", TIMER);
29 return -1;
30 }
31
32 if (rt_device_open(dev, RT_DEVICE_OFLAG_RDWR) != RT_EOK)
33 {
34 rt_kprintf("Open %s Fail\n", TIMER);
35 return -1;
36 }
37
38 /* ʱ����� */
39 /* ����ʱ������(Ĭ��1Mhz��֧�ֵ���С����Ƶ��) */
40 err = rt_device_control(dev, HWTIMER_CTRL_FREQ_SET, &freq);
41 if (err != RT_EOK)
42 {
43 rt_kprintf("Set Freq=%dhz Fail\n", freq);
44 goto EXIT;
45 }
46
47 /* ����ģʽ */
48 mode = HWTIMER_MODE_PERIOD;
49 err = rt_device_control(dev, HWTIMER_CTRL_MODE_SET, &mode);
50
51 tick = rt_tick_get();
52 rt_kprintf("Start Timer> Tick: %d\n", tick);
53 /* ���ö�ʱ����ʱֵ��������ʱ�� */
54 val.sec = t;
55 val.usec = 0;
56 rt_kprintf("SetTime: Sec %d, Usec %d\n", val.sec, val.usec);
57 if (rt_device_write(dev, 0, &val, sizeof(val)) != sizeof(val))
58 {
59 rt_kprintf("SetTime Fail\n");
60 goto EXIT;
61 }
62 rt_kprintf("Sleep %d sec\n", t);
63 rt_thread_delay(t*RT_TICK_PER_SECOND);
64
65 /* ֹͣ��ʱ�� */
66 err = rt_device_control(dev, HWTIMER_CTRL_STOP, RT_NULL);
67 rt_kprintf("Timer Stoped\n");
68 /* ��ȡ���� */
69 rt_device_read(dev, 0, &val, sizeof(val));
70 rt_kprintf("Read: Sec = %d, Usec = %d\n", val.sec, val.usec);
71
72 /* ��ʱִ�лص����� -- ����ģʽ */
73 /* ���ó�ʱ�ص����� */
74 rt_device_set_rx_indicate(dev, timer_timeout_cb);
75
76 /* ����ģʽ */
77 mode = HWTIMER_MODE_PERIOD;
78 err = rt_device_control(dev, HWTIMER_CTRL_MODE_SET, &mode);
79
80 /* ���ö�ʱ����ʱֵ��������ʱ�� */
81 val.sec = t;
82 val.usec = 0;
83 rt_kprintf("SetTime: Sec %d, Usec %d\n", val.sec, val.usec);
84 if (rt_device_write(dev, 0, &val, sizeof(val)) != sizeof(val))
85 {
86 rt_kprintf("SetTime Fail\n");
87 goto EXIT;
88 }
89
90 /* �ȴ��ص�����ִ�� */
91 rt_thread_delay((t + 1)*RT_TICK_PER_SECOND);
92
93 EXIT:
94 err = rt_device_close(dev);
95 rt_kprintf("Close %s\n", TIMER);
96
97 return err;
98 }
99 #ifdef FINSH_USING_MSH
100 MSH_CMD_EXPORT(hwtimer, "Test hardware timer");
101 #endif
102 #endif /* RT_USING_HWTIMER */
103