hpw422初始版本
This commit is contained in:
@@ -0,0 +1,219 @@
|
||||
/*!
|
||||
* \file xc_drv_aotimer.c
|
||||
*
|
||||
* \brief Target xinchip aotimer driver implementation
|
||||
*
|
||||
* \copyright Revised BSD License, see section \ref LICENSE.
|
||||
*
|
||||
* \code
|
||||
*
|
||||
* _ __ _ ________ _
|
||||
* | |/ /(_)___ / ____/ /_ (_)___
|
||||
* | // / __ \/ / / __ \/ / __ \
|
||||
* / |/ / / / / /___/ / / / / /_/ /
|
||||
* /_/|_/_/_/ /_/\____/_/ /_/_/ .___/
|
||||
* /_/
|
||||
* (C) 2022-2025 XinChip
|
||||
*
|
||||
* \endcode
|
||||
*
|
||||
* \author ( XinChip ) Alex-J
|
||||
*
|
||||
* \author ( XinChip )
|
||||
*/
|
||||
|
||||
/*-----------------------------------------------------------------------------------
|
||||
INCLUDE HEADE FILES
|
||||
------------------------------------------------------------------------------------*/
|
||||
#include "xc_drv_aotimer.h"
|
||||
|
||||
/*------------------------------------------------------------------------------------
|
||||
Local Variables
|
||||
-------------------------------------------------------------------------------------*/
|
||||
static bool aotimer_rst_flag = false;
|
||||
|
||||
/*------------------------------------------------------------------------------------
|
||||
Func Prototype
|
||||
-------------------------------------------------------------------------------------*/
|
||||
aotimer_handler_callback aotimer_n_callback[2] = {aotimer0_callback,
|
||||
aotimer1_callback};
|
||||
|
||||
/*------------------------------------------------------------------------------------
|
||||
Functions
|
||||
-------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
**************************************************************************************
|
||||
* @brief xc_aotimer_init
|
||||
* @details Example Initialize the aotimer according to its number
|
||||
* @param[in] reg_idx : aotimer number idx; AOTIMER0_IDX or AOTIMER1_IDX
|
||||
* @param[in] *init_cfg : This is the structure parameter that the AOTimer initializes
|
||||
* @param[out] void
|
||||
* @retval void
|
||||
***************************************************************************************
|
||||
*/
|
||||
void xc_aotimer_init(uint8_t reg_idx, AOTimer_InitCfg_t *init_cfg)
|
||||
{
|
||||
if (aotimer_rst_flag == false) {
|
||||
cprao_aon_clken_grctl__timer_ao_pclk_en__setf(ENABLE);
|
||||
aotimer_rst_flag = true;
|
||||
}
|
||||
|
||||
//The clocks for ao timer0 and ao timer1 need to be turned on at the same time.
|
||||
if (AOTIMER0_IDX == reg_idx) {
|
||||
cprao_aon_clken_grctl__timer0_ao_pclk_en__setf(ENABLE);
|
||||
cprao_aon_clken_grctl__timer1_ao_pclk_en__setf(ENABLE);
|
||||
} else if (AOTIMER1_IDX == reg_idx) {
|
||||
cprao_aon_clken_grctl__timer0_ao_pclk_en__setf(ENABLE);
|
||||
cprao_aon_clken_grctl__timer1_ao_pclk_en__setf(ENABLE);
|
||||
}
|
||||
cpr_lp_ctl__timer_sysclk_sel__setf(ENABLE);
|
||||
|
||||
aotimer_tcr__tes__setf(reg_idx, DISABLE);
|
||||
aotimer_tcr__tms__setf(reg_idx, (uint8_t)init_cfg->aotimer_mode);
|
||||
(void)aotimer_tic__tic__getf(reg_idx);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
**************************************************************************************
|
||||
* @brief xc_aotimer_us_to_ticks
|
||||
* @details Returns the number of ticks according to the time to be set by the aotimer
|
||||
* @param[in] us : Time set by the timer (Microsecond is the smallest unit)
|
||||
|
||||
* @param[out] void
|
||||
* @retval ticks ( Tick count )
|
||||
***************************************************************************************
|
||||
*/
|
||||
static uint32_t xc_aotimer_us_to_ticks(uint32_t us)
|
||||
{
|
||||
uint32_t ticks = AOTIMER_TICK_CAL(us);
|
||||
|
||||
if (ticks < AOTIMER_MIN_TLC_VAL)
|
||||
ticks = AOTIMER_MIN_TLC_VAL;
|
||||
|
||||
return ticks;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
**************************************************************************************
|
||||
* @brief xc_aotimer_set_value
|
||||
* @details Set the timing time according to the aotimer number
|
||||
* @param[in] reg_idx : aotimer number idx; AOTIMER0_IDX or AOTIMER1_IDX
|
||||
* @param[in] us : Time set by the timer (Microsecond is the smallest unit)
|
||||
* @param[out] void
|
||||
* @retval void
|
||||
***************************************************************************************
|
||||
*/
|
||||
void xc_aotimer_set_value(uint8_t reg_idx, uint32_t us)
|
||||
{
|
||||
uint32_t ticks = xc_aotimer_us_to_ticks(us);
|
||||
|
||||
aotimer_tcr__tes__setf(reg_idx, AOTIMER_TCR_TES_DISABLE);
|
||||
|
||||
aotimer_tlc_set(reg_idx, ticks);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
**************************************************************************************
|
||||
* @brief xc_aotimer_start
|
||||
* @details Start the timer according to the aotimer number
|
||||
* @param[in] reg_idx : aotimer number idx; AOTIMER0_IDX or AOTIMER1_IDX
|
||||
* @param[out] void
|
||||
* @retval void
|
||||
***************************************************************************************
|
||||
*/
|
||||
void xc_aotimer_start(uint8_t reg_idx)
|
||||
{
|
||||
NVIC_EnableIRQ( (IRQn_Type)(TIMER_AO0_IRQn+reg_idx) );
|
||||
aotimer_tcr__tim__setf(reg_idx, 0);
|
||||
aotimer_tcr__tes__setf(reg_idx, ENABLE);
|
||||
// Wait for timer enable
|
||||
while(aotimer_tcr__tes__getf(reg_idx) != ENABLE)
|
||||
{
|
||||
__nop();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
**************************************************************************************
|
||||
* @brief xc_aotimer_stop
|
||||
* @details Stop the timer according to the aotimer number
|
||||
* @param[in] reg_idx : aotimer number idx; AOTIMER0_IDX or AOTIMER1_IDX
|
||||
* @param[out] void
|
||||
* @retval void
|
||||
***************************************************************************************
|
||||
*/
|
||||
void xc_aotimer_stop(uint8_t reg_idx)
|
||||
{
|
||||
aotimer_tcr__tes__setf(reg_idx, DISABLE);
|
||||
}
|
||||
|
||||
/**
|
||||
**************************************************************************************
|
||||
* @brief AOTIMER0_Handler
|
||||
* @details AOTIMER0 Interrupt function
|
||||
* @param[in] void
|
||||
* @param[out] void
|
||||
* @retval void
|
||||
***************************************************************************************
|
||||
*/
|
||||
void AOTIMER0_Handler(void)
|
||||
{
|
||||
cprao_aon_reg1__timer_ao_sleep_clksw__setf(0);
|
||||
(void)aotimer_tic__tic__getf(AOTIMER0_IDX);
|
||||
if (aotimer_n_callback[0] != NULL)
|
||||
aotimer_n_callback[0](NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
**************************************************************************************
|
||||
* @brief AOTIMER1_Handler
|
||||
* @details AOTIMER1 Interrupt function
|
||||
* @param[in] void
|
||||
* @param[out] void
|
||||
* @retval void
|
||||
***************************************************************************************
|
||||
*/
|
||||
void AOTIMER1_Handler(void)
|
||||
{
|
||||
cprao_aon_reg1__timer_ao_sleep_clksw__setf(0);
|
||||
(void)aotimer_tic__tic__getf(AOTIMER1_IDX);
|
||||
if (aotimer_n_callback[1] != NULL)
|
||||
aotimer_n_callback[1](NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
**************************************************************************************
|
||||
* @brief aotimer0_callback
|
||||
* @details AOTIMER0 Interrupt the callback function
|
||||
* @param[in] void
|
||||
* @param[out] void
|
||||
* @retval void
|
||||
***************************************************************************************
|
||||
*/
|
||||
__WEAK void aotimer0_callback(void *context)
|
||||
{ /* AOTimer0 中断回调处理事件 */
|
||||
}
|
||||
|
||||
/**
|
||||
**************************************************************************************
|
||||
* @brief aotimer1_callback
|
||||
* @details AOTIMER1 Interrupt the callback function
|
||||
* @param[in] void
|
||||
* @param[out] void
|
||||
* @retval void
|
||||
***************************************************************************************
|
||||
*/
|
||||
__WEAK void aotimer1_callback(void *context)
|
||||
{ /* AOTimer1 中断回调处理事件 */
|
||||
}
|
||||
Reference in New Issue
Block a user