K1Guitar/AT32F403ARCT7_BOOT/project/src/wk_system.c

101 lines
3.0 KiB
C

/* add user code begin Header */
/**
**************************************************************************
* @file wk_system.c
* @brief work bench config program
**************************************************************************
* Copyright notice & Disclaimer
*
* The software Board Support Package (BSP) that is made available to
* download from Artery official website is the copyrighted work of Artery.
* Artery authorizes customers to use, copy, and distribute the BSP
* software and its related documentation for the purpose of design and
* development in conjunction with Artery microcontrollers. Use of the
* software is governed by this copyright notice and the following disclaimer.
*
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
*
**************************************************************************
*/
/* add user code end Header */
#include "wk_system.h"
#define STEP_DELAY_MS (uint32_t)(50)
#define TICK_COUNT_MAX (uint32_t)(0xFFFFFF)
#define TICK_COUNT_VALUE (SysTick->VAL)
/* global variable */
volatile uint32_t ticks_count_us;
/**
* @brief this function provides minimum delay (in microsecond).
* @param delay: specifies the delay time length, in microsecond.
* @retval none
*/
static void delay_us(uint32_t delay)
{
uint32_t delay_ticks, pre_ticks, cur_ticks, delta;
delay_ticks = delay * ticks_count_us;
pre_ticks = TICK_COUNT_VALUE;
do
{
cur_ticks = TICK_COUNT_VALUE;
/* count down */
delta = (cur_ticks <= pre_ticks) ? (pre_ticks - cur_ticks) : ((TICK_COUNT_MAX - cur_ticks) + pre_ticks + 1);
} while(delta < delay_ticks);
}
/**
* @brief this function provides minimum delay (in milliseconds).
* @param delay variable specifies the delay time length, in milliseconds.
* @retval none
*/
__WEAK void wk_delay_ms(uint32_t delay)
{
while(delay)
{
if(delay > STEP_DELAY_MS)
{
delay_us(STEP_DELAY_MS * 1000);
delay -= STEP_DELAY_MS;
}
else
{
delay_us(delay * 1000);
delay = 0;
}
}
}
/**
* @brief this function configures the source of the time base.
* @param none
* @retval none
*/
__WEAK void wk_timebase_init(void)
{
crm_clocks_freq_type crm_clocks;
uint32_t frequency = 0;
/* get crm_clocks */
crm_clocks_freq_get(&crm_clocks);
frequency = crm_clocks.ahb_freq / 8;
/* config systick clock source */
systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_DIV8);
ticks_count_us = (frequency / 1000000U);
/* system tick config */
TICK_COUNT_VALUE = 0UL;
SysTick->LOAD = TICK_COUNT_MAX;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}