1 /*
2  * Copyright (c) 2006-2021, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author            Notes
8  * 2020-07-27     thread-liu        first version
9  */
10 
11 #include <board.h>
12 
13 #if defined(BSP_USING_TIM14) && defined(BSP_USING_ADC2)
14 
15 #include <rtthread.h>
16 #include <rtdevice.h>
17 
18 #define HWTIMER_DEV_NAME   "timer14"
19 #define HWADC_DEV_NAME     "adc2"
20 #define REFER_VOLTAGE       330         /* voltage reference */
21 #define CONVERT_BITS        (1 << 12)   /* Conversion digit */
22 #define ADC_DEV_CHANNEL     6
23 
24 static rt_adc_device_t adc_dev = RT_NULL;
25 
timeout_cb(rt_device_t dev,rt_size_t size)26 static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
27 {
28     rt_uint32_t value = 0 , vol = 0;
29 
30     /* read adc value */
31     value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
32     rt_kprintf("the value is :%d \n", value);
33 
34     vol = value * REFER_VOLTAGE / CONVERT_BITS;
35     rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
36 
37     return 0;
38 }
39 
hwtimer_stop(void)40 static int hwtimer_stop(void)
41 {
42     rt_err_t ret = RT_EOK;
43     rt_device_t hw_dev = RT_NULL;
44 
45     hw_dev = rt_device_find(HWTIMER_DEV_NAME);
46     if (hw_dev == RT_NULL)
47     {
48         rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME);
49         return -RT_ERROR;
50     }
51 
52     ret = rt_device_close(hw_dev);
53     if (ret != RT_EOK)
54     {
55         rt_kprintf("close %s device failed!\n", HWTIMER_DEV_NAME);
56         return ret;
57     }
58 
59     /* close adc channel */
60     ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
61 
62     return ret;
63 }
64 
hwtimer_start(void)65 static int hwtimer_start(void)
66 {
67     rt_err_t ret = RT_EOK;
68     rt_hwtimerval_t timeout_s;
69     rt_device_t hw_dev = RT_NULL;
70 
71     rt_hwtimer_mode_t mode;
72 
73     hw_dev = rt_device_find(HWTIMER_DEV_NAME);
74     if (hw_dev == RT_NULL)
75     {
76         rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME);
77         return -RT_ERROR;
78     }
79 
80     /* find adc dev */
81     adc_dev = (rt_adc_device_t)rt_device_find(HWADC_DEV_NAME);
82     if (adc_dev == RT_NULL)
83     {
84         rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWADC_DEV_NAME);
85         return -RT_ERROR;
86     }
87 
88     /* Open the device in read/write mode */
89     ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
90     if (ret != RT_EOK)
91     {
92         rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME);
93         return ret;
94     }
95 
96     /* Set the timeout callback function */
97     rt_device_set_rx_indicate(hw_dev, timeout_cb);
98 
99     /* Set the mode to periodic timer */
100     mode = HWTIMER_MODE_PERIOD;
101     ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
102     if (ret != RT_EOK)
103     {
104         rt_kprintf("set mode failed! ret is :%d\n", ret);
105         return ret;
106     }
107 
108     timeout_s.sec = 5;
109     timeout_s.usec = 0;
110 
111     if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
112     {
113         rt_kprintf("set timeout value failed\n");
114         return -RT_ERROR;
115     }
116 
117     rt_thread_mdelay(3500);
118 
119     rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
120     rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec);
121 
122     /* enable adc channel */
123     ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
124 
125     return ret;
126 }
127 
tim_sample(int argc,char * argv[])128 static int tim_sample(int argc, char *argv[])
129 {
130     if (argc > 1)
131     {
132         if (!rt_strcmp(argv[1], "start"))
133         {
134            rt_kprintf("tim14 will start\n");
135            hwtimer_start();
136            return RT_EOK;
137         }
138         else if (!rt_strcmp(argv[1], "stop"))
139         {
140             hwtimer_stop();
141             rt_kprintf("stop tim14 success!\n");
142             return RT_EOK;
143         }
144         else
145         {
146             goto _exit;
147         }
148     }
149 _exit:
150     {
151         rt_kprintf("Usage:\n");
152         rt_kprintf("tim_sample start         - start TIM14 \n");
153         rt_kprintf("tim_sample stop          - stop TIM14 \n");
154     }
155 
156     return -RT_ERROR;
157 }
158 MSH_CMD_EXPORT(tim_sample, tim sample);
159 
160 #endif
161