栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

ARM CMx DWT硬件延时函数实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ARM CMx DWT硬件延时函数实现

在单片机程序当中,延时函数是标配,简单的不精确延时可用软件实现,但如果想要获得精准的可重入微秒级延时,就必须得使用硬件解决。

使用硬件延时主要有3种方案:

1、systick定时器;

2、timerx定时器;

3、DWT系统时钟计数器;

本文所讲解的就是第3种,如何利用DWT硬件,实现硬件延时功能。

Cortex-M3模块框图

DWT是ARM Cortex-M3/M4/M7/M33处理器的标配模块之一,因此只要是基于此内核的单片机都可以实现DWT延时功能,比如常见的STM32F1xx、STM32F4xx、STM32F7xx、GD32F1xx等等等。

DWT模块有很多功能,当前我们只用到它的系统时钟计数功能,DWT模块的系列寄存器中有1个32bit的CYCCNT寄存器,它存储着当前PC采样周期计数值,每个系统时钟其值自增1。例如STM32F103ZET6系统频率为72MHz,那么每秒钟,DWT->CYCCNT会增加72000000。

开启DWT->CYCCNT计数步骤如下:

1、DEMCR的TRCENA置1;(使能DWT功能)

2、DWT->CYCCNT清零;

3、DWT->CTRL的CYCCNTENA置1;(使能DWT_CYCCNT计数器)

经过如上对DWT初始化后,DWT->CYCCNT的值便以系统时钟频率进行递增,溢出后值变成0后再次自动递增。

函数实现逻辑:

1、读取起始时刻CYCCNT值,记录到Start变量;

2、计算需要延时的系统时钟数,并加上Start变量值,记录到Stop变量;

3、一直读取CYCCNT的值,直到CYCCNT超过Stop变量值;

如此,需要分为2种情况:

1、Start <= Stop:

此时,如果读取到的CYCCNT实时值处在B区间,表示当前延时时间还未结束;如果读取到的CYCCNT实时值处在A或者C区间时,表示延时时间已到。

2、Start > Stop:

此时,如果读取到的CYCCNT实时值处在B区间,表示当前延时时间已到;如果读取到的CYCCNT实时值处在A或者C区间时,表示延时时间还未结束。

代码实现如下:

#include "stdint.h"
#include "core_cm4.h"


void vDWTDelayInit(void)
{
    DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk;
    CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk;

    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    DWT->CYCCNT = 0;
    DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
}


void vDWTDelayS(float fTime)
{
    int32_t iTime = fTime;

    while((iTime--) > 0)
    {
        vDWTDelayUs(1000000.0f);
    }

    fTime -= iTime;
    vDWTDelayUs(fTime * 1000000.0f);
}


void vDWTDelayMs(float fTime)
{
    vDWTDelayUs(fTime * 1000.0f);
}


void vDWTDelayUs(float fTime)
{
    volatile uint32_t uiTimeStop = 0u, uiTimeStart = 0u;

    uiTimeStart = DWT->CYCCNT;
    uiTimeStop  = (uint32_t)((SystemCoreClock / 1000000u) * fTime) + uiTimeStart;

    if(uiTimeStop >= uiTimeStart)
        while((DWT->CYCCNT > uiTimeStart) && (DWT->CYCCNT < uiTimeStop));
    else
        while(!((DWT->CYCCNT > uiTimeStop) && (DWT->CYCCNT < uiTimeStart)));
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923265.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号