/*!
 *     COPYRIGHT NOTICE
 *     Copyright (c) 2013,山外科技
 *     All rights reserved.
 *     技术讨论：山外论坛 http://www.vcan123.com
 *
 *     除注明出处外，以下所有内容版权均属山外科技所有，未经允许，不得用于商业用途，
 *     修改内容时必须保留山外科技的版权声明。
 *
 * @file       MK60_SysTick.c
 * @brief      SysTick 驱动函数，包括延时
 * @author     山外科技
 * @version    v5.0
 * @date       2013-10-08
 */


#include "common.h"
#include "MK60_SysTick.h"
/*
Cortex-M4 的内核中包含一个 SysTick 时钟。SysTick?为一个?24?位递减计数器，
SysTick 设定初值并使能后，每经过 1 个系统时钟周期，计数值就减 1。
计数到 0 时，SysTick 计数器自动重装初值并继续计数，
同时内部的 COUNTFLAG 标志会置位，触发中断(如果中断使能情况下)。
*/


/*!
 *  @brief      SysTick延时函数
 *  @param      time          LPTMR延时时间(0~65535)
 *  @since      v5.0
 *  Sample usage:       systick_delay(32);     // systick 延时32 个系统周期
 */
void systick_delay(uint32 time)
{
    if(time == 0)
    {
        return;
    }

    ASSERT(time <= (SysTick_RVR_RELOAD_MASK >> SysTick_RVR_RELOAD_SHIFT));  //24位

    SYST_CSR = 0x00;                        //先关了 systick ,清标志位

    SYST_RVR = time;                        //设置延时时间

    SYST_CVR = 0x00;                        //清空计数器

    SYST_CSR = ( 0
                 | SysTick_CSR_ENABLE_MASK       //使能 systick
                 //| SysTick_CSR_TICKINT_MASK    //使能中断 (注释了表示关闭中断)
                 | SysTick_CSR_CLKSOURCE_MASK    //时钟源选择 ( core clk)
               );

    while( !(SYST_CSR & SysTick_CSR_COUNTFLAG_MASK));   //等待时间到
}

/*!
 *  @brief      SysTick延时函数
 *  @param      ms          延时时间
 *  @since      v5.0
 *  Sample usage:       systick_delay_ms(32);     // systick 延时32 ms
 */
void systick_delay_ms(uint32 ms)
{
    while(ms--)
    {
        systick_delay(SYSTICK_CLK_KHZ);
    }
}

/*!
 *  @brief      SysTick定时函数
 *  @param      time          定时时间(0~65535)
 *  @since      v5.0
 *  Sample usage:       systick_timing(32);     // systick 定时 32 个系统周期
 */
void systick_timing(uint32 time)
{

    ASSERT(time <= (SysTick_RVR_RELOAD_MASK >> SysTick_RVR_RELOAD_SHIFT));  //24位

    SYST_RVR = time;                        //设置延时时间

    //设置优先级
    NVIC_SetPriority (SysTick_IRQn, (1 << __NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M4 System Interrupts */

    SYST_CVR = 0x00;                        //清空计数器

    SYST_CSR = ( 0
                 | SysTick_CSR_ENABLE_MASK       //使能 systick
                 | SysTick_CSR_TICKINT_MASK      //使能中断 (注释了表示关闭中断)
                 | SysTick_CSR_CLKSOURCE_MASK    //时钟源选择 ( core clk)
               );
}




