XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_hal_tim.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_hal_tim.h"
15
16#if XF_HAL_TIM_IS_ENABLE
17
18#include "../kernel/xf_hal_dev.h"
19
20/* ==================== [Defines] =========================================== */
21
22#define TAG "hal_tim"
23
24#define XF_HAL_TIM_TYPE XF_HAL_TIM
25
26/* ==================== [Typedefs] ========================================== */
27
28typedef struct _xf_hal_tim_t {
29 xf_hal_dev_t dev; // 一定要放到第一个,以便后续close一起free
32
33/* ==================== [Static Prototypes] ================================= */
34
36
37/* ==================== [Static Variables] ================================== */
38
39/* ==================== [Macros] ============================================ */
40
41#define XF_HAL_TIM_CHECK(condition, retval, format, ...) \
42 XF_CHECK(condition, retval, TAG, format, ##__VA_ARGS__)
43
44/* ==================== [Global Functions] ================================== */
45
50
51xf_err_t xf_hal_tim_init(xf_tim_num_t tim_num, uint32_t tick_freq_hz, xf_hal_tim_count_dir_t count_dir,
52 bool auto_reload)
53{
54 xf_err_t err = XF_OK;
55 UNUSED(err);
56
58 XF_HAL_TIM_CHECK(!dev, XF_ERR_NOT_FOUND, "tim init failed!");
59
60 xf_hal_tim_t *dev_tim = (xf_hal_tim_t *)dev;
61
62#if XF_HAL_LOCK_IS_ENABLE
63 xf_lock_lock(dev_tim->dev.mutex);
64#endif
65
66 dev_tim->config.tick_freq_hz = tick_freq_hz;
67 dev_tim->config.auto_reload = auto_reload;
68 dev_tim->config.count_dir = count_dir;
69
70#if XF_HAL_LOCK_IS_ENABLE
71 xf_lock_unlock(dev_tim->dev.mutex);
72#endif
73
75 &dev_tim->config);
76 XF_HAL_TIM_CHECK(err, err, "tim init failed!");
77
78 return XF_OK;
79}
80
82{
83 xf_err_t err = XF_OK;
84 UNUSED(err);
85
87 xf_hal_tim_t *dev_tim = (xf_hal_tim_t *)dev;
88 XF_HAL_TIM_CHECK(!dev_tim, XF_ERR_UNINIT, "tim is not init!");
89
90 err = xf_hal_driver_close(dev);
91 XF_HAL_TIM_CHECK(err, err, "deinit failed!");
92
93 return XF_OK;
94}
95
96xf_err_t xf_hal_tim_set_cb(xf_tim_num_t tim_num, xf_hal_tim_cb_t callback, void *user_data)
97{
98 xf_err_t err = XF_OK;
99 UNUSED(err);
100
102 xf_hal_tim_t *dev_tim = (xf_hal_tim_t *)dev;
103 XF_HAL_TIM_CHECK(!dev_tim, XF_ERR_UNINIT, "tim is not init!");
104
105#if XF_HAL_LOCK_IS_ENABLE
106 xf_lock_lock(dev_tim->dev.mutex);
107#endif
108
109 dev_tim->config.cb.callback = callback;
110 dev_tim->config.cb.user_data = user_data;
111
112#if XF_HAL_LOCK_IS_ENABLE
113 xf_lock_unlock(dev_tim->dev.mutex);
114#endif
115
116 err = xf_hal_driver_ioctl(dev, XF_HAL_TIM_CMD_CB, &dev_tim->config);
117 XF_HAL_TIM_CHECK(err, err, "callback set failed!");
118
119 return XF_OK;
120}
121
122xf_err_t xf_hal_tim_set_isr(xf_tim_num_t tim_num, xf_hal_tim_cb_t callback, void *user_data)
123{
124 xf_err_t err = XF_OK;
125 UNUSED(err);
126
128 xf_hal_tim_t *dev_tim = (xf_hal_tim_t *)dev;
129 XF_HAL_TIM_CHECK(!dev_tim, XF_ERR_UNINIT, "tim is not init!");
130
131#if XF_HAL_LOCK_IS_ENABLE
132 xf_lock_lock(dev_tim->dev.mutex);
133#endif
134
135 dev_tim->config.isr.callback = callback;
136 dev_tim->config.isr.user_data = user_data;
137
138#if XF_HAL_LOCK_IS_ENABLE
139 xf_lock_unlock(dev_tim->dev.mutex);
140#endif
141
142 err = xf_hal_driver_ioctl(dev, XF_HAL_TIM_CMD_ISR, &dev_tim->config);
143 XF_HAL_TIM_CHECK(err, err, "callback set failed!");
144
145 return XF_OK;
146}
147
148xf_err_t xf_hal_tim_start(xf_tim_num_t tim_num, uint32_t target_ticks)
149{
150 xf_err_t err = XF_OK;
151 UNUSED(err);
152
154 xf_hal_tim_t *dev_tim = (xf_hal_tim_t *)dev;
155 XF_HAL_TIM_CHECK(!dev_tim, XF_ERR_UNINIT, "tim is not init!");
156
157#if XF_HAL_LOCK_IS_ENABLE
158 xf_lock_lock(dev_tim->dev.mutex);
159#endif
160
162 dev_tim->config.target_ticks = target_ticks;
163
164#if XF_HAL_LOCK_IS_ENABLE
165 xf_lock_unlock(dev_tim->dev.mutex);
166#endif
167
169
170 XF_HAL_TIM_CHECK(err, err, "tim start failed!");
171
172 return XF_OK;
173}
174
176{
177 xf_err_t err = XF_OK;
178 UNUSED(err);
179
181 xf_hal_tim_t *dev_tim = (xf_hal_tim_t *)dev;
182 XF_HAL_TIM_CHECK(!dev_tim, XF_ERR_UNINIT, "tim is not init!");
183
184#if XF_HAL_LOCK_IS_ENABLE
185 xf_lock_lock(dev_tim->dev.mutex);
186#endif
187
189
190#if XF_HAL_LOCK_IS_ENABLE
191 xf_lock_unlock(dev_tim->dev.mutex);
192#endif
193
194 err = xf_hal_driver_ioctl(dev, XF_HAL_TIM_CMD_ACTIVE, &dev_tim->config);
195 XF_HAL_TIM_CHECK(err, err, "tim stop failed!");
196
197 return XF_OK;
198}
199
201{
202 xf_err_t err = XF_OK;
203 UNUSED(err);
204
206 xf_hal_tim_t *dev_tim = (xf_hal_tim_t *)dev;
207
208 XF_HAL_TIM_CHECK(!dev_tim, XF_ERR_UNINIT, "tim is not init!");
209
210 err = xf_hal_driver_write(dev, &ticks, 1);
211 // 此处返回正错误码(-err)即可,无需像其他真正的读写那样返回负值错误码
212 XF_HAL_TIM_CHECK(err < XF_OK, -err, "tim write failed!");
213
214 return err;
215}
216
218{
219 xf_err_t err = XF_OK;
220 UNUSED(err);
221 uint32_t ticks = 0;
222
224 xf_hal_tim_t *dev_tim = (xf_hal_tim_t *)dev;
225 XF_HAL_TIM_CHECK(!dev_tim, XF_ERR_UNINIT, "tim is not init!");
226
227 err = xf_hal_driver_read(dev, &ticks, 1);
228 XF_HAL_TIM_CHECK(err < XF_OK, 0, "tim read failed!");
229
230 return ticks;
231}
232
233/* ==================== [Static Functions] ================================== */
234
236{
237 xf_err_t err = XF_OK;
238 UNUSED(err);
239 xf_hal_dev_t *dev = NULL;
240 xf_hal_tim_t *dev_tim = (xf_hal_tim_t *)xf_malloc(sizeof(xf_hal_tim_t));
241 XF_ASSERT(dev_tim, NULL, TAG, "memory alloc failed!");
242
243 dev = (xf_hal_dev_t *)dev_tim;
244
245 err = xf_hal_driver_open(dev, XF_HAL_TIM_TYPE, tim_num);
246
247 if (err) {
248 XF_LOGE(TAG, "open failed!");
249 xf_free(dev);
250 dev = NULL;
251 }
252
253 return dev;
254}
255
256#endif
xf_err_t xf_hal_tim_set_cb(xf_tim_num_t tim_num, xf_hal_tim_cb_t callback, void *user_data)
定时器设置中断回调函数。
Definition xf_hal_tim.c:96
xf_err_t xf_hal_tim_stop(xf_tim_num_t tim_num)
定时器停止执行。
Definition xf_hal_tim.c:175
xf_err_t xf_hal_tim_start(xf_tim_num_t tim_num, uint32_t target_ticks)
定时器开始执行。
Definition xf_hal_tim.c:148
enum _xf_hal_tim_count_dir_t xf_hal_tim_count_dir_t
定时器计数方向。
xf_err_t xf_hal_tim_set_raw_ticks(xf_tim_num_t tim_num, uint32_t ticks)
设置当前的计数值。
Definition xf_hal_tim.c:200
xf_err_t xf_hal_tim_deinit(xf_tim_num_t tim_num)
定时器反初始化函数。
Definition xf_hal_tim.c:81
uint32_t xf_hal_tim_get_raw_ticks(xf_tim_num_t tim_num)
获取当前计数值。
Definition xf_hal_tim.c:217
void(* xf_hal_tim_cb_t)(xf_tim_num_t tim_num, uint32_t ticks, void *user_data)
tim 回调函数原型。
Definition xf_hal_tim.h:51
xf_err_t xf_hal_tim_init(xf_tim_num_t tim_num, uint32_t tick_freq_hz, xf_hal_tim_count_dir_t count_dir, bool auto_reload)
定时器初始化函数。
Definition xf_hal_tim.c:51
xf_err_t xf_hal_tim_set_isr(xf_tim_num_t tim_num, xf_hal_tim_cb_t callback, void *user_data)
定时器设置中断服务函数。
Definition xf_hal_tim.c:122
uint32_t xf_tim_num_t
tim 序号。
Definition xf_hal_tim.h:41
@ XF_HAL_TIM_CMD_COUNT_DIR
Definition xf_hal_tim.h:96
@ XF_HAL_TIM_CMD_CB
Definition xf_hal_tim.h:99
@ XF_HAL_TIM_CMD_AUTO_RELOAD
Definition xf_hal_tim.h:95
@ XF_HAL_TIM_CMD_TICK_FREQ_HZ
Definition xf_hal_tim.h:97
@ XF_HAL_TIM_CMD_TARGET_TICKS
Definition xf_hal_tim.h:98
@ XF_HAL_TIM_CMD_ACTIVE
Definition xf_hal_tim.h:94
@ XF_HAL_TIM_CMD_ISR
Definition xf_hal_tim.h:100
@ XF_HAL_TIM_ACTIVE_STOP
Definition xf_hal_tim.h:67
@ XF_HAL_TIM_ACTIVE_START
Definition xf_hal_tim.h:68
#define XF_ASSERT(condition, retval, tag, format,...)
xfusion 断言宏(条件 不成立 时则输出日志后返回)。
Definition xf_check.h:150
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_OK
Definition xf_err.h:43
@ XF_ERR_NOT_FOUND
Definition xf_err.h:50
@ XF_ERR_UNINIT
Definition xf_err.h:54
int xf_lock_unlock(xf_lock_t lock)
解锁.
Definition xf_lock.c:88
int xf_lock_lock(xf_lock_t lock)
锁定直至成功.
Definition xf_lock.c:72
#define xf_malloc(x)
Definition xf_stdlib.h:38
#define xf_free(x)
Definition xf_stdlib.h:39
xf_hal_tim_cb_t callback
Definition xf_hal_tim.h:57
用于对接 ADC 设置的参数。
Definition xf_hal_tim.h:110
xf_hal_tim_callback_t isr
Definition xf_hal_tim.h:118
xf_hal_tim_callback_t cb
Definition xf_hal_tim.h:117
xf_hal_tim_config_t config
Definition xf_hal_tim.c:30
xf_hal_dev_t dev
Definition xf_hal_tim.c:29
xf_err_t xf_hal_driver_close(xf_hal_dev_t *dev)
Definition xf_hal_dev.c:192
int xf_hal_driver_read(xf_hal_dev_t *dev, void *buf, size_t count)
Definition xf_hal_dev.c:168
xf_err_t xf_hal_driver_ioctl(xf_hal_dev_t *dev, uint32_t cmd, void *config)
Definition xf_hal_dev.c:154
xf_err_t xf_hal_driver_open(xf_hal_dev_t *dev, xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:118
int xf_hal_driver_write(xf_hal_dev_t *dev, const void *buf, size_t count)
Definition xf_hal_dev.c:180
xf_hal_dev_t * xf_hal_device_find(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:238
xf_err_t xf_hal_driver_register(xf_hal_type_t type, xf_hal_flag_t flag, xf_hal_dev_create_t constructor, const xf_driver_ops_t *driver_ops)
Definition xf_hal_dev.c:44
xf_hal_dev_t * xf_hal_driver_create(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:93
@ XF_HAL_FLAG_READ_WRITE
Definition xf_hal_dev.h:54
#define XF_HAL_TIM_TYPE
Definition xf_hal_tim.c:24
struct _xf_hal_tim_t xf_hal_tim_t
static xf_hal_dev_t * tim_constructor(xf_tim_num_t tim_num)
Definition xf_hal_tim.c:235
xf_err_t xf_hal_tim_register(const xf_driver_ops_t *driver_ops)
tim 设备注册。
Definition xf_hal_tim.c:46
#define XF_HAL_TIM_CHECK(condition, retval, format,...)
Definition xf_hal_tim.c:41
#define TAG
Definition xf_hal_tim.c:22
xf_hal 的 timer(定时器) 设备抽象。
#define XF_LOGE(tag, format,...)
#define UNUSED(_x)