#include "at32f403a_407.h" #include "io.h" #include "FreeRTOS.h" #include "task.h" #include "input.h" #include "output.h" #include "settings_api.h" #include "io_utils.h" #include uint16_t input_state[DI_NUMBER]; // состояние входа uint16_t input_state_bit; //uint16_t output_state[DO_NUMBER]; // состояние входа 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]; // -------------------------------------------------------------------------- // // Текущие параметры //uint16_t input_state[DI_NUMBER]; // состояние входа uint32_t input_cnt[DI_NUMBER]; // счетчики входов // void io_port_init(void) { crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_BPR_PERIPH_CLOCK, TRUE); pwc_battery_powered_domain_access(TRUE); io_tim_init(); } // void io_init(void) { 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); load_sens_init(&load_sens[i]); } } // Таймер для антидребезга void io_tim_init(void) { crm_clocks_freq_type crm_clocks_freq_struct = {0}; crm_clocks_freq_get(&crm_clocks_freq_struct); nvic_irq_disable(TMR8_BRK_TMR12_IRQn); crm_periph_clock_enable(CRM_TMR12_PERIPH_CLOCK, TRUE); // 1 Hz tmr_base_init(TMR12, 9, (crm_clocks_freq_struct.ahb_freq / 10000) - 1); tmr_cnt_dir_set(TMR12, TMR_COUNT_UP); NVIC_ClearPendingIRQ(TMR8_BRK_TMR12_IRQn); nvic_irq_enable(TMR8_BRK_TMR12_IRQn, 5, 0); tmr_flag_clear(TMR12, TMR_OVF_FLAG); tmr_interrupt_enable(TMR12, TMR_OVF_INT, TRUE); tmr_counter_value_set(TMR12, 0); tmr_counter_enable(TMR12, TRUE); } void TMR8_BRK_TMR12_IRQHandler(void) { //static int i = 0; //static int cnt = 0; if(tmr_flag_get(TMR12, TMR_OVF_FLAG) != RESET) { tmr_flag_clear(TMR12, TMR_OVF_FLAG); debounce(); #if 0 if (i++ == 1000) { i = 0; cnt++; printf("CNT: %u\r\n"); } #endif } }