void loop(void *pvParameters) { uint32_t time = 0 ; // SPI transmission time float avr_time = 0 ; // Average of SPI transmission float u = 0 ; spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_LITTLE_ENDIAN, false); // init SPI module while(1) { time = sdk_system_get_time(); spi_set_command(1,1,1) ; // Set one command bit to 1 spi_set_address(1,4,8) ; // Set 4 address bits to 8 spi_set_dummy_bits(1,4,false); // Set 4 dummy bit before Dout spi_repeat_send_16(1,0xC584,10); // Send 1 bit command + 4 bits address + 4 bits dummy + 160 bits data spi_clear_address(1); // remove address spi_clear_command(1); // remove command spi_clear_dummy(1); // remove dummy time = sdk_system_get_time() -time ; avr_time = ((avr_time * (float)u ) + (float)time)/((float)u+1.0) ; // compute average u++; if (u==100) { u=0 ; printf("Time: %f\n",avr_time); } vTaskDelay(100/portTICK_PERIOD_MS); } }
/* * User task that triggers measurements of sensor every seconds. It uses * function *vTaskDelay* to wait for measurement results. Busy wating * alternative is shown in comments */ void user_task(void *pvParameters) { bme680_values_float_t values; TickType_t last_wakeup = xTaskGetTickCount(); // as long as sensor configuration isn't changed, duration is constant uint32_t duration = bme680_get_measurement_duration(sensor); while (1) { // trigger the sensor to start one TPHG measurement cycle if (bme680_force_measurement (sensor)) { // passive waiting until measurement results are available vTaskDelay (duration); // alternatively: busy waiting until measurement results are available // while (bme680_is_measuring (sensor)) ; // get the results and do something with them if (bme680_get_results_float (sensor, &values)) printf("%.3f BME680 Sensor: %.2f °C, %.2f %%, %.2f hPa, %.2f Ohm\n", (double)sdk_system_get_time()*1e-3, values.temperature, values.humidity, values.pressure, values.gas_resistance); } // passive waiting until 1 second is over vTaskDelayUntil(&last_wakeup, 1000 / portTICK_PERIOD_MS); } }
/* * User task that triggers measurements of sensor1 every 2 seconds and * uses *bme680_is_measuring* to wait for measurement results. */ void user_task_sensor2(void *pvParameters) { bme680_values_float_t values; TickType_t last_wakeup = xTaskGetTickCount(); while (1) { // trigger the sensor to start one TPHG measurement cycle if (bme680_force_measurement (sensor2)) { // busy waiting until measurement results are available while (bme680_is_measuring (sensor2)) ; // get the results and so something with them if (bme680_get_results_float (sensor2, &values)) printf("%.3f BME680 Sensor2: %.2f °C, %.2f %%, %.2f hPa, %.2f Ohm\n", (double)sdk_system_get_time()*1e-3, values.temperature, values.humidity, values.pressure, values.gas_resistance); } // passive waiting until 2 seconds are over vTaskDelayUntil(&last_wakeup, 2000 / portTICK_PERIOD_MS); } }
void OS_SetTime(uint_t now) { taskENTER_CRITICAL(); s_lastSysTime = sdk_system_get_time(); s_timeAdj = (uint64_t)now * 1000000 - s_lastSysTime; taskEXIT_CRITICAL(); // DEBUG_PRINT("OS_SetTime:now=%08X, s_lastSysTime=%08X, s_timeAdj=%016llX\n", now, s_lastSysTime, s_timeAdj); }
void user_init(void) { uart_set_baud(0, 115200); printf("SDK version:%s\n", sdk_system_get_sdk_version()); i2c_init(I2C_BUS, SCL_PIN, SDA_PIN, I2C_FREQ_100K); hd44780_t lcd = { .i2c_dev.bus = I2C_BUS, .i2c_dev.addr = ADDR, .font = HD44780_FONT_5X8, .lines = 2, .pins = { .rs = 0, .e = 2, .d4 = 4, .d5 = 5, .d6 = 6, .d7 = 7, .bl = 3 }, .backlight = true }; hd44780_init(&lcd); hd44780_upload_character(&lcd, 0, char_data); hd44780_upload_character(&lcd, 1, char_data + 8); hd44780_gotoxy(&lcd, 0, 0); hd44780_puts(&lcd, "\x08 Hello world!"); hd44780_gotoxy(&lcd, 0, 1); hd44780_puts(&lcd, "\x09 "); char time[16]; while (true) { hd44780_gotoxy(&lcd, 2, 1); snprintf(time, 7, "%u ", sdk_system_get_time() / 1000000); time[sizeof(time) - 1] = 0; hd44780_puts(&lcd, time); for (uint32_t i = 0; i < 1000; i++) sdk_os_delay_us(1000); } }
int _gettimeofday_r(struct _reent *, struct timeval *__tp, void *__tzp) { taskENTER_CRITICAL(); uint_t t = sdk_system_get_time(); if (s_lastSysTime > t) { s_timeAdj += (uint_t)-1; } s_lastSysTime = t; taskEXIT_CRITICAL(); uint64_t usec = s_lastSysTime + s_timeAdj; __tp->tv_usec = usec; __tp->tv_sec = usec / 1000000; // DEBUG_PRINT("_gettimeofday_r:__tp->tv_sec=%08X, __tp->tv_usec=%08X, s_lastSysTime=%08X, s_timeAdj=%016llX\n", __tp->tv_sec, __tp->tv_usec, s_lastSysTime, s_timeAdj); return 0; }
unsigned int time_ms() { //#include "user_interface.h" espressif: uint32 system_get_time(void) // it returns microseconds ( http://bbs.espressif.com/viewtopic.php?t=42 ) // also: system_get_rtc_time(); return sdk_system_get_time() / 1000; }
uint_t OS_GetTick() { return sdk_system_get_time(); }
void OS_DebugPrintTimestamp() { uint_t t = sdk_system_get_time() / 1000; printf("[%6d.%03d] ", t / 1000, t % 1000); }