Browse Source

Рефакторинг.

TelenkovDmitry 8 months ago
parent
commit
f9b9d3e2e4

BIN
doc/~$_модули_входов_выходов_редакция_4.doc


BIN
doc/~$исание схемы 048260х MAIO124.docx


+ 16 - 32
fw/modules/io/digital_input.c

@@ -2,8 +2,6 @@
 #include "digital_input.h"
 #include "FreeRTOS.h"
 #include "task.h"
-#include "input.h"
-#include "output.h"
 #include "settings_api.h"
 #include "io_utils.h"
 #include "mux.h"
@@ -55,41 +53,14 @@ void di_init(void)
     for (int i = 0; i < DI_NUMBER; i++) 
     {
         di_base_init(&d_inputs[i]);
-        load_sens_init(&di_load[i]);
+        di_load_sens_init(&di_load[i]);
     }
     
     // EXTI
     di_exti_init();
     
-    
-    
-#if 0
-    output_state_bit = settings.do_bits;
-    output_mode_bit = settings.do_mode_bits;
-    
-    // Таймер для выходов в режиме PWM
-    out_pwm_tim_init();
-    
-    for (int i = 0; i < DO_NUMBER; i++)
-    {
-        output_pwm[i] = settings.do_pwm[i];
-        output_pwm_save[i] = settings.do_pwm_save[i];
-        output_pwm_period[i] = settings.do_pwm_period[i];
-        output_pwm_period_save[i] = settings.do_pwm_period_save[i];
-
-        if (save_mode_get()) {
-            outputs[i].pwm_duty = settings.do_pwm_save[i];
-            outputs[i].pwm_period = settings.do_pwm_period_save[i];
-        }
-        else {
-            outputs[i].pwm_duty = settings.do_pwm[i];
-            outputs[i].pwm_period = settings.do_pwm_period[i];
-        }
-        
-        out_gpio_init(&outputs[i], i);
-        
-    }
-#endif    
+    // Таймер для антидребезга
+    di_tim_init();
 }
 
 //
@@ -147,6 +118,19 @@ void di_exti_init(void)
     nvic_irq_enable(EXINT15_10_IRQn, 5, 0);
 }
 
+//
+void di_load_sens_init(simple_gpio_t *sens)
+{
+    gpio_init_type gpio_init_struct;
+    
+    gpio_default_para_init(&gpio_init_struct);
+        
+    gpio_init_struct.gpio_pull           = GPIO_PULL_NONE;  
+    gpio_init_struct.gpio_mode           = GPIO_MODE_INPUT;  
+    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
+    gpio_init_struct.gpio_pins           = sens->pin;
+    gpio_init(sens->port, &gpio_init_struct); 
+}
 
 // Таймер для антидребезга
 void di_tim_init(void)

+ 3 - 0
fw/modules/io/digital_input.h

@@ -16,6 +16,9 @@ void di_exti_init(void);
 // 
 void di_tim_init(void);
 
+//
+void di_load_sens_init(simple_gpio_t *sens);
+
 //
 void di_set(void);
 

+ 318 - 2
fw/modules/io/digital_output.c

@@ -2,10 +2,326 @@
 #include "digital_output.h"
 #include "FreeRTOS.h"
 #include "task.h"
-#include "input.h"
-#include "output.h"
 #include "settings_api.h"
 #include "io_utils.h"
 #include "mux.h"
 #include <stdio.h>
 
