#include "drv_clk.h"
#include "drv_misc.h"
#include "kit_debug.h"
#include "drv_rcc.h"

#define AIRCR_VECTKEY_MASK          ((uint32_t)0x05FA0000)
#define NVIC_PriorityGroup_0        ((uint32_t)0x700)
#define GPIO_REMAP_EN_SWO_DIS_JTAG  ((uint32_t)0x02000000)


NoArgCall systick_int_call;
KitResult drvSystemTick(uint8_t priority, uint16_t period, NoArgCall call)
{
    uint32_t  tick;
    KitResult res;

    KIT_ASSERT_PARAM((call != NULL) && (CLOCK_SYS_FREQ / 1000 * period) < SysTick_LOAD_RELOAD_Msk);
    tick = CLOCK_SYS_FREQ / 1000 * period; 
    if ((call != NULL) && (tick < SysTick_LOAD_RELOAD_Msk))
    {
        systick_int_call = call;
        SysTick->LOAD  = (tick & SysTick_LOAD_RELOAD_Msk) - 1;  /* set reload register */
        drv_misc_set_nvic(SysTick_IRQn, priority);                  /* set Priority for Cortex-M0 System Interrupts */
        SysTick->VAL   = 0;                                     /* Load the SysTick Counter Value */
        SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                         SysTick_CTRL_TICKINT_Msk   |
                         SysTick_CTRL_ENABLE_Msk;               /* Enable SysTick IRQ and SysTick Timer */
        
        res = kKitResult_Ok;
    }
    else
    {
        res = kKitResult_ParamErr;
    }
                                                           
    return res;
}

void SysTick_Handler(void)
{
    KIT_ASSERT_PARAM(systick_int_call != NULL);
    
    systick_int_call();
}