|
@@ -14,6 +14,9 @@
|
|
|
|
|
|
|
|
#ifdef RT_USING_PWM
|
|
#ifdef RT_USING_PWM
|
|
|
|
|
|
|
|
|
|
+//------------------------------------------------------
|
|
|
|
|
+// 这里初始化一下 pwm 设备,一般的来说 pwm0 ... pwm6 就够了
|
|
|
|
|
+// 某些时候,还有设备直接叫 "pwm"
|
|
|
#define DEVICE_ID_MAX 6
|
|
#define DEVICE_ID_MAX 6
|
|
|
static struct pwm_devs *pwm_devs[DEVICE_ID_MAX];
|
|
static struct pwm_devs *pwm_devs[DEVICE_ID_MAX];
|
|
|
|
|
|
|
@@ -40,14 +43,55 @@ static int luat_pwm_rtt_init() {
|
|
|
|
|
|
|
|
INIT_COMPONENT_EXPORT(luat_pwm_rtt_init);
|
|
INIT_COMPONENT_EXPORT(luat_pwm_rtt_init);
|
|
|
|
|
|
|
|
|
|
+#ifdef SOC_FAMILY_STM32
|
|
|
|
|
+//------------------------------------------------------
|
|
|
|
|
+// 在 RTT, rt_device_pwm 实际上是 stm32_pwm 结构的第一个属性
|
|
|
|
|
+// 因此,暗戳戳的转成 (stm32_pwm *) 即可得到 channel
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+#else
|
|
|
|
|
+//------------------------------------------------------
|
|
|
|
|
+// 在 RTT, 用两个数字来确定 pwm 的 channel
|
|
|
|
|
+// {I}{N}
|
|
|
|
|
+// - I: 表示在 pwm_devs 中的下标
|
|
|
|
|
+// - N: 表示在该设备的 channel
|
|
|
|
|
+// 这两个数字通过 @channel 参数得到
|
|
|
|
|
+// - I: 十位
|
|
|
|
|
+// - N: 个位
|
|
|
|
|
+// @return -1 打开失败。 0 打开成功
|
|
|
int luat_pwm_open(int channel, size_t period, size_t pulse) {
|
|
int luat_pwm_open(int channel, size_t period, size_t pulse) {
|
|
|
- if (channel < 0 || channel >= DEVICE_ID_MAX )
|
|
|
|
|
|
|
+ int i = channel / 10;
|
|
|
|
|
+ int n = channel - (i * 10);
|
|
|
|
|
+ if (i < 0 || i >= DEVICE_ID_MAX )
|
|
|
return -1;
|
|
return -1;
|
|
|
- return -1;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ struct rt_device_pwm *dev = pwm_devs[i];
|
|
|
|
|
+ if(RT_NULL == dev)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+
|
|
|
|
|
+ rt_pwm_set(dev, n, period, pulse);
|
|
|
|
|
+ rt_pwm_enable(dev, n);
|
|
|
|
|
+
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// @return -1 关闭失败。 0 关闭成功
|
|
|
int luat_pwm_close(int channel) {
|
|
int luat_pwm_close(int channel) {
|
|
|
- return -1;
|
|
|
|
|
|
|
+ int i = channel / 10;
|
|
|
|
|
+ int n = channel - (i * 10);
|
|
|
|
|
+ if (i < 0 || i >= DEVICE_ID_MAX )
|
|
|
|
|
+ return -1;
|
|
|
|
|
+
|
|
|
|
|
+ struct rt_device_pwm *dev = pwm_devs[i];
|
|
|
|
|
+ if(RT_NULL == dev)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+
|
|
|
|
|
+ rt_pwm_disable(dev, n);
|
|
|
|
|
+
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
#endif
|
|
|
|
|
+//------------------------------------------------------
|
|
|
|
|
+#endif
|