+
+uint16_t output_state_bit;
+uint16_t output_mode_bit;
+uint16_t output_pwm[DO_NUMBER];
+uint16_t output_pwm_save[DO_NUMBER];
+uint16_t output_pwm_period[DO_NUMBER];
+uint16_t output_pwm_period_save[DO_NUMBER];
+
+
+out_t outputs[DO_NUMBER] = {
+    {GPIOC, GPIO_PINS_12, 0, 0, 0, false, 0, 0},   // -
+    {GPIOD, GPIO_PINS_2,  0, 0, 0, false, 0, 0},   // -
+    {GPIOE, GPIO_PINS_6,  0, 0, 0, false, 0, 0},   // TMR9_CH2 (remap)
+    {GPIOC, GPIO_PINS_1,  0, 0, 0, false, 0, 0},   // -
+    {GPIOC, GPIO_PINS_11, 0, 0, 0, false, 0, 0},   // -
+    {GPIOD, GPIO_PINS_3,  0, 0, 0, false, 0, 0},   // -
+    {GPIOE, GPIO_PINS_5,  0, 0, 0, false, 0, 0},   // TMR9_CH1 (remap)
+    {GPIOC, GPIO_PINS_2,  0, 0, 0, false, 0, 0}    // -
+};
+
+
+
+//
+void do_init(void)
+{
+    output_state_bit = settings.do_bits;
+    output_mode_bit = settings.do_mode_bits;
+    
+    // Таймер для выходов в режиме PWM
+    di_out_pwm_tim_init();
+    
+    for (int i = 0; i < DO_NUMBER; i++)
+    {
+        output_pwm[i] = settings.do_pwm[i];
+        output_pwm_save[i] = settings.do_pwm_save[i];
+        output_pwm_period[i] = settings.do_pwm_period[i];
+        output_pwm_period_save[i] = settings.do_pwm_period_save[i];
+
+        if (save_mode_get()) {
+            outputs[i].pwm_duty = settings.do_pwm_save[i];
+            outputs[i].pwm_period = settings.do_pwm_period_save[i];
+        }
+        else {
+            outputs[i].pwm_duty = settings.do_pwm[i];
+            outputs[i].pwm_period = settings.do_pwm_period[i];
+        }
+        
+        di_gpio_init(&outputs[i], i);
+    }
+}
+
+//
+void di_gpio_init(out_t *out, uint8_t index)
+{
+    gpio_init_type gpio_init_struct;
+
+    
+    // Выход
+    if (out->mode == 0)
+    {
+        gpio_default_para_init(&gpio_init_struct);
+        
+        gpio_init_struct.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;  
+        gpio_init_struct.gpio_pull           = GPIO_PULL_NONE;  
+        gpio_init_struct.gpio_mode           = GPIO_MODE_OUTPUT;  
+        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
+        gpio_init_struct.gpio_pins           = out->pin;
+        gpio_init(out->port, &gpio_init_struct); 
+    }
+    
+    do_update(out, index) ;
+}
+
+//
+void do_set_common(void)
+{
+    bool flag = false;
+    
+    for (int i = 0; i < DO_NUMBER; i++)
+    {
+        // 
+        if ((settings.do_bits & (1 << i)) != (output_state_bit & (1 << i))) {
+            settings.do_bits = output_state_bit;
+            flag = true;
+        } 
+        else if ((settings.do_mode_bits & (1 << i)) != (output_mode_bit & (1 << i))) {
+            settings.do_mode_bits ^= (1 << i);
+            settings.do_mode_bits = output_mode_bit;
+            flag = true;
+        }  
+        else if (settings.do_pwm[i] != output_pwm[i]) {
+            settings.do_pwm[i] = output_pwm[i];
+            flag = true;
+        }
+        else if (settings.do_pwm_save[i] != output_pwm_save[i]) {
+            settings.do_pwm_save[i] = output_pwm_save[i];
+            flag = true;
+        }
+        else if (settings.do_pwm_period [i] != output_pwm_period[i]) {
+            settings.do_pwm_period[i] = output_pwm_period[i];
+            flag = true;
+        }
+        else if (settings.do_pwm_period_save[i] != output_pwm_period_save[i]) {
+            settings.do_pwm_period_save[i] = output_pwm_period_save[i];
+            flag = true;
+        }
+ 
+        if (flag)
+            do_update(&outputs[i], i);
+    }
+}
+
+//
+void do_set(void)
+{
+    if (output_state_bit == settings.do_bits) 
+        return;
+    
+    // Состояние выхода/выходов изменилось
+    for (int i = 0; i < DO_NUMBER; i++)
+    {
+        if ((settings.do_bits & (1 << i)) != (output_state_bit & (1 << i))) 
+        {
+            do_update(&outputs[i], i);
+        }
+    }
+    
+    // Сохраним новое значение выходов в настройках
+    settings.do_bits = output_state_bit;
+}
+
+// Установка значения на выходе 
+void do_update(out_t *out, uint8_t i)
+{
+    // Режим ШИМ
+    if (settings.do_mode_bits & (1 << i)) {
+        // Безопасный режим включен
+        if (save_mode_get())
+            do_set_pwm(settings.do_pwm_period_save[i], settings.do_pwm_save[i], i);
+        else
+            do_set_pwm(settings.do_pwm_period[i], settings.do_pwm[i], i);
+    }
+    // Режим обычного выхода
+    else {
+        out->mode = 0;
+        // Безопасный режим включен
+        if (save_mode_get())
+            do_set_out(out, settings.do_save_bits & (1 << i));
+        else
+            do_set_out(out, settings.do_bits & (1 << i));
+    }
+}
+
+//
+void do_set_mode(void)
+{
+    if (output_mode_bit == settings.do_mode_bits)
+        return;
+  
+    // Состояние выхода/выходов изменилось
+    for (int i = 0; i < DO_NUMBER; i++)
+    {
+        if ((settings.do_mode_bits & (1 << i)) != (output_mode_bit & (1 << i)))
+        {
+            settings.do_mode_bits ^= (1 << i);
+            do_update(&outputs[i], i);
+        }
+    }
+  
+    settings.do_mode_bits = output_mode_bit;
+}
+
+//
+void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index)
+{
+    uint16_t duty_calc;
+  
+    if (duty == 0)
+        duty_calc = 0;
+    else
+        duty_calc = (duty*period/100 < 1) ? 1 : duty*period/100;
+    
+    outputs[index].pwm_flag = false;
+    outputs[index].pwm_period_cnt = 0;
+    outputs[index].pwm_duty_cnt = 0;
+    outputs[index].pwm_period = period;
+    outputs[index].pwm_duty = duty_calc;
+    outputs[index].mode = 1;
+}
+
+//
+void do_set_out(out_t *out, uint8_t val)
+{
+    if (val) {
+        gpio_bits_set(GPIOB, GPIO_PINS_15);
+        gpio_bits_set(out->port, out->pin);
+    }
+    else {
+        gpio_bits_reset(GPIOB, GPIO_PINS_15);
+        gpio_bits_reset(out->port, out->pin);
+    }
+}
+
+//
+void out_as_pwm(void)
+{
+    uint32_t timer_period;
+    uint16_t pwm_pulse;
+    crm_clocks_freq_type crm_clocks_freq_struct = {0};
+    tmr_output_config_type tmr_output_struct;
+    
+    crm_periph_clock_enable(CRM_TMR9_PERIPH_CLOCK, TRUE);
+    
+    crm_clocks_freq_get(&crm_clocks_freq_struct);
+    
+    //timer_period = (crm_clocks_freq_struct.sclk_freq / 10 ) - 1;
+    
+    timer_period = 24000 - 1;
+    pwm_pulse = 125*timer_period/1000;
+    
+    tmr_base_init(TMR9, 24000 - 1, 1000 - 1);
+    tmr_cnt_dir_set(TMR9, TMR_COUNT_UP);
+
+    tmr_output_default_para_init(&tmr_output_struct);
+    tmr_output_struct.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
+    tmr_output_struct.oc_output_state = TRUE;
+    tmr_output_struct.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
+    tmr_output_struct.oc_idle_state = TRUE;
+    
+    tmr_output_channel_config(TMR9, TMR_SELECT_CHANNEL_1, &tmr_output_struct);
+    tmr_channel_value_set(TMR9, TMR_SELECT_CHANNEL_1, pwm_pulse);
+    
+    tmr_flag_clear(TMR9, TMR_OVF_FLAG);
+    nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
+    nvic_irq_enable(TMR1_BRK_TMR9_IRQn, 5, 0);
+    
+    //tmr_interrupt_enable(TMR9, TMR_OVF_INT, TRUE);
+    tmr_interrupt_enable(TMR9, TMR_C1_INT, TRUE);
+    
+    tmr_counter_enable(TMR9, TRUE);
+}
+
+
+// -------------------------------------------------------------------------- //
+//                              PWM
+
+// Таймер для выходов в режиме PWM. Частота 10Гц.
+void di_out_pwm_tim_init(void)
+{
+    uint16_t prescaler_value = 0;
+    uint16_t timer_period = 1000 - 1;
+    gpio_init_type gpio_init_struct;
+    
+    gpio_default_para_init(&gpio_init_struct);
+        
+    gpio_init_struct.gpio_pins = GPIO_PINS_15;
+    gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
+    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
+    gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
+    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
+    gpio_init(GPIOB, &gpio_init_struct);
+
+    crm_periph_clock_enable(CRM_TMR9_PERIPH_CLOCK, TRUE);
+    
+    prescaler_value = (uint16_t)(system_core_clock / 10000) - 1;
+    tmr_base_init(TMR9, timer_period, prescaler_value);
+    
+    tmr_cnt_dir_set(TMR9, TMR_COUNT_UP);
+    tmr_clock_source_div_set(TMR9, TMR_CLOCK_DIV1);
+    
+    nvic_irq_enable(TMR1_BRK_TMR9_IRQn, 5, 0);
+
+    tmr_interrupt_enable(TMR9, TMR_OVF_INT, TRUE);
+    
+    tmr_counter_enable(TMR9, TRUE);
+}
+
+
+// Реализация программного PWM для цифровых выходов
+inline void pwm_proc(void)
+{
+    for (int i = 0; i < DO_NUMBER; i++)
+    {
+        if (outputs[i].mode)    // режим PWM
+        {
+            if (outputs[i].pwm_period_cnt == outputs[i].pwm_period /*PWM_PERIOD_TEST*/) {
+                outputs[i].pwm_period_cnt = 0;
+            }
+            if (outputs[i].pwm_period_cnt == 0) {
+                outputs[i].pwm_flag = false;
+                gpio_bits_set(outputs[i].port, outputs[i].pin);
+                //gpio_bits_set(GPIOB, GPIO_PINS_15);
+            }
+            if (outputs[i].pwm_duty_cnt == outputs[i].pwm_duty /*PWM_DUTY_TEST*/) {
+                outputs[i].pwm_duty_cnt = 0;
+                gpio_bits_reset(outputs[i].port, outputs[i].pin);
+                //gpio_bits_reset(GPIOB, GPIO_PINS_15);
+                outputs[i].pwm_flag = true;
+            }
+            outputs[i].pwm_period_cnt++;
+            if (outputs[i].pwm_flag == false) {
+                outputs[i].pwm_duty_cnt++;
+            }
+        }
+    }
+}
+
+// Реализация программного PWM для цифровых выходов
+void TMR1_BRK_TMR9_IRQHandler(void)
+{
+    if(tmr_flag_get(TMR9, TMR_OVF_FLAG) != RESET)
+    {
+        tmr_flag_clear(TMR9, TMR_OVF_FLAG);
+        //GPIOB->odt ^= GPIO_PINS_15;
+        pwm_proc();
+    }
+}
+

