mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 06:11:06 +00:00 
			
		
		
		
	1. update register file about adc; 2. fix adc driver; 3. add UT for adc/dac; See merge request espressif/esp-idf!7776
		
			
				
	
	
		
			101 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* 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);
 | 
						|
}
 |