泡椒风爪 发表于 2023-10-28 01:07

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

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

提示:以下是本篇文章正文内容,下面案例可供参考:
/** @addtogroup RTC_Calendar
* @{
*/

/**
* @briefConfigure 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 */
}


/**
* @briefUse 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 bitwill cleared to 0 with read
       */
       while (!((SysTick->CTRL) & (1 << 16)));
    }
    // Disable SysTick timer
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}



泡椒风爪 发表于 2023-10-28 01:08

经过改进后的SysTick定时器做延迟
1.SysTick初始化
代码如下(示例):
static u32fac_us=0;//us延时倍乘数
static u32fac_ms=0;//ms延时倍乘数

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

泡椒风爪 发表于 2023-10-28 01:08

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;       //清空计数器                 
}

泡椒风爪 发表于 2023-10-28 01:09

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;       //清空计数器       
}

泡椒风爪 发表于 2023-10-28 01:09

SysTick定时器做延迟1S
代码如下(示例):
//延时s                                                                                    
void delay_s(u32 ns)
{
    u32i,j;
   
    for(i=0;i<10;i++)
    {
      for(j =0;j<ns;j++)
      {
            delay_ms(100);
      }
    }

}

泡椒风爪 发表于 2023-10-28 01:09

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

yangjiaxu 发表于 2023-10-31 16:43

这种延时的优势在于准确,其实也可以用普通的定时器实现延时功能
页: [1]
查看完整版本: 国民技术N32G45X例程之-SysTick定时器做延迟