xref: /nrf52832-nimble/rt-thread/examples/test/hwtimer_test.c (revision 104654410c56c573564690304ae786df310c91fc)
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