+ 29 - 0
fw/modules/io/digital_output.h

@@ -5,6 +5,35 @@
 #include "io.h"
 
 
+//
+void do_init(void);
+
+//
+void di_gpio_init(out_t *out, uint8_t index);
+
+//
+void do_set_common(void);
+
+//
+void do_set(void);
+
+//
+void do_update(out_t *out, uint8_t i);
+
+//
+void do_set_mode(void);
+
+//
+void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index);
+
+//
+void do_set_out(out_t *out, uint8_t val);
+
+//
+void out_as_pwm(void);
+
+// 
+void di_out_pwm_tim_init(void);
 
 
 #endif  // __DIGITAL_OUTPUT_H

+ 0 - 18
fw/modules/io/input.c

@@ -1,18 +0,0 @@
-#include "at32f403a_407.h"
-#include "input.h"
-#include "settings_api.h"
-#include "FreeRTOS.h"
-#include "task.h"
-#include "mux.h"
-#include "output.h"
-#include <stdio.h>
-
-
-
-
-
-
-
-
-
-

+ 0 - 20
fw/modules/io/input.h

@@ -1,20 +0,0 @@
-#ifndef __INPUT_H
-#define __INPUT_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "io.h"
-
-//
-void io_test(void);
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // __INPUT_H
-

