Преглед на файлове

优化pwm控制的内存使用,以及初始化数据部分

kindring преди 1 година
родител
ревизия
4359f520ae
променени са 3 файла, в които са добавени 136 реда и са изтрити 83 реда
  1. 13 19
      src/light.c
  2. 82 58
      src/pwm_light/pwm_light.c
  3. 41 6
      src/pwm_light/pwm_light.h

+ 13 - 19
src/light.c

@@ -8,35 +8,29 @@
 
 
 #include "light.h"
 #include "light.h"
 
 
-// pwm 结构体数组 不定长 最大5个
-pwm_t pwm_light_list[] = {
-    {PWM_CH0, GPIO_WARM, 0, 100, 5, PWM_CLK_DIV_16},
-    {PWM_CH1, GPIO_COLD, 0, 100, 5, PWM_CLK_DIV_16},
-    {PWM_CH2, GPIO_FAN, 0, 100, 5, PWM_CLK_DIV_16},
-};
+// 配置
 
 
 int light_init(){
 int light_init(){
     LOG("[light_init]\n");
     LOG("[light_init]\n");
     // 初始化pwm
     // 初始化pwm
     int ret = 0;
     int ret = 0;
-    for (int i = 0; i < sizeof(pwm_light_list) / sizeof(pwm_t); i++) {
-        ret = pwm_light_init(&pwm_light_list[i]);
-        if (ret != 0) {
-            LOG("pwm_light_init err %d\n", ret);
-            return ret;
-        }
+    if()
+    ret = pwm_light_init(0, GPIO_WARM, 100, 100, 5, PWM_CLK_DIV_16);
+    if(ret != 0){
+        LOG("[light_init] pwm_light_init warm failed\n");
+        return ret;
     }
     }
+    ret = pwm_light_init(1, GPIO_COLD, 100, 100, 5, PWM_CLK_DIV_16);
+    if(ret != 0){
+        LOG("[light_init] pwm_light_init cold failed\n");
+        return ret;
+    }
+
     return ret;
     return ret;
 }
 }
 
 
 int light_set(uint8_t ch, uint8_t val){
 int light_set(uint8_t ch, uint8_t val){
     LOG("[light_set] set ch%d val to %d\n", ch, val);
     LOG("[light_set] set ch%d val to %d\n", ch, val);
-    int ret = 0;
-    if (ch >= sizeof(pwm_light_list) / sizeof(pwm_t)) {
-        LOG("ch%d not exist\n", ch);
-        return -1;
-    }
-    pwm_t *pwm = &pwm_light_list[ch];
-    ret = pwm_light_set_val(pwm, val);
+    ret = pwm_light_set_val(ch, val);
     return ret;
     return ret;
 }
 }

+ 82 - 58
src/pwm_light/pwm_light.c

@@ -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;
 
 

+ 41 - 6
src/pwm_light/pwm_light.h

@@ -3,6 +3,10 @@
 
 
 #include "gpio.h"
 #include "gpio.h"
 
 
+// 判断通道是否合法 0 - max_pwm_light
+#define CHECK_PWM_CH if(ch < 0 || ch > max_pwm_light){return -1;}
+   
+#define CHECK_PWM_PIN if(pin < P0 || pin > P34){return -1;}
 
 
 
 
 // pwm 结构体
 // pwm 结构体
@@ -18,26 +22,57 @@ typedef struct pwm_t {
 // pwm结构体数组 不定长 最大5个
 // pwm结构体数组 不定长 最大5个
 extern pwm_t pwm_light_list[];
 extern pwm_t pwm_light_list[];
 
 
+
+/**
+ * @brief 获取pwm
+ * @param uint8_t ch 通道
+ * @return pwm_t* pwm结构体
+*/
+extern pwm_t *pwm_light_get(uint8_t ch);
+
 /**
 /**
  * @brief 初始化pwm
  * @brief 初始化pwm
- * @param pwm pwm结构体
+ * @param uint8_t ch 通道
+ * @param GPIO_Pin_e pin 引脚编号
+ * @param int val 值
+ * @param uint8_t total 总量
+ * @param uint8_t step 步长
+ * @param PWM_CLK_DIV_e div 分频
+ * @return 0 成功 -1 失败
+*/
+extern int pwm_light_init(uint8_t ch, GPIO_Pin_e pin, int val, uint8_t total, uint8_t step, PWM_CLK_DIV_e div);
+
+/**
+ * @brief 设置pwm总量
+ * @param uint8_t ch 通道
+ * @param int total 总量
+ * @return 0 成功 -1 失败
 */
 */
-extern int pwm_light_init(pwm_t *pwm);
+extern int pwm_light_set_total(uint8_t ch, int total )
+
+/**
+ * @brief 设置pwm引脚
+ * @param uint8_t ch 通道
+ * @param GPIO_Pin_e pin 引脚编号
+ * @return 0 成功 -1 失败
+*/
+extern int pwm_light_set_pin(uint8_t ch, GPIO_Pin_e pin);
+
 
 
 /**
 /**
  * @brief 设置pwm值
  * @brief 设置pwm值
- * @param pwm pwm结构体
+ * @param uint8_t ch 通道
  * @param val 新值
  * @param val 新值
  * @return 0 成功 -1 失败
  * @return 0 成功 -1 失败
 */
 */
-extern int pwm_light_set_val(pwm_t *pwm, uint8_t val);
+extern int pwm_light_set_val(uint8_t ch , uint8_t val);
 
 
 /**
 /**
  * @brief 设置pwm频率
  * @brief 设置pwm频率
- * @param pwm pwm结构体
+ * @param uint8_t ch 通道
  * @param div 目标频率
  * @param div 目标频率
 */
 */
-extern int pwm_light_set_div(pwm_t *pwm, PWM_CLK_DIV_e div);
+extern int pwm_light_set_div(uint8_t ch , PWM_CLK_DIV_e div);
 
 
 
 
 #endif
 #endif