timer group interrupt enable is controled by level_int_ena instead of int_ena Closes https://github.com/espressif/esp-idf/issues/5103
330 lines
9.1 KiB
C
330 lines
9.1 KiB
C
// Copyright 2019 Espressif Systems (Shanghai) PTE LTD
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
/*******************************************************************************
|
|
* NOTICE
|
|
* The hal is not public api, don't use in application code.
|
|
* See readme.md in soc/include/hal/readme.md
|
|
******************************************************************************/
|
|
|
|
// The HAL layer for Timer Group.
|
|
// There is no parameter check in the hal layer, so the caller must ensure the correctness of the parameters.
|
|
|
|
#pragma once
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "hal/timer_ll.h"
|
|
#include "hal/timer_types.h"
|
|
#include "soc/timer_group_caps.h"
|
|
|
|
/**
|
|
* Context that should be maintained by both the driver and the HAL
|
|
*/
|
|
typedef struct {
|
|
timg_dev_t *dev;
|
|
timer_idx_t idx;
|
|
} timer_hal_context_t;
|
|
|
|
/**
|
|
* @brief Init the timer hal. This function should be called first before other hal layer function is called
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param group_num The timer group number
|
|
* @param timer_num The timer number
|
|
*
|
|
* @return None
|
|
*/
|
|
void timer_hal_init(timer_hal_context_t *hal, timer_group_t group_num, timer_idx_t timer_num);
|
|
|
|
/**
|
|
* @brief Get interrupt status register address and corresponding control bits mask
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param status_reg[out] interrupt status register address
|
|
* @param mask_bit[out] control bits mask
|
|
*/
|
|
void timer_hal_get_status_reg_mask_bit(timer_hal_context_t *hal, uint32_t *status_reg, uint32_t *mask_bit);
|
|
|
|
/**
|
|
* @brief Set timer clock prescale value
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param divider Prescale value
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_set_divider(hal, divider) timer_ll_set_divider((hal)->dev, (hal)->idx, divider)
|
|
|
|
/**
|
|
* @brief Get timer clock prescale value
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param divider Pointer to accept the prescale value
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_get_divider(hal, divider) timer_ll_get_divider((hal)->dev, (hal)->idx, divider)
|
|
|
|
/**
|
|
* @brief Load counter value into time-base counter
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param load_val Counter value
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_set_counter_value(hal, load_val) timer_ll_set_counter_value((hal)->dev, (hal)->idx, load_val)
|
|
|
|
/**
|
|
* @brief Get counter value from time-base counter
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param timer_val Pointer to accept the counter value
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_get_counter_value(hal, timer_val) timer_ll_get_counter_value((hal)->dev, (hal)->idx, timer_val)
|
|
|
|
/**
|
|
* @brief Set counter mode, include increment mode and decrement mode.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param increase_en True to increment mode, fasle to decrement mode
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_set_counter_increase(hal, increase_en) timer_ll_set_counter_increase((hal)->dev, (hal)->idx, increase_en)
|
|
|
|
/**
|
|
* @brief Get counter mode, include increment mode and decrement mode.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param counter_dir Pointer to accept the counter mode
|
|
*
|
|
* @return
|
|
* - true Increment mode
|
|
* - false Decrement mode
|
|
*/
|
|
#define timer_hal_get_counter_increase(hal) timer_ll_get_counter_increase((hal)->dev, (hal)->idx)
|
|
|
|
/**
|
|
* @brief Set counter status, enable or disable counter.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param counter_en True to enable counter, false to disable counter
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_set_counter_enable(hal, counter_en) timer_ll_set_counter_enable((hal)->dev, (hal)->idx, counter_en)
|
|
|
|
/**
|
|
* @brief Get counter status.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
*
|
|
* @return
|
|
* - true Enable counter
|
|
* - false Disable conuter
|
|
*/
|
|
#define timer_hal_get_counter_enable(hal) timer_ll_get_counter_enable((hal)->dev, (hal)->idx)
|
|
|
|
/**
|
|
* @brief Set auto reload mode.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param auto_reload_en True to enable auto reload mode, flase to disable auto reload mode
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_set_auto_reload(hal, auto_reload_en) timer_ll_set_auto_reload((hal)->dev, (hal)->idx, auto_reload_en)
|
|
|
|
/**
|
|
* @brief Get auto reload mode.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
*
|
|
* @return
|
|
* - true Enable auto reload mode
|
|
* - false Disable auto reload mode
|
|
*/
|
|
#define timer_hal_get_auto_reload(hal) timer_ll_get_auto_reload((hal)->dev, (hal)->idx)
|
|
|
|
/**
|
|
* @brief Set the counter value to trigger the alarm.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param alarm_value Counter value to trigger the alarm
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_set_alarm_value(hal, alarm_value) timer_ll_set_alarm_value((hal)->dev, (hal)->idx, alarm_value)
|
|
|
|
/**
|
|
* @brief Get the counter value to trigger the alarm.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param alarm_value Pointer to accept the counter value to trigger the alarm
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_get_alarm_value(hal, alarm_value) timer_ll_get_alarm_value((hal)->dev, (hal)->idx, alarm_value)
|
|
|
|
/**
|
|
* @brief Set the alarm status, enable or disable the alarm.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param alarm_en True to enable alarm, false to disable alarm
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_set_alarm_enable(hal, alarm_en) timer_ll_set_alarm_enable((hal)->dev, (hal)->idx, alarm_en)
|
|
|
|
/**
|
|
* @brief Get the alarm status.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
*
|
|
* @return
|
|
* - true Enable alarm
|
|
* - false Disable alarm
|
|
*/
|
|
#define timer_hal_get_alarm_enable(hal) timer_ll_get_alarm_enable((hal)->dev, (hal)->idx)
|
|
|
|
/**
|
|
* @brief Set the level interrupt status, enable or disable the level interrupt.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param level_int_en True to enable level interrupt, false to disable level interrupt
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_set_level_int_enable(hal, level_int_en) timer_ll_set_level_int_enable((hal)->dev, (hal)->idx, level_int_en)
|
|
|
|
/**
|
|
* @brief Get the level interrupt status.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
*
|
|
* @return
|
|
* - true Enable level interrupt
|
|
* - false Disable level interrupt
|
|
*/
|
|
#define timer_hal_get_level_int_enable(hal) timer_ll_get_level_int_enable((hal)->dev, (hal)->idx)
|
|
|
|
/**
|
|
* @brief Set the edge interrupt status, enable or disable the edge interrupt.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param edge_int_en True to enable edge interrupt, false to disable edge interrupt
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_set_edge_int_enable(hal, edge_int_en) timer_ll_set_edge_int_enable((hal)->dev, (hal)->idx, edge_int_en)
|
|
|
|
/**
|
|
* @brief Get the edge interrupt status.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
*
|
|
* @return
|
|
* - true Enable edge interrupt
|
|
* - false Disable edge interrupt
|
|
*/
|
|
#define timer_hal_get_edge_int_enable(hal) timer_ll_get_edge_int_enable((hal)->dev, (hal)->idx)
|
|
|
|
/**
|
|
* @brief Enable timer interrupt.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_intr_enable(hal) timer_ll_intr_enable((hal)->dev, (hal)->idx)
|
|
|
|
/**
|
|
* @brief Disable timer interrupt.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_intr_disable(hal) timer_ll_intr_disable((hal)->dev, (hal)->idx)
|
|
|
|
/**
|
|
* @brief Clear interrupt status.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_clear_intr_status(hal) timer_ll_clear_intr_status((hal)->dev, (hal)->idx)
|
|
|
|
/**
|
|
* @brief Get interrupt status.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param intr_status Interrupt status
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_get_intr_status(hal, intr_status) timer_ll_get_intr_status((hal)->dev, intr_status)
|
|
|
|
/**
|
|
* @brief Get interrupt raw status.
|
|
*
|
|
* @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1
|
|
* @param intr_raw_status Interrupt raw status
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_get_intr_raw_status(group_num, intr_raw_status) timer_ll_get_intr_raw_status(group_num, intr_raw_status)
|
|
|
|
/**
|
|
* @brief Get interrupt status register address.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
*
|
|
* @return Interrupt status register address
|
|
*/
|
|
#define timer_hal_get_intr_status_reg(hal) timer_ll_get_intr_status_reg((hal)->dev)
|
|
|
|
#ifdef SOC_TIMER_GROUP_SUPPORT_XTAL
|
|
/**
|
|
* @brief Set clock source.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
* @param use_xtal_en True to use XTAL clock, flase to use APB clock
|
|
*
|
|
* @return None
|
|
*/
|
|
#define timer_hal_set_use_xtal(hal, use_xtal_en) timer_ll_set_use_xtal((hal)->dev, (hal)->idx, use_xtal_en)
|
|
|
|
/**
|
|
* @brief Get clock source.
|
|
*
|
|
* @param hal Context of the HAL layer
|
|
*
|
|
* @return
|
|
* - true Use XTAL clock
|
|
* - false Use APB clock
|
|
*/
|
|
#define timer_hal_get_use_xtal(hal) timer_ll_get_use_xtal((hal)->dev, (hal)->idx)
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|