+ 0 - 52
fw/modules/io/io.c

@@ -2,24 +2,11 @@
 #include "io.h"
 #include "FreeRTOS.h"
 #include "task.h"
-#include "input.h"
-#include "output.h"
 #include "settings_api.h"
 #include "io_utils.h"
 #include <stdio.h>
 
 
-
-uint16_t output_state_bit;
-uint16_t output_mode_bit;
-uint16_t output_pwm[DO_NUMBER];
-uint16_t output_pwm_save[DO_NUMBER];
-uint16_t output_pwm_period[DO_NUMBER];
-uint16_t output_pwm_period_save[DO_NUMBER];
-
-
-
-
 //
 void io_port_enable(void)
 {
@@ -34,43 +21,4 @@ void io_port_enable(void)
     crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);
     crm_periph_clock_enable(CRM_BPR_PERIPH_CLOCK, TRUE);
     pwc_battery_powered_domain_access(TRUE);
-
-}
-
-//
-void io_init(void)
-{
-#if 0  
-    for (int i = 0; i < DI_NUMBER; i++)
-    {
-        in_init(&inputs[i]);
-    }
-
-    output_state_bit = settings.do_bits;
-    output_mode_bit = settings.do_mode_bits;
-    
-    // Таймер для выходов в режиме PWM
-    out_pwm_tim_init();
-    
-    for (int i = 0; i < DO_NUMBER; i++)
-    {
-        output_pwm[i] = settings.do_pwm[i];
-        output_pwm_save[i] = settings.do_pwm_save[i];
-        output_pwm_period[i] = settings.do_pwm_period[i];
-        output_pwm_period_save[i] = settings.do_pwm_period_save[i];
-
-        if (save_mode_get()) {
-            outputs[i].pwm_duty = settings.do_pwm_save[i];
-            outputs[i].pwm_period = settings.do_pwm_period_save[i];
-        }
-        else {
-            outputs[i].pwm_duty = settings.do_pwm[i];
-            outputs[i].pwm_period = settings.do_pwm_period[i];
-        }
-        
-        out_gpio_init(&outputs[i], i);
-    }
-#endif    
 }
-
-

+ 0 - 34
fw/modules/io/io.h

@@ -3,7 +3,6 @@
 
 #include <stdbool.h>
 
-// Период опроса входов 100 мс
 
 // -------------------------------------------------------------------------- //
 // Дискретые входы
@@ -26,21 +25,12 @@
 #define AI_NUMBER       12  //
 
 
-// Прочие параметры из других модулей для передачи по modbus
-
-//uint32_t uptime;
-
 
 // -------------------------------------------------------------------------- //
 
 //
 void io_port_enable(void);
 
-//
-void io_port_init(void);
-
-//
-void io_tim_init(void);
 
 // -------------------------------------------------------------------------- //
 
@@ -79,10 +69,6 @@ typedef struct
 } out_t;
 
 
-
-
-
-
 extern uint16_t output_state_bit;
 extern uint16_t output_mode_bit;
 extern uint16_t output_pwm[];
@@ -90,12 +76,6 @@ extern uint16_t output_pwm_save[];
 extern uint16_t output_pwm_period[];
 extern uint16_t output_pwm_period_save[];
 
-//uint16_t output_state[DI_NUMBER];    // состояние выхода, 0 - норма, 1 - обрыв, 2 - КЗ
-
-
-// -------------------------------------------------------------------------- //
-// Структуры настроек. Хранятся во внутренней памяти контроллера.
-
 
 //
 // контроль состояний - обрыв, КЗ, норма
@@ -119,20 +99,6 @@ typedef struct
 } system_t;
 
 
-// Структура системных настроек
-/*
-typedef struct 
-{
-	uint16_t        model;			// Модель
-	uint32_t        proddate;		// Дата производства
-	uint32_t        serial;			// Серийный номер
-	uint8_t         fw_version[8];	// Версия ПО
-	uint8_t         test_state;		// Статус тестирования
-	
-} sys_settings_t;
-
-*/
-
 
 
 #endif  // __IO_H

