blob: 17cff4b7c402e1c677ab5214f918736069bf1b9d [file] [log] [blame]
/**
* \addtogroup BSP
* \{
* \addtogroup DEVICES
* \{
* \addtogroup Timer0
* \{
*/
/**
****************************************************************************************
*
* @file hw_timer0.c
*
* @brief Implementation of the Timer0 Low Level Driver.
*
* Copyright (c) 2016, Dialog Semiconductor
* All rights reserved.
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
****************************************************************************************
*/
#if dg_configUSE_HW_TIMER0
#include <stdio.h>
#include <sdk_defs.h>
#include <hw_timer0.h>
#if (dg_configSYSTEMVIEW)
# include "SEGGER_SYSVIEW_FreeRTOS.h"
#else
# define SEGGER_SYSTEMVIEW_ISR_ENTER()
# define SEGGER_SYSTEMVIEW_ISR_EXIT()
#endif
static hw_timer0_interrupt_cb intr_cb;
void hw_timer0_init(const timer0_config *cfg)
{
/* Enable clock for peripheral */
uint32_t clk_tmr_reg = CRG_TOP->CLK_TMR_REG;
clk_tmr_reg &= ~CRG_TOP_CLK_TMR_REG_TMR0_DIV_Msk;
clk_tmr_reg &= ~CRG_TOP_CLK_TMR_REG_TMR0_CLK_SEL_Msk;
clk_tmr_reg |= CRG_TOP_CLK_TMR_REG_TMR0_ENABLE_Msk;
CRG_TOP->CLK_TMR_REG = clk_tmr_reg ;
/* Reset control register, i.e. disable timer */
GP_TIMERS->TIMER0_CTRL_REG = 0x0;
/* Disable NVIC interrupt */
NVIC_DisableIRQ(SWTIM0_IRQn);
intr_cb = NULL;
hw_timer0_configure(cfg);
}
void hw_timer0_configure(const timer0_config *cfg)
{
if (cfg)
{
hw_timer0_set_clock_source(cfg->clk_src);
hw_timer0_set_fast_clock_div(cfg->fast_clk_div);
hw_timer0_set_on_clock_div(cfg->on_clock_div);
hw_timer0_set_on_reload(cfg->on_reload);
hw_timer0_set_t0_reload(cfg->t0_reload_m, cfg->t0_reload_n);
}
}
void hw_timer0_register_int(hw_timer0_interrupt_cb handler)
{
intr_cb = handler;
NVIC_EnableIRQ(SWTIM0_IRQn);
}
void hw_timer0_unregister_int(void)
{
NVIC_DisableIRQ(SWTIM0_IRQn);
intr_cb = NULL;
}
void SWTIM0_Handler(void)
{
SEGGER_SYSTEMVIEW_ISR_ENTER();
if (intr_cb)
{
intr_cb();
}
SEGGER_SYSTEMVIEW_ISR_EXIT();
}
#endif /* dg_configUSE_HW_TIMER0 */
/**
* \}
* \}
* \}
*/