Merge branch 'feature/improve_ulp_delay_api' into 'master'

feat(ulp): Improved ULP delay accuracy and removed floating point operations

Closes IDFGH-16353 and IDFGH-15960

See merge request espressif/esp-idf!45937
This commit is contained in:
Konstantin Kondrashov
2026-03-09 17:48:31 +02:00
20 changed files with 640 additions and 73 deletions
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2021-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@@ -43,7 +43,7 @@ static void ds18b20_write_bit(bool bit)
}
/* Write slot duration at least 60 us */
ulp_riscv_delay_cycles(60 * ULP_RISCV_CYCLES_PER_US);
ulp_riscv_delay_us(60);
ulp_riscv_gpio_output_level(EXAMPLE_1WIRE_GPIO, 1);
}
@@ -56,11 +56,11 @@ static bool ds18b20_read_bit(void)
ulp_riscv_gpio_output_level(EXAMPLE_1WIRE_GPIO, 1);
/* Must sample within 15 us of the failing edge */
ulp_riscv_delay_cycles(5 * ULP_RISCV_CYCLES_PER_US);
ulp_riscv_delay_us(5);
bit = ulp_riscv_gpio_get_level(EXAMPLE_1WIRE_GPIO);
/* Read slot duration at least 60 us */
ulp_riscv_delay_cycles(55 * ULP_RISCV_CYCLES_PER_US);
ulp_riscv_delay_us(55);
return bit;
}
@@ -86,15 +86,15 @@ bool ds18b20_reset_pulse(void)
bool presence_pulse;
/* min 480 us reset pulse + 480 us reply time is specified by datasheet */
ulp_riscv_gpio_output_level(EXAMPLE_1WIRE_GPIO, 0);
ulp_riscv_delay_cycles(480 * ULP_RISCV_CYCLES_PER_US);
ulp_riscv_delay_us(480);
ulp_riscv_gpio_output_level(EXAMPLE_1WIRE_GPIO, 1);
/* Wait for ds18b20 to pull low before sampling */
ulp_riscv_delay_cycles(60 * ULP_RISCV_CYCLES_PER_US);
ulp_riscv_delay_us(60);
presence_pulse = ulp_riscv_gpio_get_level(EXAMPLE_1WIRE_GPIO) == 0;
ulp_riscv_delay_cycles(420 * ULP_RISCV_CYCLES_PER_US);
ulp_riscv_delay_us(420);
return presence_pulse;
}
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@@ -23,7 +23,7 @@ int main (void)
/* Wakeup interrupt is a level interrupt, wait 1 sec to
allow user to release button to avoid waking up the ULP multiple times */
ulp_riscv_delay_cycles(1000*1000 * ULP_RISCV_CYCLES_PER_US);
ulp_riscv_delay_us(1000000);
ulp_riscv_gpio_wakeup_clear();
/* ulp_riscv_halt() is called automatically when main exits */
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@@ -71,7 +71,7 @@ static void bmp180_read_ut_data(int16_t *ut_data)
ulp_riscv_i2c_master_write_to_device(&cmd, 1);
/* Wait at least 4.5 milliseconds for the sensor to complete the reading */
ulp_riscv_delay_cycles(5 * ULP_RISCV_CYCLES_PER_MS);
ulp_riscv_delay_us(5000);
/* Read uncompensated temperature data */
bmp180_read16((uint16_t *)ut_data, BMP180_SENSOR_REG_ADDR_SENSOR_DATA_MSB, BMP180_SENSOR_REG_ADDR_SENSOR_DATA_LSB);
@@ -92,26 +92,26 @@ static void bmp180_read_up_data(int32_t *up_data, oss_mode_t oss_mode)
{
case OSS_0:
cmd = BMP180_SENSOR_CMD_READ_PRESSURE_OSS_0;
wait = 5; // Wait atleast 4.5 msec
wait = 5; // Wait at least 4.5 msec
break;
case OSS_1:
cmd = BMP180_SENSOR_CMD_READ_PRESSURE_OSS_1;
wait = 8; // Wait atleast 7.5 msec
wait = 8; // Wait at least 7.5 msec
break;
case OSS_2:
cmd = BMP180_SENSOR_CMD_READ_PRESSURE_OSS_2;
wait = 14; // Wait atleast 13.5 msec
wait = 14; // Wait at least 13.5 msec
break;
case OSS_3:
cmd = BMP180_SENSOR_CMD_READ_PRESSURE_OSS_3;
wait = 26; // Wait atleast 25.5 msec
wait = 26; // Wait at least 25.5 msec
break;
}
ulp_riscv_i2c_master_write_to_device(&cmd, 1);
/* Wait for the required amount of time for the sensor to complete the reading */
ulp_riscv_delay_cycles(wait * ULP_RISCV_CYCLES_PER_MS);
ulp_riscv_delay_us(wait * 1000);
/* Read uncompensated temperature data */
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@@ -56,7 +56,7 @@ int main(void) {
ulp_riscv_wakeup_main_processor();
}
ulp_riscv_delay_cycles(1000 * ULP_RISCV_CYCLES_PER_MS);
ulp_riscv_delay_us(1000000);
}
return 0;
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@@ -41,6 +41,6 @@ int main (void)
ulp_riscv_print_str("\n");
cnt++;
ulp_riscv_delay_cycles(1000 * ULP_RISCV_CYCLES_PER_MS);
ulp_riscv_delay_us(1000000);
}
}