| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /* ULP Example
- This example code is in the Public Domain (or CC0 licensed, at your option.)
- Unless required by applicable law or agreed to in writing, this
- software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- CONDITIONS OF ANY KIND, either express or implied.
- */
- #include <stdio.h>
- #include <string.h>
- #include "esp_sleep.h"
- #include "nvs.h"
- #include "nvs_flash.h"
- #include "soc/rtc_cntl_reg.h"
- #include "soc/sens_reg.h"
- #include "driver/gpio.h"
- #include "driver/rtc_io.h"
- #include "driver/adc.h"
- #include "driver/dac.h"
- #include "esp32/ulp.h"
- #include "ulp_main.h"
- extern const uint8_t ulp_main_bin_start[] asm("_binary_ulp_main_bin_start");
- extern const uint8_t ulp_main_bin_end[] asm("_binary_ulp_main_bin_end");
- /* This function is called once after power-on reset, to load ULP program into
- * RTC memory and configure the ADC.
- */
- static void init_ulp_program(void);
- /* This function is called every time before going into deep sleep.
- * It starts the ULP program and resets measurement counter.
- */
- static void start_ulp_program(void);
- void app_main(void)
- {
- esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause();
- if (cause != ESP_SLEEP_WAKEUP_ULP) {
- printf("Not ULP wakeup\n");
- init_ulp_program();
- } else {
- printf("Deep sleep wakeup\n");
- printf("ULP did %d measurements since last reset\n", ulp_sample_counter & UINT16_MAX);
- printf("Thresholds: low=%d high=%d\n", ulp_low_thr, ulp_high_thr);
- ulp_last_result &= UINT16_MAX;
- printf("Value=%d was %s threshold\n", ulp_last_result,
- ulp_last_result < ulp_low_thr ? "below" : "above");
- }
- printf("Entering deep sleep\n\n");
- start_ulp_program();
- ESP_ERROR_CHECK( esp_sleep_enable_ulp_wakeup() );
- esp_deep_sleep_start();
- }
- static void init_ulp_program(void)
- {
- esp_err_t err = ulp_load_binary(0, ulp_main_bin_start,
- (ulp_main_bin_end - ulp_main_bin_start) / sizeof(uint32_t));
- ESP_ERROR_CHECK(err);
- /* Configure ADC channel */
- /* Note: when changing channel here, also change 'adc_channel' constant
- in adc.S */
- adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11);
- #if CONFIG_IDF_TARGET_ESP32
- adc1_config_width(ADC_WIDTH_BIT_12);
- #elif CONFIG_IDF_TARGET_ESP32S2
- adc1_config_width(ADC_WIDTH_BIT_13);
- #endif
- adc1_ulp_enable();
- /* Set low and high thresholds, approx. 1.35V - 1.75V*/
- ulp_low_thr = 1500;
- ulp_high_thr = 2000;
- /* Set ULP wake up period to 20ms */
- ulp_set_wakeup_period(0, 20000);
- /* Disconnect GPIO12 and GPIO15 to remove current drain through
- * pullup/pulldown resistors.
- * GPIO12 may be pulled high to select flash voltage.
- */
- rtc_gpio_isolate(GPIO_NUM_12);
- rtc_gpio_isolate(GPIO_NUM_15);
- #if CONFIG_IDF_TARGET_ESP32
- esp_deep_sleep_disable_rom_logging(); // suppress boot messages
- #endif
- }
- static void start_ulp_program(void)
- {
- /* Reset sample counter */
- ulp_sample_counter = 0;
- /* Start the program */
- esp_err_t err = ulp_run(&ulp_entry - RTC_SLOW_MEM);
- ESP_ERROR_CHECK(err);
- }
|