+ 44 - 46
fw/modules/io/io_utils.c

@@ -1,46 +1,44 @@
-#include "at32f403a_407.h"
-#include "io_utils.h"
-#include "FreeRTOS.h"
-#include "task.h"
-#include "input.h"
-#include "output.h"
-#include "settings_api.h"
-#include "mux.h"
-#include <stdio.h>
-
-
-bool save_mode = false;
-static uint16_t counter = 0;
-
-//
-void save_mode_init(void)
-{
-    save_mode = settings.save_mode;
-    save_mode ? mux_led_status(false) : mux_led_status(true);
-}
-
-//
-void save_mode_set(bool state)
-{
-    save_mode = state;
-    save_mode ? mux_led_status(false) : mux_led_status(true);
-}
-
-//
-bool save_mode_get(void)
-{
-    return save_mode;
-}
-
-// Должна вызываться раз в секунду
-void save_mode_inc_cnt(void)
-{
-    bool foo = counter++ > settings.save_delay ? true : false;
-    save_mode_set(foo);
-}
-
-//
-void save_mode_reset_cnt(void)
-{
-    counter = 0;
-}
+#include "at32f403a_407.h"
+#include "io_utils.h"
+#include "FreeRTOS.h"
+#include "task.h"
+#include "settings_api.h"
+#include "mux.h"
+#include <stdio.h>
+
+
+bool save_mode = false;
+static uint16_t counter = 0;
+
+//
+void save_mode_init(void)
+{
+    save_mode = settings.save_mode;
+    save_mode ? mux_led_status(false) : mux_led_status(true);
+}
+
+//
+void save_mode_set(bool state)
+{
+    save_mode = state;
+    save_mode ? mux_led_status(false) : mux_led_status(true);
+}
+
+//
+bool save_mode_get(void)
+{
+    return save_mode;
+}
+
+// Должна вызываться раз в секунду
+void save_mode_inc_cnt(void)
+{
+    bool foo = counter++ > settings.save_delay ? true : false;
+    save_mode_set(foo);
+}
+
+//
+void save_mode_reset_cnt(void)
+{
+    counter = 0;
+}

+ 0 - 357
fw/modules/io/output.c

