esp-idf/components/esp_driver_ana_cmpr/include/driver/ana_cmpr.h

193 lines
9.0 KiB
C
Raw Normal View History

2023-03-01 06:50:45 -05:00
/*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
2023-03-13 00:34:53 -04:00
2023-03-01 06:50:45 -05:00
#include <stdint.h>
#include <stdbool.h>
#include "esp_err.h"
#include "driver/ana_cmpr_types.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Analog comparator unit configuration
*
*/
typedef struct {
ana_cmpr_unit_t unit; /*!< Analog comparator unit */
ana_cmpr_clk_src_t clk_src; /*!< The clock source of the analog comparator,
* which decide the resolution of the comparator
*/
ana_cmpr_ref_source_t ref_src; /*!< Reference signal source of the comparator,
* select using ANA_CMPR_REF_SRC_INTERNAL or ANA_CMPR_REF_SRC_EXTERNAL.
* For internal reference, the reference voltage should be set to `internal_ref_volt`,
* for external reference, the reference signal should be connect to `ANA_CMPRx_EXT_REF_GPIO`
*/
2023-03-13 00:34:53 -04:00
ana_cmpr_cross_type_t cross_type; /*!< The crossing types that can trigger interrupt */
int intr_priority; /*!< The interrupt priority, range 0~7, if set to 0, the driver will try to allocate an interrupt with a relative low priority (1,2,3)
* otherwise the larger the higher, 7 is NMI */
struct {
uint32_t io_loop_back: 1; /*!< Enable this field when the other signals that output on the comparison pins are supposed to be fed back.
* Normally used for debug/test scenario */
} flags; /*!< Analog comparator driver flags */
2023-03-01 06:50:45 -05:00
} ana_cmpr_config_t;
/**
* @brief Analog comparator internal reference configuration
*
*/
typedef struct {
2023-03-13 00:34:53 -04:00
ana_cmpr_ref_voltage_t ref_volt; /*!< The internal reference voltage. It can be specified to a certain fixed percentage of
* the VDD power supply, currently supports 0%~70% VDD with a step 10%
2023-03-01 06:50:45 -05:00
*/
2023-03-13 00:34:53 -04:00
} ana_cmpr_internal_ref_config_t;
2023-03-01 06:50:45 -05:00
/**
* @brief Analog comparator debounce filter configuration
*
*/
typedef struct {
2023-03-13 00:34:53 -04:00
uint32_t wait_us; /*!< The wait time of re-enabling the interrupt after the last triggering,
2023-03-01 06:50:45 -05:00
* it is used to avoid the spurious triggering while the source signal crossing the reference signal.
* The value should regarding how fast the source signal changes, e.g., a rapid signal requires
* a small wait time, otherwise the next crosses may be missed.
2023-03-13 00:34:53 -04:00
* (Unit: micro second)
2023-03-01 06:50:45 -05:00
*/
} ana_cmpr_debounce_config_t;
/**
* @brief Group of Analog Comparator callbacks
* @note The callbacks are all running under ISR environment
* @note When CONFIG_ANA_CMPR_ISR_IRAM_SAFE is enabled, the callback itself and functions called by it should be placed in IRAM.
* The variables used in the function should be in the SRAM as well.
*/
typedef struct {
ana_cmpr_cross_cb_t on_cross; /*!< The callback function on cross interrupt */
} ana_cmpr_event_callbacks_t;
/**
* @brief Allocating a new analog comparator unit handle
*
* @param[in] config The config of the analog comparator unit
* @param[out] ret_cmpr The returned analog comparator unit handle
* @return
* - ESP_OK Allocate analog comparator unit handle success
* - ESP_ERR_NO_MEM No memory for the analog comparator structure
* - ESP_ERR_INVALID_ARG NULL pointer of the parameters or wrong unit number
* - ESP_ERR_INVALID_STATE The unit has been allocated or the clock source has been occupied
*/
esp_err_t ana_cmpr_new_unit(const ana_cmpr_config_t *config, ana_cmpr_handle_t *ret_cmpr);
/**
* @brief Delete the analog comparator unit handle
*
* @param[in] cmpr The handle of analog comparator unit
* @return
* - ESP_OK Delete analog comparator unit handle success
* - ESP_ERR_INVALID_ARG NULL pointer of the parameters or wrong unit number
* - ESP_ERR_INVALID_STATE The analog comparator is not disabled yet
*/
esp_err_t ana_cmpr_del_unit(ana_cmpr_handle_t cmpr);
/**
* @brief Set internal reference configuration
* @note This function only need to be called when `ana_cmpr_config_t::ref_src`
* is ANA_CMPR_REF_SRC_INTERNAL.
* @note This function is allowed to run within ISR context including intr callbacks
* @note This function will be placed into IRAM if `CONFIG_ANA_CMPR_CTRL_FUNC_IN_IRAM` is on,
* so that it's allowed to be executed when Cache is disabled
*
* @param[in] cmpr The handle of analog comparator unit
* @param[in] ref_cfg Internal reference configuration
* @return
* - ESP_OK Set denounce configuration success
* - ESP_ERR_INVALID_ARG NULL pointer of the parameters
2023-03-13 00:34:53 -04:00
* - ESP_ERR_INVALID_STATE The reference source is not `ANA_CMPR_REF_SRC_INTERNAL`
2023-03-01 06:50:45 -05:00
*/
2023-03-13 00:34:53 -04:00
esp_err_t ana_cmpr_set_internal_reference(ana_cmpr_handle_t cmpr, const ana_cmpr_internal_ref_config_t *ref_cfg);
2023-03-01 06:50:45 -05:00
/**
* @brief Set debounce configuration to the analog comparator
* @note This function is allowed to run within ISR context including intr callbacks
* @note This function will be placed into IRAM if `CONFIG_ANA_CMPR_CTRL_FUNC_IN_IRAM` is on,
* so that it's allowed to be executed when Cache is disabled
*
* @param[in] cmpr The handle of analog comparator unit
* @param[in] dbc_cfg Debounce configuration
* @return
* - ESP_OK Set denounce configuration success
* - ESP_ERR_INVALID_ARG NULL pointer of the parameters
*/
esp_err_t ana_cmpr_set_debounce(ana_cmpr_handle_t cmpr, const ana_cmpr_debounce_config_t *dbc_cfg);
2023-03-13 00:34:53 -04:00
/**
* @brief Set the source signal cross type
* @note The initial cross type is configured in `ana_cmpr_new_unit`, this function can update the cross type
* @note This function is allowed to run within ISR context including intr callbacks
* @note This function will be placed into IRAM if `CONFIG_ANA_CMPR_CTRL_FUNC_IN_IRAM` is on,
* so that it's allowed to be executed when Cache is disabled
*
* @param[in] cmpr The handle of analog comparator unit
* @param[in] cross_type The source signal cross type that can trigger the interrupt
* @return
* - ESP_OK Set denounce configuration success
* - ESP_ERR_INVALID_ARG NULL pointer of the parameters
*/
esp_err_t ana_cmpr_set_cross_type(ana_cmpr_handle_t cmpr, ana_cmpr_cross_type_t cross_type);
2023-03-01 06:50:45 -05:00
/**
* @brief Register analog comparator interrupt event callbacks
* @note This function can only be called before enabling the unit
*
* @param[in] cmpr The handle of analog comparator unit
* @param[in] cbs Group of callback functions
* @param[in] user_data The user data that will be passed to callback functions directly
* @return
* - ESP_OK Register callbacks success
* - ESP_ERR_INVALID_ARG NULL pointer of the parameters
* - ESP_ERR_INVALID_STATE The analog comparator has been enabled
*/
esp_err_t ana_cmpr_register_event_callbacks(ana_cmpr_handle_t cmpr, const ana_cmpr_event_callbacks_t *cbs, void *user_data);
/**
* @brief Enable the analog comparator unit
*
* @param[in] cmpr The handle of analog comparator unit
* @return
* - ESP_OK Enable analog comparator unit success
* - ESP_ERR_INVALID_ARG NULL pointer of the parameters
* - ESP_ERR_INVALID_STATE The analog comparator has been enabled
*/
esp_err_t ana_cmpr_enable(ana_cmpr_handle_t cmpr);
/**
* @brief Disable the analog comparator unit
*
* @param[in] cmpr The handle of analog comparator unit
* @return
* - ESP_OK Disable analog comparator unit success
* - ESP_ERR_INVALID_ARG NULL pointer of the parameters
* - ESP_ERR_INVALID_STATE The analog comparator has disabled already
*/
esp_err_t ana_cmpr_disable(ana_cmpr_handle_t cmpr);
/**
* @brief Get the specific GPIO number of the analog comparator unit
*
* @param[in] unit The handle of analog comparator unit
* @param[in] chan_type The channel type of analog comparator, like source channel or reference channel
* @param[out] gpio_num The output GPIO number of this channel
* @return
* - ESP_OK Get GPIO success
* - ESP_ERR_INVALID_ARG NULL pointer of the parameters or wrong unit number or wrong channel type
*/
esp_err_t ana_cmpr_get_gpio(ana_cmpr_unit_t unit, ana_cmpr_channel_type_t chan_type, int *gpio_num);
#ifdef __cplusplus
}
#endif