90 lines
1.9 KiB
C
90 lines
1.9 KiB
C
|
|
#include "at32f403a_407_clock.h"
|
|
#include "at32f403a_407.h"
|
|
|
|
/* delay macros */
|
|
#define STEP_DELAY_MS 50
|
|
|
|
/* delay variable */
|
|
static __IO uint32_t fac_us;
|
|
static __IO uint32_t fac_ms;
|
|
/**
|
|
* @brief initialize delay function
|
|
* @param none
|
|
* @retval none
|
|
*/
|
|
void delay_init()
|
|
{
|
|
/* configure systick */
|
|
systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV);
|
|
fac_us = system_core_clock / (1000000U);
|
|
fac_ms = fac_us * (1000U);
|
|
}
|
|
|
|
/**
|
|
* @brief inserts a delay time.
|
|
* @param nus: specifies the delay time length, in microsecond.
|
|
* @retval none
|
|
*/
|
|
void delay_us(uint32_t nus)
|
|
{
|
|
uint32_t temp = 0;
|
|
SysTick->LOAD = (uint32_t)(nus * fac_us);
|
|
SysTick->VAL = 0x00;
|
|
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;
|
|
do
|
|
{
|
|
temp = SysTick->CTRL;
|
|
}while((temp & 0x01) && !(temp & (1 << 16)));
|
|
|
|
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
|
SysTick->VAL = 0x00;
|
|
}
|
|
|
|
/**
|
|
* @brief inserts a delay time.
|
|
* @param nms: specifies the delay time length, in milliseconds.
|
|
* @retval none
|
|
*/
|
|
void delay_ms(uint16_t nms)
|
|
{
|
|
uint32_t temp = 0;
|
|
while(nms)
|
|
{
|
|
if(nms > STEP_DELAY_MS)
|
|
{
|
|
SysTick->LOAD = (uint32_t)(STEP_DELAY_MS * fac_ms);
|
|
nms -= STEP_DELAY_MS;
|
|
}
|
|
else
|
|
{
|
|
SysTick->LOAD = (uint32_t)(nms * fac_ms);
|
|
nms = 0;
|
|
}
|
|
SysTick->VAL = 0x00;
|
|
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
|
do
|
|
{
|
|
temp = SysTick->CTRL;
|
|
}while((temp & 0x01) && !(temp & (1 << 16)));
|
|
|
|
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
|
SysTick->VAL = 0x00;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief inserts a delay time.
|
|
* @param sec: specifies the delay time, in seconds.
|
|
* @retval none
|
|
*/
|
|
void delay_sec(uint16_t sec)
|
|
{
|
|
uint16_t index;
|
|
for(index = 0; index < sec; index++)
|
|
{
|
|
delay_ms(500);
|
|
delay_ms(500);
|
|
}
|
|
}
|