打印
[应用相关]

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

[复制链接]
784|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
泡椒风爪|  楼主 | 2023-10-28 01:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TI, ck, ic, sy
前言
国民技术N32G45X库函数RTC例程提供了SysTick定时器做延迟,但是只提供了MS延迟,国民技术N32G45X例程之-SysTick定时器做延迟不仅有MS延迟,还有US延迟。10US以上比较精确,最大延迟100MS。

提示:以下是本篇文章正文内容,下面案例可供参考:
/** @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;
}



使用特权

评论回复
沙发
泡椒风爪|  楼主 | 2023-10-28 01:08 | 只看该作者
经过改进后的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;
}

使用特权

评论回复
板凳
泡椒风爪|  楼主 | 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;       //清空计数器         
}

使用特权

评论回复
5
泡椒风爪|  楼主 | 2023-10-28 01:09 | 只看该作者
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);
        }
    }

}

使用特权

评论回复
6
泡椒风爪|  楼主 | 2023-10-28 01:09 | 只看该作者
程序下载
2.国民技术N32G45X例程之-SysTick定时器做延迟
https://download.csdn.net/download/suqingxiao/69295245

使用特权

评论回复
7
yangjiaxu| | 2023-10-31 16:43 | 只看该作者
这种延时的优势在于准确,其实也可以用普通的定时器实现延时功能

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

253

帖子

0

粉丝