circuitpython/atmel-samd/asf/common2/services/delay/sam0/systick_counter.c
2016-10-28 20:12:24 -07:00

97 lines
2.9 KiB
C

/**
* \file
*
* \brief ARM functions for busy-wait delay loops
*
* Copyright (c) 2014-2015 Atmel Corporation. All rights reserved.
*
* \asf_license_start
*
* \page License
*
* 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. The name of Atmel may not be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* 4. This software may only be redistributed and used in connection with an
* Atmel microcontroller product.
*
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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.
*
* \asf_license_stop
*
*/
/*
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
*/
#include "delay.h"
/**
* Value used to calculate ms delay. Default to be used with a 8MHz clock;
*/
static uint32_t cycles_per_ms = 8000000UL / 1000;
static uint32_t cycles_per_us = 8000000UL / 1000000;
/**
* \brief Initialize the delay driver.
*
* This must be called during start up to initialize the delay routine with
* the current used main clock. It must run any time the main CPU clock is changed.
*/
void delay_init(void)
{
cycles_per_ms = system_gclk_gen_get_hz(0);
cycles_per_ms /= 1000;
cycles_per_us = cycles_per_ms / 1000;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
}
/**
* \brief Delay loop to delay at least n number of microseconds
*
* \param n Number of microseconds to wait
*/
void delay_cycles_us(
uint32_t n)
{
while (n--) {
/* Divide up to blocks of 10u */
delay_cycles(cycles_per_us);
}
}
/**
* \brief Delay loop to delay at least n number of milliseconds
*
* \param n Number of milliseconds to wait
*/
void delay_cycles_ms(
uint32_t n)
{
while (n--) {
/* Divide up to blocks of 1ms */
delay_cycles(cycles_per_ms);
}
}