XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_hal_pwm.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_hal_pwm.h"
15
16#if XF_HAL_PWM_IS_ENABLE
17
18#include "../kernel/xf_hal_dev.h"
19
20/* ==================== [Defines] =========================================== */
21
22#define TAG "hal_pwm"
23#define XF_HAL_PWM_TYPE XF_HAL_PWM
24
25/* ==================== [Typedefs] ========================================== */
26
27typedef struct _xf_hal_pwm_t {
28 xf_hal_dev_t dev; // 一定要放到第一个,以便后续close一起free
31
32/* ==================== [Static Prototypes] ================================= */
33
35
36/* ==================== [Static Variables] ================================== */
37
38/* ==================== [Macros] ============================================ */
39
40#define XF_HAL_PWM_CHECK(condition, retval, format, ...) \
41 XF_CHECK(condition, retval, TAG, format, ##__VA_ARGS__)
42
43/* ==================== [Global Functions] ================================== */
44
49
50xf_err_t xf_hal_pwm_init(xf_pwm_num_t pwm_num, uint32_t freq, uint32_t duty)
51{
52 xf_err_t err = XF_OK;
53 UNUSED(err);
55 XF_HAL_PWM_CHECK(!dev, XF_ERR_NOT_FOUND, "pwm init failed!");
56
57 xf_hal_pwm_t *dev_pwm = (xf_hal_pwm_t *)dev;
58
59#if XF_HAL_LOCK_IS_ENABLE
60 xf_lock_lock(dev_pwm->dev.mutex);
61#endif
62
63 dev_pwm->config.freq = freq;
64 dev_pwm->config.duty = duty;
65
66#if XF_HAL_LOCK_IS_ENABLE
67 xf_lock_unlock(dev_pwm->dev.mutex);
68#endif
69
71 XF_HAL_PWM_CHECK(err, err, "enable failed!");
72
73 return err;
74}
75
77{
78 xf_err_t err = XF_OK;
79 UNUSED(err);
80
82 xf_hal_pwm_t *dev_pwm = (xf_hal_pwm_t *)dev;
83 XF_HAL_PWM_CHECK(!dev_pwm, XF_ERR_INVALID_ARG, "pwm is not init!");
84
85 err = xf_hal_driver_close(dev);
86 XF_HAL_PWM_CHECK(err, err, "close failed!");
87
88 return err;
89}
90
92{
93 xf_err_t err = XF_OK;
94 UNUSED(err);
95
97 xf_hal_pwm_t *dev_pwm = (xf_hal_pwm_t *)dev;
98 XF_HAL_PWM_CHECK(!dev_pwm, XF_ERR_INVALID_ARG, "pwm is not init!");
99
100#if XF_HAL_LOCK_IS_ENABLE
101 xf_lock_lock(dev_pwm->dev.mutex);
102#endif
103
104 dev_pwm->config.enable = true;
105
106#if XF_HAL_LOCK_IS_ENABLE
107 xf_lock_unlock(dev_pwm->dev.mutex);
108#endif
109
110 err = xf_hal_driver_ioctl(dev, XF_HAL_PWM_CMD_ENABLE, &dev_pwm->config);
111 XF_HAL_PWM_CHECK(err, err, "enable failed!");
112
113 return err;
114}
115
117{
118 xf_err_t err = XF_OK;
119 UNUSED(err);
120
122 xf_hal_pwm_t *dev_pwm = (xf_hal_pwm_t *)dev;
123 XF_HAL_PWM_CHECK(!dev_pwm, XF_ERR_INVALID_ARG, "pwm is not init!");
124
125#if XF_HAL_LOCK_IS_ENABLE
126 xf_lock_lock(dev_pwm->dev.mutex);
127#endif
128
129 dev_pwm->config.enable = false;
130
131#if XF_HAL_LOCK_IS_ENABLE
132 xf_lock_unlock(dev_pwm->dev.mutex);
133#endif
134
135 err = xf_hal_driver_ioctl(dev, XF_HAL_PWM_CMD_ENABLE, &dev_pwm->config);
136 XF_HAL_PWM_CHECK(err, err, "disable failed!");
137
138 return err;
139}
140
142{
143 xf_err_t err = XF_OK;
144 UNUSED(err);
145
147 xf_hal_pwm_t *dev_pwm = (xf_hal_pwm_t *)dev;
148 XF_HAL_PWM_CHECK(!dev_pwm, XF_ERR_INVALID_ARG, "pwm is not init!");
149
150#if XF_HAL_LOCK_IS_ENABLE
151 xf_lock_lock(dev_pwm->dev.mutex);
152#endif
153
154 dev_pwm->config.freq = freq;
155
156#if XF_HAL_LOCK_IS_ENABLE
157 xf_lock_unlock(dev_pwm->dev.mutex);
158#endif
159
160 err = xf_hal_driver_ioctl(dev, XF_HAL_PWM_CMD_FREQ, &dev_pwm->config);
161 XF_HAL_PWM_CHECK(err, err, "config failed!");
162
163 return XF_OK;
164}
165
167{
168 xf_err_t err = XF_OK;
169 UNUSED(err);
170
172 xf_hal_pwm_t *dev_pwm = (xf_hal_pwm_t *)dev;
173 XF_HAL_PWM_CHECK(!dev_pwm, XF_ERR_INVALID_ARG, "pwm is not init!");
174
175#if XF_HAL_LOCK_IS_ENABLE
176 xf_lock_lock(dev_pwm->dev.mutex);
177#endif
178
179 dev_pwm->config.duty = duty;
180
181#if XF_HAL_LOCK_IS_ENABLE
182 xf_lock_unlock(dev_pwm->dev.mutex);
183#endif
184
185 err = xf_hal_driver_ioctl(dev, XF_HAL_PWM_CMD_DUTY, &dev_pwm->config);
186 XF_HAL_PWM_CHECK(err, err, "config failed!");
187
188 return XF_OK;
189}
190
191xf_err_t xf_hal_pwm_set_duty_resolution(xf_pwm_num_t pwm_num, uint32_t duty_resolution)
192{
193 xf_err_t err = XF_OK;
194 UNUSED(err);
195
197 xf_hal_pwm_t *dev_pwm = (xf_hal_pwm_t *)dev;
198 XF_HAL_PWM_CHECK(!dev_pwm, XF_ERR_INVALID_ARG, "pwm is not init!");
199
200#if XF_HAL_LOCK_IS_ENABLE
201 xf_lock_lock(dev_pwm->dev.mutex);
202#endif
203
204 dev_pwm->config.duty_resolution = duty_resolution;
205
206#if XF_HAL_LOCK_IS_ENABLE
207 xf_lock_unlock(dev_pwm->dev.mutex);
208#endif
209
211 XF_HAL_PWM_CHECK(err, err, "config failed!");
212
213 return XF_OK;
214}
215
217{
218 xf_err_t err = XF_OK;
219 UNUSED(err);
220
222 xf_hal_pwm_t *dev_pwm = (xf_hal_pwm_t *)dev;
223 XF_HAL_PWM_CHECK(!dev_pwm, XF_ERR_INVALID_ARG, "pwm is not init!");
224
225#if XF_HAL_LOCK_IS_ENABLE
226 xf_lock_lock(dev_pwm->dev.mutex);
227#endif
228
229 dev_pwm->config.io_num = io_num;
230
231#if XF_HAL_LOCK_IS_ENABLE
232 xf_lock_unlock(dev_pwm->dev.mutex);
233#endif
234
235 err = xf_hal_driver_ioctl(dev, XF_HAL_PWM_CMD_IO_NUM, &dev_pwm->config);
236 XF_HAL_PWM_CHECK(err, err, "config failed!");
237
238 return XF_OK;
239}
240
242{
244 xf_hal_pwm_t *dev_pwm = (xf_hal_pwm_t *)dev;
245 XF_HAL_PWM_CHECK(!dev_pwm, 0, "pwm is not init!");
246
247#if XF_HAL_LOCK_IS_ENABLE
248 xf_lock_lock(dev_pwm->dev.mutex);
249#endif
250
251 uint32_t freq = dev_pwm->config.freq;
252
253#if XF_HAL_LOCK_IS_ENABLE
254 xf_lock_unlock(dev_pwm->dev.mutex);
255#endif
256
257 return freq;
258}
259
261{
263 xf_hal_pwm_t *dev_pwm = (xf_hal_pwm_t *)dev;
264 XF_HAL_PWM_CHECK(!dev_pwm, 0, "pwm is not init!");
265
266#if XF_HAL_LOCK_IS_ENABLE
267 xf_lock_lock(dev_pwm->dev.mutex);
268#endif
269
270 uint32_t duty = dev_pwm->config.duty;
271
272#if XF_HAL_LOCK_IS_ENABLE
273 xf_lock_unlock(dev_pwm->dev.mutex);
274#endif
275
276 return duty;
277}
278
280{
282 xf_hal_pwm_t *dev_pwm = (xf_hal_pwm_t *)dev;
283 XF_HAL_PWM_CHECK(!dev_pwm, false, "pwm is not init!");
284
285#if XF_HAL_LOCK_IS_ENABLE
286 xf_lock_lock(dev_pwm->dev.mutex);
287#endif
288
289 bool enable = dev_pwm->config.enable;
290
291#if XF_HAL_LOCK_IS_ENABLE
292 xf_lock_unlock(dev_pwm->dev.mutex);
293#endif
294
295 return enable;
296}
297/* ==================== [Static Functions] ================================== */
298
300{
301 xf_err_t err = XF_OK;
302 UNUSED(err);
303 xf_hal_dev_t *dev = NULL;
304 xf_hal_pwm_t *dev_pwm = (xf_hal_pwm_t *)xf_malloc(sizeof(xf_hal_pwm_t));
305 XF_ASSERT(dev_pwm, NULL, TAG, "memory alloc failed!");
306
307 dev = (xf_hal_dev_t *)dev_pwm;
308
309 err = xf_hal_driver_open(dev, XF_HAL_PWM_TYPE, pwm_num);
310
311 if (err) {
312 XF_LOGE(TAG, "open failed!");
313 xf_free(dev);
314 dev = NULL;
315 }
316
317 return dev;
318}
319
320#endif
uint32_t xf_gpio_num_t
gpio 序号。
Definition xf_hal_gpio.h:44
xf_err_t xf_hal_pwm_enable(xf_pwm_num_t pwm_num)
pwm 启用函数。启用后,pwm 信号开始输出。
Definition xf_hal_pwm.c:91
uint32_t xf_pwm_num_t
pwm 序号。
Definition xf_hal_pwm.h:43
xf_err_t xf_hal_pwm_set_freq(xf_pwm_num_t pwm_num, uint32_t freq)
pwm 设置输出频率。
Definition xf_hal_pwm.c:141
uint32_t xf_hal_pwm_get_duty(xf_pwm_num_t pwm_num)
pwm 获取占空比。
Definition xf_hal_pwm.c:260
xf_err_t xf_hal_pwm_init(xf_pwm_num_t pwm_num, uint32_t freq, uint32_t duty)
pwm 初始化函数。使用 pwm 之前必须要进行初始化。
Definition xf_hal_pwm.c:50
xf_err_t xf_hal_pwm_set_gpio(xf_pwm_num_t pwm_num, xf_gpio_num_t io_num)
pwm 设置 gpio 占空比。
Definition xf_hal_pwm.c:216
uint32_t xf_hal_pwm_get_freq(xf_pwm_num_t pwm_num)
pwm 获取输出频率。
Definition xf_hal_pwm.c:241
xf_err_t xf_hal_pwm_set_duty_resolution(xf_pwm_num_t pwm_num, uint32_t duty_resolution)
pwm 设置占空比分辨率。
Definition xf_hal_pwm.c:191
xf_err_t xf_hal_pwm_set_duty(xf_pwm_num_t pwm_num, uint32_t duty)
pwm 设置占空比。
Definition xf_hal_pwm.c:166
xf_err_t xf_hal_pwm_deinit(xf_pwm_num_t pwm_num)
pwm 反初始化函数。恢复到未初始化状态且回收相关资源。
Definition xf_hal_pwm.c:76
xf_err_t xf_hal_pwm_disable(xf_pwm_num_t pwm_num)
pwm 禁用函数。禁用后,pwm 将不会输出。
Definition xf_hal_pwm.c:116
bool xf_hal_pwm_is_enable(xf_pwm_num_t pwm_num)
pwm 是否启用。
Definition xf_hal_pwm.c:279
@ XF_HAL_PWM_CMD_FREQ
Definition xf_hal_pwm.h:54
@ XF_HAL_PWM_CMD_DUTY_RESOLUTION
Definition xf_hal_pwm.h:56
@ XF_HAL_PWM_CMD_ENABLE
Definition xf_hal_pwm.h:53
@ XF_HAL_PWM_CMD_DUTY
Definition xf_hal_pwm.h:55
@ XF_HAL_PWM_CMD_IO_NUM
Definition xf_hal_pwm.h:57
#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_ERR_INVALID_ARG
Definition xf_err.h:46
@ XF_OK
Definition xf_err.h:43
@ XF_ERR_NOT_FOUND
Definition xf_err.h:50
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
用于对接 pwm 设置的参数。
Definition xf_hal_pwm.h:67
xf_gpio_num_t io_num
Definition xf_hal_pwm.h:72
uint32_t duty_resolution
Definition xf_hal_pwm.h:71
xf_hal_dev_t dev
Definition xf_hal_pwm.c:28
xf_hal_pwm_config_t config
Definition xf_hal_pwm.c:29
xf_err_t xf_hal_driver_close(xf_hal_dev_t *dev)
Definition xf_hal_dev.c:192
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
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_ONLY_READ
Definition xf_hal_dev.h:52
struct _xf_hal_pwm_t xf_hal_pwm_t
static xf_hal_dev_t * pwm_constructor(xf_pwm_num_t pwm_num)
Definition xf_hal_pwm.c:299
#define XF_HAL_PWM_TYPE
Definition xf_hal_pwm.c:23
#define XF_HAL_PWM_CHECK(condition, retval, format,...)
Definition xf_hal_pwm.c:40
xf_err_t xf_hal_pwm_register(const xf_driver_ops_t *driver_ops)
pwm 设备注册。
Definition xf_hal_pwm.c:45
#define TAG
Definition xf_hal_pwm.c:22
xf_hal 的 pwm(脉冲宽度调制) 设备抽象。
#define XF_LOGE(tag, format,...)
#define UNUSED(_x)