@@ -1,357 +0,0 @@
-#include "at32f403a_407.h"
-#include "output.h"
-#include "FreeRTOS.h"
-#include "task.h"
-#include "settings_api.h"
-#include "io_utils.h"
-#include <stdio.h>
-
-
-out_t outputs[DO_NUMBER] = {
-    {GPIOC, GPIO_PINS_12, 0, 0, 0, false, 0, 0},   // -
-    {GPIOD, GPIO_PINS_2,  0, 0, 0, false, 0, 0},   // -
-    {GPIOE, GPIO_PINS_6,  0, 0, 0, false, 0, 0},   // TMR9_CH2 (remap)
-    {GPIOC, GPIO_PINS_1,  0, 0, 0, false, 0, 0},   // -
-    {GPIOC, GPIO_PINS_11, 0, 0, 0, false, 0, 0},   // -
-    {GPIOD, GPIO_PINS_3,  0, 0, 0, false, 0, 0},   // -
-    {GPIOE, GPIO_PINS_5,  0, 0, 0, false, 0, 0},   // TMR9_CH1 (remap)
-    {GPIOC, GPIO_PINS_2,  0, 0, 0, false, 0, 0}    // -
-};
-
-
-
-
-//
-void out_gpio_init(out_t *out, uint8_t index)
-{
-    gpio_init_type gpio_init_struct;
-
-    
-    // Выход
-    if (out->mode == 0)
-    {
-        gpio_default_para_init(&gpio_init_struct);
-        
-        gpio_init_struct.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;  
-        gpio_init_struct.gpio_pull           = GPIO_PULL_NONE;  
-        gpio_init_struct.gpio_mode           = GPIO_MODE_OUTPUT;  
-        gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
-        gpio_init_struct.gpio_pins           = out->pin;
-        gpio_init(out->port, &gpio_init_struct); 
-    }
-    
-    do_update(out, index) ;
-}
-
-//
-void do_set_common(void)
-{
-    bool flag = false;
-    
-    for (int i = 0; i < DO_NUMBER; i++)
-    {
-        // 
-        if ((settings.do_bits & (1 << i)) != (output_state_bit & (1 << i))) {
-            settings.do_bits = output_state_bit;
-            flag = true;
-        } 
-        else if ((settings.do_mode_bits & (1 << i)) != (output_mode_bit & (1 << i))) {
-            settings.do_mode_bits ^= (1 << i);
-            settings.do_mode_bits = output_mode_bit;
-            flag = true;
-        }  
-        else if (settings.do_pwm[i] != output_pwm[i]) {
-            settings.do_pwm[i] = output_pwm[i];
-            flag = true;
-        }
-        else if (settings.do_pwm_save[i] != output_pwm_save[i]) {
-            settings.do_pwm_save[i] = output_pwm_save[i];
-            flag = true;
-        }
-        else if (settings.do_pwm_period [i] != output_pwm_period[i]) {
-            settings.do_pwm_period[i] = output_pwm_period[i];
-            flag = true;
-        }
-        else if (settings.do_pwm_period_save[i] != output_pwm_period_save[i]) {
-            settings.do_pwm_period_save[i] = output_pwm_period_save[i];
-            flag = true;
-        }
- 
-        if (flag)
-            do_update(&outputs[i], i);
-    }
-}
-
-//
-void do_set(void)
-{
-    if (output_state_bit == settings.do_bits) 
-        return;
-    
-    // Состояние выхода/выходов изменилось
-    for (int i = 0; i < DO_NUMBER; i++)
-    {
-        if ((settings.do_bits & (1 << i)) != (output_state_bit & (1 << i))) 
-        {
-            do_update(&outputs[i], i);
-        }
-    }
-    
-    // Сохраним новое значение выходов в настройках
-    settings.do_bits = output_state_bit;
-}
-
-// Установка значения на выходе 
-void do_update(out_t *out, uint8_t i)
-{
-    // Режим ШИМ
-    if (settings.do_mode_bits & (1 << i)) {
-        // Безопасный режим включен
-        if (save_mode_get())
-            do_set_pwm(settings.do_pwm_period_save[i], settings.do_pwm_save[i], i);
-        else
-            do_set_pwm(settings.do_pwm_period[i], settings.do_pwm[i], i);
-    }
-    // Режим обычного выхода
-    else {
-        out->mode = 0;
-        // Безопасный режим включен
-        if (save_mode_get())
-            do_set_out(out, settings.do_save_bits & (1 << i));
-        else
-            do_set_out(out, settings.do_bits & (1 << i));
-    }
-}
-
-//
-void do_set_mode(void)
-{
-    if (output_mode_bit == settings.do_mode_bits)
-        return;
-  
-    // Состояние выхода/выходов изменилось
-    for (int i = 0; i < DO_NUMBER; i++)
-    {
-        if ((settings.do_mode_bits & (1 << i)) != (output_mode_bit & (1 << i)))
-        {
-            settings.do_mode_bits ^= (1 << i);
-            do_update(&outputs[i], i);
-        }
-    }
-  
-    settings.do_mode_bits = output_mode_bit;
-}
-
-//#define PWM_PERIOD_TEST     20
-//#define PWM_DUTY_TEST       10
-void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index)
-{
-    uint16_t duty_calc;
-  
-    if (duty == 0)
-        duty_calc = 0;
-    else
-        duty_calc = (duty*period/100 < 1) ? 1 : duty*period/100;
-    
-    outputs[index].pwm_flag = false;
-    outputs[index].pwm_period_cnt = 0;
-    outputs[index].pwm_duty_cnt = 0;
-    outputs[index].pwm_period = period;
-    outputs[index].pwm_duty = duty_calc;
-    outputs[index].mode = 1;
-}
-
-//
-void do_set_out(out_t *out, uint8_t val)
-{
-    if (val) {
-        gpio_bits_set(GPIOB, GPIO_PINS_15);
-        gpio_bits_set(out->port, out->pin);
-    }
-    else {
-        gpio_bits_reset(GPIOB, GPIO_PINS_15);
-        gpio_bits_reset(out->port, out->pin);
-    }
-}
-
-//
-void out_as_pwm(void)
-{
-    uint32_t timer_period;
-    uint16_t pwm_pulse;
-    crm_clocks_freq_type crm_clocks_freq_struct = {0};
-    tmr_output_config_type tmr_output_struct;
-    
-    crm_periph_clock_enable(CRM_TMR9_PERIPH_CLOCK, TRUE);
-    
-    crm_clocks_freq_get(&crm_clocks_freq_struct);
-    
-    //timer_period = (crm_clocks_freq_struct.sclk_freq / 10 ) - 1;
-    
-    timer_period = 24000 - 1;
-    pwm_pulse = 125*timer_period/1000;
-    
-    tmr_base_init(TMR9, 24000 - 1, 1000 - 1);
-    tmr_cnt_dir_set(TMR9, TMR_COUNT_UP);
-
-    tmr_output_default_para_init(&tmr_output_struct);
-    tmr_output_struct.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
-    tmr_output_struct.oc_output_state = TRUE;
-    tmr_output_struct.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
-    tmr_output_struct.oc_idle_state = TRUE;
-    
-    tmr_output_channel_config(TMR9, TMR_SELECT_CHANNEL_1, &tmr_output_struct);
-    tmr_channel_value_set(TMR9, TMR_SELECT_CHANNEL_1, pwm_pulse);
-    
-    tmr_flag_clear(TMR9, TMR_OVF_FLAG);
-    nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
-    nvic_irq_enable(TMR1_BRK_TMR9_IRQn, 5, 0);
-    
-    //tmr_interrupt_enable(TMR9, TMR_OVF_INT, TRUE);
-    tmr_interrupt_enable(TMR9, TMR_C1_INT, TRUE);
-    
-    tmr_counter_enable(TMR9, TRUE);
-}
-
-// Таймер для выходов в режиме PWM. Частота 10Гц.
-void out_pwm_tim_init(void)
-{
-    uint16_t prescaler_value = 0;
-    uint16_t timer_period = 1000 - 1;
-    gpio_init_type gpio_init_struct;
-    
-    gpio_default_para_init(&gpio_init_struct);
-        
-    gpio_init_struct.gpio_pins = GPIO_PINS_15;
-    gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
-    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
-    gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
-    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
-    gpio_init(GPIOB, &gpio_init_struct);
-
-    crm_periph_clock_enable(CRM_TMR9_PERIPH_CLOCK, TRUE);
-    
-    prescaler_value = (uint16_t)(system_core_clock / 10000) - 1;
-    tmr_base_init(TMR9, timer_period, prescaler_value);
-    
-    tmr_cnt_dir_set(TMR9, TMR_COUNT_UP);
-    tmr_clock_source_div_set(TMR9, TMR_CLOCK_DIV1);
-    
-    nvic_irq_enable(TMR1_BRK_TMR9_IRQn, 5, 0);
-
-    tmr_interrupt_enable(TMR9, TMR_OVF_INT, TRUE);
-    
-    tmr_counter_enable(TMR9, TRUE);
-}
-
-
-
-inline void pwm_proc(void)
-{
-    for (int i = 0; i < DO_NUMBER; i++)
-    {
-        if (outputs[i].mode)    // режим PWM
-        {
-            if (outputs[i].pwm_period_cnt == outputs[i].pwm_period /*PWM_PERIOD_TEST*/) {
-                outputs[i].pwm_period_cnt = 0;
-            }
-            if (outputs[i].pwm_period_cnt == 0) {
-                outputs[i].pwm_flag = false;
-                gpio_bits_set(outputs[i].port, outputs[i].pin);
-                //gpio_bits_set(GPIOB, GPIO_PINS_15);
-            }
-            if (outputs[i].pwm_duty_cnt == outputs[i].pwm_duty /*PWM_DUTY_TEST*/) {
-                outputs[i].pwm_duty_cnt = 0;
-                gpio_bits_reset(outputs[i].port, outputs[i].pin);
-                //gpio_bits_reset(GPIOB, GPIO_PINS_15);
-                outputs[i].pwm_flag = true;
-            }
-            outputs[i].pwm_period_cnt++;
-            if (outputs[i].pwm_flag == false) {
-                outputs[i].pwm_duty_cnt++;
-            }
-        }
-    }
-}
-
-//
-void load_sens_init(simple_gpio_t *sens)
-{
-    gpio_init_type gpio_init_struct;
-    
-    gpio_default_para_init(&gpio_init_struct);
-        
-    gpio_init_struct.gpio_pull           = GPIO_PULL_NONE;  
-    gpio_init_struct.gpio_mode           = GPIO_MODE_INPUT;  
-    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
-    gpio_init_struct.gpio_pins           = sens->pin;
-    gpio_init(sens->port, &gpio_init_struct); 
-}
-
-//
-void out_test(void)
-{
-    for (int i = 0; i < DO_NUMBER; i++)
-    {
-        outputs[i].port->odt ^= outputs[i].pin;
-        
-        printf("LOAD_1: %u LOAD_2: %u LOAD_3: %u LOAD_4: %u LOAD_5: %u LOAD_6: %u LOAD_7: %u LOAD_8: %u\r\n", 
-           gpio_input_data_bit_read(load_sens[0].port, load_sens[0].pin),
-           gpio_input_data_bit_read(load_sens[1].port, load_sens[1].pin),
-           gpio_input_data_bit_read(load_sens[2].port, load_sens[2].pin),
-           gpio_input_data_bit_read(load_sens[3].port, load_sens[3].pin),
-           gpio_input_data_bit_read(load_sens[4].port, load_sens[4].pin),
-           gpio_input_data_bit_read(load_sens[5].port, load_sens[5].pin),
-           gpio_input_data_bit_read(load_sens[6].port, load_sens[6].pin), 
-           gpio_input_data_bit_read(load_sens[7].port, load_sens[7].pin));
-        
-        vTaskDelay(500);
-    }  
-}
-
-//
-void load_test(void)
-{
-    printf("LOAD_1: %u LOAD_2: %u LOAD_3: %u LOAD_4: %u LOAD_5: %u LOAD_6: %u LOAD_7: %u LOAD_8: %u\r\n", 
-           gpio_input_data_bit_read(load_sens[0].port, load_sens[0].pin),
-           gpio_input_data_bit_read(load_sens[1].port, load_sens[1].pin),
-           gpio_input_data_bit_read(load_sens[2].port, load_sens[2].pin),
-           gpio_input_data_bit_read(load_sens[3].port, load_sens[3].pin),
-           gpio_input_data_bit_read(load_sens[4].port, load_sens[4].pin),
-           gpio_input_data_bit_read(load_sens[5].port, load_sens[5].pin),
-           gpio_input_data_bit_read(load_sens[6].port, load_sens[6].pin), 
-           gpio_input_data_bit_read(load_sens[7].port, load_sens[7].pin));
-}
-
-
-//
-void TMR1_BRK_TMR9_IRQHandler(void)
-{
-    if(tmr_flag_get(TMR9, TMR_OVF_FLAG) != RESET)
-    {
-        tmr_flag_clear(TMR9, TMR_OVF_FLAG);
-        //GPIOB->odt ^= GPIO_PINS_15;
-        pwm_proc();
-    }
-}
-
-#if 0
-void TMR1_BRK_TMR9_IRQHandler(void)
-{
-    static uint32_t cnt1 = 0;
-    static uint32_t cnt2 = 0;
-    
-    if (tmr_flag_get(TMR9, TMR_OVF_FLAG) != RESET)
-    {
-        tmr_flag_clear(TMR9, TMR_OVF_FLAG);
-        cnt1++;
-        printf("Cnt1 %u\r\n", cnt1);
-    }
-    else if (tmr_flag_get(TMR9, TMR_C1_INT) != RESET)
-    {
-        tmr_flag_clear(TMR9, TMR_C1_INT);
-        cnt2++;
-        printf("Cnt2 %u\r\n", cnt2);
-    }
-}
-#endif

