|
@@ -3,8 +3,16 @@
|
|
|
|
|
|
#include "pwm_light.h"
|
|
#include "pwm_light.h"
|
|
|
|
|
|
|
|
+uint8_t max_pwm_light = 5;
|
|
|
|
+uint8_t pwm_light_len = 0;
|
|
// 申请5个通道的内存
|
|
// 申请5个通道的内存
|
|
-pwm_t pwm_light_chann_list[5];
|
|
|
|
|
|
+pwm_t pwm_light_chann_list[max_pwm_light] = {
|
|
|
|
+ {PWM_CH0, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
|
|
|
|
+ {PWM_CH1, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
|
|
|
|
+ {PWM_CH2, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
|
|
|
|
+ {PWM_CH3, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
|
|
|
|
+ {PWM_CH5, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
|
|
|
|
+};
|
|
|
|
|
|
// 刷新 pwm 引脚
|
|
// 刷新 pwm 引脚
|
|
static void pwm_light_reflash(void)
|
|
static void pwm_light_reflash(void)
|
|
@@ -15,7 +23,10 @@ static void pwm_light_reflash(void)
|
|
{
|
|
{
|
|
// 获取 pwm
|
|
// 获取 pwm
|
|
pwm_t *pwm = &pwm_light_chann_list[i];
|
|
pwm_t *pwm = &pwm_light_chann_list[i];
|
|
-
|
|
|
|
|
|
+ // 判断 pwm 通道是否已经初始化;
|
|
|
|
+ if(pwm->pin == GPIO_DUMMY){
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
hal_pwm_close_channel(pwm->pwm_ch);
|
|
hal_pwm_close_channel(pwm->pwm_ch);
|
|
hal_pwm_destroy(pwm->pwm_ch);
|
|
hal_pwm_destroy(pwm->pwm_ch);
|
|
|
|
|
|
@@ -33,56 +44,70 @@ static void pwm_light_reflash(void)
|
|
hal_pwm_start();
|
|
hal_pwm_start();
|
|
}
|
|
}
|
|
|
|
|
|
-// 创建 pwm
|
|
|
|
-int pwm_light_init(pwm_t *pwm)
|
|
|
|
|
|
+// 获取 pwm
|
|
|
|
+pwm_t *pwm_light_get(uint8_t ch)
|
|
{
|
|
{
|
|
- // 判断 pwm_ch 是否合法
|
|
|
|
- if (pwm->pwm_ch < PWM_CH0 || pwm->pwm_ch > PWM_CH4)
|
|
|
|
- {
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
|
|
+ // 判断 ch 是否合法
|
|
|
|
+ CHECK_PWM_CH
|
|
|
|
+
|
|
|
|
+ // 获取 pwm
|
|
|
|
+ pwm_t *pwm = &pwm_light_chann_list[ch];
|
|
|
|
+
|
|
|
|
+ return pwm;
|
|
|
|
+}
|
|
|
|
|
|
|
|
+// 初始化 pwm
|
|
|
|
+int pwm_light_init(uint8_t ch, GPIO_Pin_e pin, int val, uint8_t total, uint8_t step, PWM_CLK_DIV_e div)
|
|
|
|
+{
|
|
|
|
+ pwm_t *pwm;
|
|
|
|
+ // 判断 ch 是否合法
|
|
|
|
+ CHECK_PWM_CH
|
|
// 判断 pin 是否合法
|
|
// 判断 pin 是否合法
|
|
- if (pwm->pin < GPIO_P00 || pwm->pin > GPIO_P34)
|
|
|
|
- {
|
|
|
|
- return -2;
|
|
|
|
- }
|
|
|
|
|
|
+ CHECK_PWM_PIN
|
|
|
|
|
|
- // 判断 val 是否合法
|
|
|
|
- if (pwm->val > pwm->total)
|
|
|
|
- {
|
|
|
|
- return -3;
|
|
|
|
- }
|
|
|
|
|
|
+ // 获取 pwm
|
|
|
|
+ pwm = &pwm_light_chann_list[ch];
|
|
|
|
|
|
- // 判断 step 是否合法
|
|
|
|
- if (pwm->step > pwm->total)
|
|
|
|
- {
|
|
|
|
- return -4;
|
|
|
|
|
|
+ if(val > total){
|
|
|
|
+ val = total;
|
|
}
|
|
}
|
|
|
|
|
|
- // 判断 div 是否合法
|
|
|
|
- if (pwm->div < PWM_CLK_DIV_2 || pwm->div > PWM_CLK_DIV_128)
|
|
|
|
- {
|
|
|
|
- return -5;
|
|
|
|
- }
|
|
|
|
|
|
+ // 设置 pwm
|
|
|
|
+ pwm->pin = pin;
|
|
|
|
+ pwm->val = val;
|
|
|
|
+ pwm->total = total;
|
|
|
|
+ pwm->step = step;
|
|
|
|
+ pwm->div = div;
|
|
|
|
|
|
- // 判断 pwm_light_chann_list 是否已满
|
|
|
|
- if (sizeof(pwm_light_chann_list) / sizeof(pwm_t) >= 5)
|
|
|
|
- {
|
|
|
|
- return -6;
|
|
|
|
- }
|
|
|
|
|
|
+ // 刷新 pwm 引脚
|
|
|
|
+ pwm_light_reflash();
|
|
|
|
|
|
- // 判断 pwm 是否已存在
|
|
|
|
- for (int i = 0; i < sizeof(pwm_light_chann_list) / sizeof(pwm_t); i++)
|
|
|
|
- {
|
|
|
|
- if (pwm_light_chann_list[i].pwm_ch == pwm->pwm_ch)
|
|
|
|
- {
|
|
|
|
- return -7;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int pwm_light_set_total(uint8_t ch, int total )
|
|
|
|
+{
|
|
|
|
+ pwm_t *pwm;
|
|
|
|
+ // 判断 ch 是否合法
|
|
|
|
+ CHECK_PWM_CH
|
|
|
|
+ // 获取 pwm
|
|
|
|
+ pwm = &pwm_light_chann_list[ch];
|
|
|
|
+ pwm->total = total;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int pwm_light_set_pin(uint8_t ch, GPIO_Pin_e pin)
|
|
|
|
+{
|
|
|
|
+ pwm_t *pwm;
|
|
|
|
+ // 判断 ch 是否合法
|
|
|
|
+ CHECK_PWM_CH
|
|
|
|
+ // 判断 pin 是否合法
|
|
|
|
+ CHECK_PWM_PIN
|
|
|
|
+
|
|
|
|
+ // 获取 pwm
|
|
|
|
+ pwm = &pwm_light_chann_list[ch];
|
|
|
|
|
|
- // 添加 pwm
|
|
|
|
- pwm_light_chann_list[sizeof(pwm_light_chann_list) / sizeof(pwm_t)] = *pwm;
|
|
|
|
|
|
+ // 设置 pwm
|
|
|
|
+ pwm->pin = pin;
|
|
|
|
|
|
// 刷新 pwm 引脚
|
|
// 刷新 pwm 引脚
|
|
pwm_light_reflash();
|
|
pwm_light_reflash();
|
|
@@ -90,18 +115,17 @@ int pwm_light_init(pwm_t *pwm)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-int pwm_light_set_val(pwm_t *pwm, uint8_t val)
|
|
|
|
|
|
+int pwm_light_set_val(uint8_t ch , uint8_t val)
|
|
{
|
|
{
|
|
- // 判断 pwm_ch 是否合法
|
|
|
|
- if (pwm->pwm_ch < PWM_CH0 || pwm->pwm_ch > PWM_CH4)
|
|
|
|
- {
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
|
|
+ pwm_t *pwm;
|
|
|
|
+ // 判断 ch 是否合法
|
|
|
|
+ CHECK_PWM_CH
|
|
|
|
|
|
- // 判断 val 是否合法
|
|
|
|
- if (val > pwm->total)
|
|
|
|
- {
|
|
|
|
- return -2;
|
|
|
|
|
|
+ // 获取 pwm
|
|
|
|
+ pwm = &pwm_light_chann_list[ch];
|
|
|
|
+
|
|
|
|
+ if(val > pwm->total){
|
|
|
|
+ val = pwm->total;
|
|
}
|
|
}
|
|
|
|
|
|
// 设置 pwm
|
|
// 设置 pwm
|
|
@@ -113,13 +137,11 @@ int pwm_light_set_val(pwm_t *pwm, uint8_t val)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-int pwm_light_set_div(pwm_t *pwm, PWM_CLK_DIV_e div)
|
|
|
|
|
|
+int pwm_light_set_div(uint8_t ch, PWM_CLK_DIV_e div)
|
|
{
|
|
{
|
|
- // 判断 pwm_ch 是否合法
|
|
|
|
- if (pwm->pwm_ch < PWM_CH0 || pwm->pwm_ch > PWM_CH4)
|
|
|
|
- {
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
|
|
+ pwm_t *pwm;
|
|
|
|
+ // 判断 ch 是否合法
|
|
|
|
+ CHECK_PWM_CH
|
|
|
|
|
|
// 判断 div 是否合法
|
|
// 判断 div 是否合法
|
|
if (div < PWM_CLK_DIV_2 || div > PWM_CLK_DIV_128)
|
|
if (div < PWM_CLK_DIV_2 || div > PWM_CLK_DIV_128)
|
|
@@ -127,6 +149,8 @@ int pwm_light_set_div(pwm_t *pwm, PWM_CLK_DIV_e div)
|
|
return -2;
|
|
return -2;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // 获取 pwm
|
|
|
|
+ pwm = &pwm_light_chann_list[ch];
|
|
// 设置 pwm
|
|
// 设置 pwm
|
|
pwm->div = div;
|
|
pwm->div = div;
|
|
|
|
|