//#include "main.h" #include "at32f403a_407.h" #include "at32f403a_407_board.h" #include "at32f403a_407_clock.h" #include "common_config.h" #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "semphr.h" extern "C" { #include "usb_eth.h" #include "mux.h" #include "misc.h" #include "spi_common.h" #include "user_fatfs.h" #include "spi_flash.h" #include "usb_eth.h" #include "extended_sram.h" #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" #include "uptime.h" #include "rtc.h" #include "mb.h" #include "io_utils.h" #include "buttons.h" #include "adc_transport.h" #include "shift_reg.h" #include "analog_input.h" #include "dac_transport.h" #include "log.h" } #include "terminal_sbs.h" #include "terminal_usartbridge.h" #include #include #include void init_task(void *argument); void test_hw_task(void *argument); void soft_wdt(void *params); void test_gpio(void *params); void misc_task(void *params); // TODO перенести в другой модуль void usb_clock48m_select(usb_clk48_s clk_s); // int main(void) { __disable_irq(); nvic_vector_table_set(NVIC_VECTTAB_FLASH, 0x08021000); nvic_priority_group_config(NVIC_PRIORITY_GROUP_4); __enable_irq(); extend_SRAM(); system_clock_config(); delay_init(); // ------------------------------------------------------------------------- // CLI sbsTerminal.configure(); terminalUsartBridge.configure(); // ------------------------------------------------------------------------- // USB #if 0 usb_clock48m_select(USB_CLK_HEXT); crm_periph_clock_enable(CRM_USB_PERIPH_CLOCK, TRUE); usb_init(); #endif #if 1 taskENTER_CRITICAL(); xTaskCreate(soft_wdt, "soft_wdt", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL); xTaskCreate(init_task, "init_task", 10*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); //xTaskCreate(test_hw_task, "hw_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); xTaskCreate(test_gpio, "gpio_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); //xTaskCreate(input_task, "input_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); xTaskCreate(misc_task, "misc_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); xTaskCreate(button_task, "button_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); #if defined (MAI_12) xTaskCreate(adc_task, "adc_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); #endif #if defined (MAO_8) xTaskCreate(dac_task, "dac_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); #endif taskEXIT_CRITICAL(); vTaskStartScheduler(); #endif while (1) {} } void init_task(void *argument) { // Для теста //sys_clear(); // -------------------------------------------------------------------------- // // Загрузка и проверка настроек crm_periph_clock_enable(CRM_CRC_PERIPH_CLOCK, TRUE); // Мьютекс для работы с настройками init_settings(); // Системные настройки sys_settings_load(&sys_settings); // Основные настройки settings_load(&settings); #if 0 settings_set_all_default(); settings_save(&settings); #endif // -------------------------------------------------------------------------- // // Безопасный режим, входы, выходы save_mode_init(); // TODO Для теста отключаем безопасный режим работы save_mode_set(false); io_port_init(); //in_exint_init(); gpio_wdt_init(); gpio_mbaddr_init(); // -------------------------------------------------------------------------- // // Кнопки button_init(); // -------------------------------------------------------------------------- // // Uptime uptime_init(); // -------------------------------------------------------------------------- // // RTC TM_RTC_Init(); rtc_subtim_init(); // -------------------------------------------------------------------------- // // Мультиплексор mux_gpio_init(); // -------------------------------------------------------------------------- // // Modbus mb_init(); // -------------------------------------------------------------------------- // // Базовая инициализация входов/выходов // TODO потом брать значения из настроек //io_init(); // -------------------------------------------------------------------------- // // Сброс счетчика попыток загрузок update_reset_boot_try(); // -------------------------------------------------------------------------- // // Тесты //pwm_test(); // тесы PWM gpio_get_rev(); // -------------------------------------------------------------------------- // // Сдвиговые регистры и мультиплексоры //sh_init(); // Тесты аналоговых входов //ai_connect_test(); //ai_mode_test(); //ai_connect_channel(V_ISO); //ai_connect_channel(AN_INP_1); //ai_connect_channel(AN_INP_7); // -------------------------------------------------------------------------- // // DAC dac_gpio_init(); dac_test(CH_DAC_1, 30000); /* dac_test(CH_DAC_2, 10000); dac_test(CH_DAC_3, 10000); dac_test(CH_DAC_4, 10000); */ /* dac_test(CH_DAC_1, 10000); dac_test(CH_DAC_2, 10000); dac_test(CH_DAC_3, 10000); dac_test(CH_DAC_4, 10000); */ // -------------------------------------------------------------------------- // // RNDIS //usb_eth_init(); // Тесты таймеров //mux_led_test_init(); // -------------------------------------------------------------------------- // // SPI flash #if 1 // Тесты SPI flash common_spi_init(); spi_flash_init(); //InitFS(PRIM_DRIVE); //spi_flash_test(); #endif // -------------------------------------------------------------------------- // // LOG log_init(false); // Тесты USB //usb_eth_init(); //vTaskDelete(NULL); for (;;) { mux_led_proc(); } // ----------------------------------------------------------------------------- //taskYIELD(); } void test_hw_task(void *argument) { for (;;) { vTaskDelay(100); #if 0 vTaskDelay(100); mux_led_blink(); #endif //adc_test(); } } // void soft_wdt(void *params) { (void)params; for (;;) { extern_wdt_togle(); // extern WDT vTaskDelay(100); } } // void test_gpio(void *params) { (void)params; for (;;) { vTaskDelay(100); //printf("%" PRId64 " \r\n", rtc_get_ms()); //en_crnt_alrm_in(0x02); //io_test(); //out_test(); //load_test(); //printf("HW rev: %u\r\n", cm_gpio_get_rev()); //printf("Save mode: %u\r\n", save_mode_get()); } } // void misc_task(void *params) { (void)params; for (;;) { vTaskDelay(1000); eMBSetSlaveAddr(gpio_get_mbaddr()); } } // void usb_clock48m_select(usb_clk48_s clk_s) { if(clk_s == USB_CLK_HICK) { crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_HICK); /* enable the acc calibration ready interrupt */ crm_periph_clock_enable(CRM_ACC_PERIPH_CLOCK, TRUE); /* update the c1\c2\c3 value */ acc_write_c1(7980); acc_write_c2(8000); acc_write_c3(8020); /* open acc calibration */ acc_calibration_mode_enable(ACC_CAL_HICKTRIM, TRUE); } else { switch(system_core_clock) { /* 48MHz */ case 48000000: crm_usb_clock_div_set(CRM_USB_DIV_1); break; /* 72MHz */ case 72000000: crm_usb_clock_div_set(CRM_USB_DIV_1_5); break; /* 96MHz */ case 96000000: crm_usb_clock_div_set(CRM_USB_DIV_2); break; /* 120MHz */ case 120000000: crm_usb_clock_div_set(CRM_USB_DIV_2_5); break; /* 144MHz */ case 144000000: crm_usb_clock_div_set(CRM_USB_DIV_3); break; /* 168MHz */ case 168000000: crm_usb_clock_div_set(CRM_USB_DIV_3_5); break; /* 192MHz */ case 192000000: crm_usb_clock_div_set(CRM_USB_DIV_4); break; default: break; } } }