+ 0 - 58
fw/modules/io/output.h

@@ -1,58 +0,0 @@
-#ifndef __OUTPUT_H
-#define __OUTPUT_H
-
-
-#include "io.h"
-
-
-#define PWM_PERIOD_TEST     20
-#define PWM_DUTY_TEST       18
-
-
-extern out_t outputs[];
-
-extern simple_gpio_t load_sens[];
-
-
-//
-void out_gpio_init(out_t *out, uint8_t index);
-
-//
-void do_set_common(void);
-
-//
-void do_set(void);
-
-// Установка значения на выходе 
-void do_update(out_t *out, uint8_t index);
-
-//
-void do_set_mode(void);
-
-//
-void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index);
-
-//
-void do_set_out(out_t *out, uint8_t val);
-
-// 
-void out_pwm_tim_init(void);
-
-//
-void out_as_pwm(void);
-
-//
-void pwm_proc(void);
-
-//
-void load_sens_init(simple_gpio_t *sens);
-
-//
-void out_test(void);
-
-//
-void load_test(void);
-
-
-#endif  // __OUTPUT_H
-

+ 1 - 3
fw/modules/modbus/modbus_params.c

@@ -3,9 +3,8 @@
 #include "io.h"
 #include "uptime.h"
 #include "rtc.h"
