uint32_t fac_us=0;
#define assert_param(expr) ((void)0)
#define SysTick_CTRL_ENABLE_Pos1 0U /*!< SysTick CTRL: ENABLE Position */
#define SysTick_CTRL_ENABLE_Msk1 (1UL << SysTick_CTRL_ENABLE_Pos1)
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SYSTICK_CLKSOURCE_HCLK)
{
SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK;
}
else
{
SysTick->CTRL &= SYSTICK_CLKSOURCE_HCLK_DIV8;
}
}
/************************************************
函数名称 : delay_init
功 能 : 延时初始化
参 数 : 无
返 回 值 : 无
作 者 : Mico
*************************************************/
void delay_init(void)
{
SysTick_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8); //选择外部时钟 HCLK/8
fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
}
/************************************************
函数名称 : delay_us
功 能 : 实现微秒级别延时
参 数 : nus
返 回 值 : 无
作 者 : Mico
*************************************************/
void delay_us(uint32_t nus)
{
uint32_t temp;
SysTick->LOAD=nus*9; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk1; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
|