2.国民技术N32G45X例程之-SysTick定时器做延迟


前言

国民技术N32G45X库函数RTC例程提供了SysTick定时器做延迟,但是只提供了MS延迟,国民技术N32G45X例程之-SysTick定时器做延迟不仅有MS延迟,还有US延迟。10US以上比较精确,最大延迟100MS。


提示:以下是本篇文章正文内容,下面案例可供参考

一、国民技术N32G45X库函数RTC例程提供的SysTick定时器做延迟

/** @addtogroup RTC_Calendar
 * @{
 */

/**
 * @brief  Configure the system tick clock.
 */
uint32_t DBG_SysTick_Config(uint32_t ticks)
{
    if (ticks > SysTick_LOAD_RELOAD_Msk)
        return (1); /* Reload value impossible */
    SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;       /* set reload register */
    NVIC_SetPriority(SysTick_IRQn, (1 << __NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
    SysTick->VAL  = 0;                                           /* Load the SysTick Counter Value */
    SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
    SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
    return (0); /* Function successful */
}


/**
 * @brief  Use the system tick clock to delay.
 */
void SysTick_Delay_Ms(__IO uint32_t ms)
{
    uint32_t i;
    RCC_ClocksType RCC_Clocks;
    RCC_GetClocksFreqValue(&RCC_Clocks);
    DBG_SysTick_Config(RCC_Clocks.SysclkFreq / 1000);
    for (i = 0; i < ms; i++)
    {
       /* When the value of the counter is reduced to 0, the bit 16 of the CRTL register is set to 1.
          When set to 1, the bit  will cleared to 0 with read
       */
       while (!((SysTick->CTRL) & (1 << 16)));
    }
    // Disable SysTick timer
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}

二、经过改进后的SysTick定时器做延迟

1.SysTick初始化

代码如下(示例):

static u32  fac_us=0;//us延时倍乘数
static u32  fac_ms=0;//ms延时倍乘数 

//初始化延迟函数
void delay_init(u32 SYSCLK)
{
	SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  HCLK/8   
	fac_us=SYSCLK;		    
	fac_ms=fac_us*1000;
}

2.SysTick定时器做延迟1MS,最大延迟100MS

代码如下(示例):

void delay_ms(u32 nms)
{	 		  	  
	u32 temp;	
	
	SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit) 
	SysTick->VAL =0x00;           //清空计数器
	SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; ;          //开始倒数  
	do
	{
		temp=SysTick->CTRL;
	}
	while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
 	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
	SysTick->VAL =0X00;       //清空计数器	 	    
}

2.SysTick定时器做延迟1US

代码如下(示例):

//延时nus		    								   
void delay_us(u32 nus)
{		
	u32 temp;
	
	SysTick->LOAD=nus*fac_us; //时间加载	  		 
	SysTick->VAL=0x00;        //清空计数器
	SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; ;      //开始倒数 	 
	do
	{
		temp=SysTick->CTRL;
	}
	while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
	SysTick->VAL =0X00;       //清空计数器	 
}

3.SysTick定时器做延迟1S

代码如下(示例):

//延时s		    								   
void delay_s(u32 ns)
{
    u32  i,j;
    
    for(i=0;i<10;i++)
    {
        for(j =0;j<ns;j++)
        {
            delay_ms(100);
        }
    }

}

三、程序下载

2.国民技术N32G45X例程之-SysTick定时器做延迟
https://download.csdn.net/download/suqingxiao/69295245

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suqingxiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值