void logger_number_(uint16_t value, uint8_t base) { // Create buffer char buffer[8*sizeof(uint16_t)+1]; char *str = &buffer[sizeof(buffer)-1]; // Set ending \0 *str = '\0'; uint16_t tmp; uint8_t c; // Make sure we have a base larger than 1 if (base < 2) base = 10; // Iterate over value do { // Set temp value tmp = value; // Calc divider value /= base; // Get digit c = tmp - base * value; *--str = c < 10 ? '0' + c : 'A' + c - 10; } while (value); // Send string usart_send_string(str); }
int main(void) { u32 result = 0; u8 str_send[SEND_BUFFER_SIZE], str_verify[SEND_BUFFER_SIZE]; init_system(); while(1) { usart_send_string(USART1, (u8*)"Please enter string to write into Flash memory:\n\r", SEND_BUFFER_SIZE); usart_get_string(USART1, str_send, SEND_BUFFER_SIZE); result = flash_program_data(FLASH_OPERATION_ADDRESS, str_send, SEND_BUFFER_SIZE); switch(result) { case RESULT_OK: /*everything ok*/ usart_send_string(USART1, (u8*)"Verification of written data: ", SEND_BUFFER_SIZE); flash_read_data(FLASH_OPERATION_ADDRESS, SEND_BUFFER_SIZE, str_verify); usart_send_string(USART1, str_verify, SEND_BUFFER_SIZE); break; case FLASH_WRONG_DATA_WRITTEN: /*data read from Flash is different than written data*/ usart_send_string(USART1, (u8*)"Wrong data written into flash memory", SEND_BUFFER_SIZE); break; default: /*wrong flags' values in Flash Status Register (FLASH_SR)*/ usart_send_string(USART1, (u8*)"Wrong value of FLASH_SR: ", SEND_BUFFER_SIZE); local_ltoa_hex(result, str_send); usart_send_string(USART1, str_send, SEND_BUFFER_SIZE); break; } /*send end_of_line*/ usart_send_string(USART1, (u8*)"\r\n", 3); } return 0; }
unsigned int ad_convert() //在需要检测电流时打开aden,检测完成之后需要关闭 { unsigned char str[10];//串口用的 unsigned char temp;//用来记录模拟比较器在admux里设定的反向输入端 unsigned int current_temp=0; temp = ADMUX; //记录下admux原来的值 ADMUX = 0x00; //指定adc输入通道 SFIOR = 0x00; //关闭模拟比较器adc管脚复用 ADCSRA = 0xd3; ADCSRA |= 0x40; while (((ADCSRA & 0x10) == 0)); current_temp = ADCW; sprintf(str,"c:%d",current_temp); usart_send_string(str); ADMUX =temp; // zurück auf den Sense-Kanal ADCSRA = 0x00; SFIOR |= 0x08; // Analog Comperator ein return 0; }
static void usart_get_string(u32 usart, u8 *out_string, u16 str_max_size) { u8 sign = 0; u16 iter = 0; while(iter < str_max_size) { sign = usart_recv_blocking(usart); #if USART_ECHO_EN == 1 usart_send_blocking(usart, sign); #endif if(sign != '\n' && sign != '\r') out_string[iter++] = sign; else { out_string[iter] = 0; usart_send_string(USART1, (u8*)"\r\n", 3); break; } } }
void logger_string(char *string) { usart_send_string(string); }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { char buffer[] = "AT"; uint8_t delay_type = 0; /* Chip errata */ CHIP_Init(); /* initalize clocks */ CMU->CTRL |= (1 << 14); // Set HF clock divider to /2 to keep core frequency <32MHz CMU->OSCENCMD |= 0x4; // Enable XTAL Oscillator while(! (CMU->STATUS & 0x8) ); // Wait for XTAL osc to stabilize CMU->CMD = 0x2; // Select HF XTAL osc as system clock source. 48MHz XTAL, but we divided the system clock by 2, therefore our HF clock should be 24MHz /* Setup SysTick Timer for 1 msec interrupts */ if (SysTick_Config(CMU_ClockFreqGet(cmuClock_CORE) / 1000)) while (1) ; usart_init(); motor_init(); usart_enable_rx_isr(); BSP_LedsInit(); BSP_LedSet(0); BSP_LedSet(1); usart_send_string(buffer); /* Infinite loop */ while (1) { BSP_LedToggle(1); switch(rx_data){ case 'f': Move_Forward(); delay_type = 1; break; case 'b': Move_Backward(); delay_type = 1; break; case 'r': Move_Left(); delay_type = 2; break; case 'l': Move_Right(); delay_type = 2; break; default: delay_type = 1; Stop_Robot(); break; } rx_data = 0; //Chooses the delay depending on the movement if (delay_type == 1){ Delay(1000); }else if(delay_type == 2){ Delay(200); } } }
/** * Only task configured to start at boot; starts the rest of RTOS. * We use this task to do most of the startup because it allows * use of various RTOS functionality (which can cause issues when used * before the scheduler is running). * WARNING: The vApplicationDaemonTaskStartupHook did not work for us. */ void startup_task(void* pvParameters) { print("EQUiSatOS starting... "); #ifdef WRITE_DEFAULT_MRAM_VALS // utility function to write initial state to MRAM (ONCE before launch) write_custom_state(); #endif /************************************************************************/ /* DATA INITIALIZATION */ /************************************************************************/ // Initialize misc. state mutexes hardware_state_mutex = xSemaphoreCreateMutexStatic(&_hardware_state_mutex_d); critical_action_mutex = xSemaphoreCreateMutexStatic(&_critical_action_mutex_d); // Initialize EQUiStack mutexes _idle_equistack_mutex = xSemaphoreCreateMutexStatic(&_idle_equistack_mutex_d); _attitude_equistack_mutex = xSemaphoreCreateMutexStatic(&_attitude_equistack_mutex_d); _flash_equistack_mutex = xSemaphoreCreateMutexStatic(&_flash_equistack_mutex_d); _flash_cmp_equistack_mutex = xSemaphoreCreateMutexStatic(&_flash_cmp_equistack_mutex_d); _low_power_equistack_mutex = xSemaphoreCreateMutexStatic(&_low_power_equistack_mutex_d); // Initialize EQUiStacks equistack_Init(&idle_readings_equistack, &_idle_equistack_arr, sizeof(idle_data_t), IDLE_STACK_MAX, _idle_equistack_mutex); equistack_Init(&attitude_readings_equistack, &_attitude_equistack_arr, sizeof(attitude_data_t), ATTITUDE_STACK_MAX, _attitude_equistack_mutex); equistack_Init(&flash_readings_equistack, &_flash_equistack_arr, sizeof(flash_data_t), FLASH_STACK_MAX, _flash_equistack_mutex); equistack_Init(&flash_cmp_readings_equistack, &_flash_cmp_equistack_arr, sizeof(flash_cmp_data_t), FLASH_CMP_STACK_MAX, _flash_cmp_equistack_mutex); equistack_Init(&low_power_readings_equistack, &_low_power_equistack_arr, sizeof(low_power_data_t), LOW_POWER_STACK_MAX, _low_power_equistack_mutex); /************************************************************************/ /* ESSENTIAL INITIALIZATION */ /************************************************************************/ // read state from MRAM for first time // this initializes the error equistacks, so make sure no errors // are logged before this (they shouldn't be before RTOS is started...) configure_state_from_reboot(); // function in global to init things that use RTOS // (MUST be done after config state from reboot) global_init_post_rtos(); // populate task_handles array and setup constants pre_init_rtos_tasks(); #if configUSE_TRACE_FACILITY == 1 // name mutexes vTraceSetMutexName(critical_action_mutex, "CA"); vTraceSetMutexName(i2c_irpow_mutex, "I2C"); vTraceSetMutexName(irpow_semaphore, "IRPOW"); vTraceSetMutexName(processor_adc_mutex, "ADC"); vTraceSetMutexName(hardware_state_mutex, "HWST"); vTraceSetMutexName(watchdog_mutex, "WD"); vTraceSetMutexName(mram_spi_cache_mutex, "SPI"); vTraceSetMutexName(_idle_equistack_mutex, "eqIDLE"); vTraceSetMutexName(_attitude_equistack_mutex, "eqATT"); vTraceSetMutexName(_flash_equistack_mutex , "eqF_BST"); vTraceSetMutexName(_flash_cmp_equistack_mutex, "eqF_CMP"); vTraceSetMutexName(_low_power_equistack_mutex, "eqLP"); vTraceSetMutexName(_error_equistack_mutex, "eqERR"); #endif // note RTOS is ready for watchdog callback, and log error if it already tripped rtos_ready = true; if (got_early_warning_callback_in_boot) { log_error(ELOC_WATCHDOG, ECODE_WATCHDOG_EARLY_WARNING, true); } /************************************************************************/ /* TASK CREATION */ /************************************************************************/ // NOTE: We can't actually set task state before they are started below, // and tasks start as active (resumed), so we have the tasks themselves // call the function below which will either suspend them or leave them // running as defined by the configuration of initial state. // suspend the scheduler while adding tasks so their task handles // are non-null when they start executing (i.e. they can be controlled) pet_watchdog(); // in case this takes a bit and we're close vTaskSuspendAll(); /************************************************************************/ /* TESTING/MISC */ /************************************************************************/ create_testing_tasks(); /************************************************************************/ /* END TESTING */ /************************************************************************/ #ifndef ONLY_RUN_TESTING_TASKS battery_charging_task_handle = xTaskCreateStatic(battery_charging_task, "battery charging action task", TASK_BATTERY_CHARGING_STACK_SIZE, NULL, TASK_BATTERY_CHARGING_PRIORITY, battery_charging_task_stack, &battery_charging_task_buffer); antenna_deploy_task_handle = xTaskCreateStatic(antenna_deploy_task, "antenna deploy action task", TASK_ANTENNA_DEPLOY_STACK_SIZE, NULL, TASK_ANTENNA_DEPLOY_PRIORITY, antenna_deploy_task_stack, &antenna_deploy_task_buffer); state_handling_task_handle = xTaskCreateStatic(state_handling_task, "state handling action task", TASK_STATE_HANDLING_STACK_SIZE, NULL, TASK_STATE_HANDLING_PRIORITY, state_handling_task_stack, &state_handling_task_buffer); watchdog_task_handle = xTaskCreateStatic(watchdog_task, "watchdog task", TASK_WATCHDOG_STACK_SIZE, NULL, TASK_WATCHDOG_PRIORITY, watchdog_task_stack, &watchdog_task_buffer); persistent_data_backup_task_handle = xTaskCreateStatic(persistent_data_backup_task, "persistent data backup task", TASK_PERSISTENT_DATA_BACKUP_STACK_SIZE, NULL, TASK_PERSISTENT_DATA_BACKUP_PRIORITY, persistent_data_backup_task_stack, &persistent_data_backup_task_buffer); flash_activate_task_handle = xTaskCreateStatic(flash_activate_task, "flash action task", TASK_FLASH_ACTIVATE_STACK_SIZE, NULL, TASK_FLASH_ACTIVATE_PRIORITY, flash_activate_task_stack, &flash_activate_task_buffer); transmit_task_handle = xTaskCreateStatic(transmit_task, "transmit action task", TASK_TRANSMIT_STACK_SIZE, NULL, TASK_TRANSMIT_PRIORITY, transmit_task_stack, &transmit_task_buffer); /* Data tasks */ idle_data_task_handle = xTaskCreateStatic(idle_data_task, "idle data reader task", TASK_IDLE_DATA_RD_STACK_SIZE, NULL, TASK_IDLE_DATA_RD_PRIORITY, idle_data_task_stack, &idle_data_task_buffer); attitude_data_task_handle = xTaskCreateStatic(attitude_data_task, "attitude data reader task", TASK_ATTITUDE_DATA_RD_STACK_SIZE, NULL, TASK_ATTITUDE_DATA_DATA_RD_PRIORITY, attitude_data_task_stack, &attitude_data_task_buffer); low_power_data_task_handle = xTaskCreateStatic(low_power_data_task, "low power data reader task", TASK_LOW_POWER_DATA_RD_STACK_SIZE, NULL, TASK_LOW_POWER_DATA_RD_PRIORITY, low_power_data_task_stack, &low_power_data_task_buffer); #endif xTaskResumeAll(); setTXEnable(false); usart_send_string((uint8_t*) "EQUiSatOS started"); setTXEnable(true); print("initialization complete.\n"); // delete this task after it's done booting vTaskDelete(NULL); }