#include "main.h" void init_task(void *argument); void test_hw_task(void *argument); void soft_wdt(void *params); void test_gpio(void *params); 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(); // ------------------------------------------------------------------------- // Debug uart_print_init(115200); //usb_clock48m_select(USB_CLK_HEXT); crm_periph_clock_enable(CRM_USB_PERIPH_CLOCK, TRUE); io_port_init(); in_exint_init(); cm_gpio_init(); printf("\n\n\n\nModule universal IO [FW %s] loading....\r\n\n", VERSION); // //usb_init(); #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); taskEXIT_CRITICAL(); vTaskStartScheduler(); #endif while (1) {} } void init_task(void *argument) { // ------------------------------------------------------------------------- // Загрузка и проверка настроек crm_periph_clock_enable(CRM_CRC_PERIPH_CLOCK, TRUE); // Мьютекс для работы с настройками init_settings(); // Для теста //sys_clear(); // Системные настройки sys_settings_load(&sys_settings); // Основные настройки settings_load(&settings); // ------------------------------------------------------------------------- // RNDIS //usb_eth_init(); mux_gpio_init(); // Тесты таймеров //mux_led_test_init(); // Modbus mb_init(); // Тесты SPI flash //common_spi_init(); //InitFS(PRIM_DRIVE); //spi_flash_test(); // Тесты USB //usb_eth_init(); // Базовая инициализация входов/выходов // TODO потом брать значения из настроек io_init(); // Сброс счетчика попыток загрузок update_reset_boot_try(); vTaskDelete(NULL); for (;;) { mux_led_proc(); } // ----------------------------------------------------------------------------- //taskYIELD(); } void test_hw_task(void *argument) { for (;;) { vTaskDelay(100); mux_led_blink(); } } // void soft_wdt(void *params) { (void)params; for (;;) { extern_wdt_togle(); // extern WDT vTaskDelay(500); } } // void test_gpio(void *params) { (void)params; for (;;) { vTaskDelay(1000); //io_test(); //out_test(); } } // 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; } } }