-#include "input.h"
-#include "output.h"
 #include "digital_input.h"
+#include "digital_output.h"
 #include "log.h"
 #include "settings_api.h"
 #include "common_config.h"
@@ -609,7 +608,6 @@ mb_delay_action_t mb_set_din_mode(void)
 //
 mb_delay_action_t mb_set_do(void)
 {
-    //do_set();
     do_set_common();
     return MB_NO_ACTION;
 }

+ 0 - 1
fw/modules/testing/soft_test.c

@@ -2,7 +2,6 @@
 #include "soft_test.h"
 #include "FreeRTOS.h"
 #include "task.h"
-#include "input.h"
 #include "digital_input.h"
 #include <stdio.h>
 

+ 4 - 2
fw/user/main.cpp

@@ -18,8 +18,6 @@ extern "C" {
 #include "modbus.h"
 #include "common_gpio.h"
 #include "io.h"
-#include "input.h"
-#include "output.h"
 #include "sys_api.h"
 #include "settings_api.h"
 #include "update.h"
@@ -28,6 +26,7 @@ extern "C" {
 #include "mb.h"
 #include "io_utils.h"
 #include "digital_input.h"
+#include "digital_output.h"
 #include "buttons.h"
 #include "adc_transport.h"
 #include "shift_reg.h"
@@ -124,6 +123,9 @@ void init_task(void *argument)
 #if defined (MDIO_88)
     di_init();
     di_tim_init();
+    
+    do_init();
+    
     xTaskCreate(di_task, "input_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
 #endif
     

BIN
output/fw.bin


File diff suppressed because it is too large
+ 324 - 333
project/ewarm/iap/iap.dep


File diff suppressed because it is too large
+ 556 - 556
project/ewarm/module_universal_io.dep


+ 0 - 6
project/ewarm/module_universal_io.ewp

@@ -2190,9 +2190,6 @@
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\io\digital_output.c</name>
                 </file>
-                <file>
-                    <name>$PROJ_DIR$\..\..\fw\modules\io\input.c</name>
-                </file>
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\io\io.c</name>
                 </file>
@@ -2202,9 +2199,6 @@
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\io\mux.c</name>
                 </file>
-                <file>
-                    <name>$PROJ_DIR$\..\..\fw\modules\io\output.c</name>
-                </file>
             </group>
             <group>
                 <name>log</name>

+ 0 - 6
project/ewarm/module_universal_io.ewt

@@ -2399,9 +2399,6 @@
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\io\digital_output.c</name>
                 </file>
-                <file>
-                    <name>$PROJ_DIR$\..\..\fw\modules\io\input.c</name>
-                </file>
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\io\io.c</name>
                 </file>
@@ -2411,9 +2408,6 @@
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\io\mux.c</name>
                 </file>
-                <file>
-                    <name>$PROJ_DIR$\..\..\fw\modules\io\output.c</name>
-                </file>
             </group>
             <group>
                 <name>log</name>

+ 0 - 0
tools/analog_in.py


Some files were not shown because too many files changed in this diff