使用DWT来实现系统延时

DWT,全称是The Debug Watchpoint and Trace (DWT) unit,用于系统调试及跟踪,详细的介绍可以参考ARM官方文档:ARMv7-M Architecture Reference Manual。本文将使它来实现一个系统的延时功能。

1. 寄存器简单介绍

要实现延时的功能,总共涉及到三个寄存器:DEMCR 、DWT_CTRL、DWT_CYCCNT,分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值。

DEMCR

其官方手册说明如下,这里我们只需要关注其第24位引脚TRCENA。

该寄存器的TRCENA位置位,使能DWT功能

DWT_CTRL寄存器

其包含很多功能,这里我们只开启其循环计数功能。

CYCCNT寄存器

该寄存器地址见上图,其描述如下:

当DWT的CYCCNTENA位置位后,该寄存器的值与系统周期计数值保持同步,我们可以用它的值来实现一个延时的功能。

2. 延时程序编写

直接上代码:

延时函数源文件:

#include "DWTDelay.h"

// 0xE000EDFC DEMCR RW Debug Exception and Monitor Control Register.
#define DEMCR           ( *(unsigned int *)0xE000EDFC )
#define TRCENA          ( 0x01 << 24) // DEMCR的DWT使能位

// 0xE0001000 DWT_CTRL RW The Debug Watchpoint and Trace (DWT) unit
#define DWT_CTRL        ( *(unsigned int *)0xE0001000 )
#define CYCCNTENA       ( 0x01 << 0 ) // DWT的SYCCNT使能位
// 0xE0001004 DWT_CYCCNT RW Cycle Count register,
#define DWT_CYCCNT      ( *(unsigned int *)0xE0001004) // 显示或设置处理器的周期计数值

//#define DWT_DELAY_mS(mSec)    DWT_DELAY_uS(mSec*1000)

static int SYSCLK = 0;;

void DWT_INIT(int sys_clk)
{
  DEMCR |= TRCENA;
  DWT_CTRL |= CYCCNTENA;

  SYSCLK = sys_clk; // 保存当前系统的时钟周期,eg. 72,000,000(72MHz).
}

// 微秒延时
void DWT_DELAY_uS(int uSec)
{
  int ticks_start, ticks_end, ticks_delay;

  ticks_start = DWT_CYCCNT;

  if ( !SYSCLK )
    DWT_INIT( MY_MCU_SYSCLK );

  ticks_delay = ( uSec * ( SYSCLK / (1000*1000) ) ); // 将微秒数换算成滴答数          

  ticks_end = ticks_start + ticks_delay;

  if ( ticks_end > ticks_start )
  {
    while( DWT_CYCCNT < ticks_end );
  }
  else // 计数溢出,翻转
  {
    while( DWT_CYCCNT >= ticks_end ); // 翻转后的值不会比ticks_end小
    while( DWT_CYCCNT < ticks_end );
  }
}

延时函数头文件:

#ifndef _DWTDELAY_H_

#define _DWTDELAY_H_

// 根据MCU做修改
#define MY_MCU_SYSCLK           (72000000)

void DWT_INIT(int sys_clk);

// 微秒延时
void DWT_DELAY_uS(int uSec);

#define DWT_DELAY_mS(mSec)    DWT_DELAY_uS( mSec*1000 )

#endif // _DWTDELAY_H_

至此,简单、好用、精准又不占用CPU其它外设资源的延时函数就实现了。

时间: 2024-10-29 19:08:03

使用DWT来实现系统延时的相关文章

使用FreeRTOS在SD卡驱动使用非系统延时导致上电重启不工作的情况

一.问题描述在一个使用FreeRTOS的工程中,只做了SD卡的驱动,由于RTOS使用了Systick,故非系统延时函数使用的是 DWT中的时钟周期(CYCCNT)计数功能,但是在SD卡驱动中使用了这个非系统延时导致,烧写程序后板子工作正常,而下电再上电后板子无反应,分析排查去掉了这个非系统延时后工作正常. 二.使用环境1)开发环境使用的是MDK5.20,下载器为JLINK:2)软件工程是V6的FreeRTOS模板工程,SD卡驱动也是V6的,非系统延时函数所在文件为V6的 bsp_dwt.c:3)

用户权限及系统延时及定时机制

#####用户权限列表#############1.权限列表的定义######制定特殊用户对某个文件有特殊权限的记录表格######2.权限列表的识别######权限位有+ 权限列表中开启权限位是.,表示权限尚未开启######3.权限列表的查看######getfacl file##file:file          ##文件名称##owner:root         ##文件所有人##group:root         ##文件所有组#user::rw-            ##文件

FreeRTOS高级篇9---FreeRTOS系统延时

FreeRTOS提供了两个系统延时函数:相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil().相对延时是指每次延时都是从任务执行函数vTaskDelay()开始,延时指定的时间结束:绝对延时是指每隔指定的时间,执行一次调用vTaskDelayUntil()函数的任务.换句话说:任务以固定的频率执行.在<FreeRTOS系列第11篇---FreeRTOS任务控制>一文中,已经介绍了这两个API函数的原型和用法,本文将分析这两个函数的实现原理. 1. 相对延时函数v

linux中系统延时任务及定时任务

1.系统延时任务如遇到这种情况Can't open /var/run/atd.pid to signal atd. No atd running?则执行重启服务 1 at at 固定的时间at now+1min(一分钟之后执行)touch file1 建立文件1ctrl d 开启任务at -l 查看延时任务列表at -c 任务号 (查看任务内容)at -r 任务号 (删除任务)12任务已被删除 当延时任务有输出时候,并不是输出在终端上,而是以邮件的形式发送给任务的发起者 邮件的存放位置/var/

系统延时任务及定时任务

at ---> 系统延时任务at -l ---> 查看任务列表at -c 任务号 ---> 查看任务内容at -r 任务号 ---> 取消任务执行 touch /mnt/file{1..6}at 19:41 ---> 设定任务执行时间at> rm -f /mnt/file{1..4} ---> 任务动作 at> <EOT> ---> 用ctrl+d发起任务查看任务列表查看任务内容取消任务执行查看无任务 at now+1min --->

Linux 系统延时任务和定时任务

一.延时任务   在Linux中延时任务是临时的,可以指定某一个任务在将来的特定时间运行 1.at命令 基本操作格式: [[email protected] ~]# at now+1min at> date<EOT>   #EOT代表Ctrl+D来保存这个延时动作 job 2 at 2017-07-29 12:12 at -l|atq  这两个命令都是用来查看当前的延时任务 atrm | at -d +任务号   这个命令都是用来取消定时任务 at -c +任务号  查看延时任务的内容

系统延时优化1

前言:感谢您浏览该博客文章,如有任何的疑问或者意见,欢迎通过邮件进行交流,同时也提供linux相关技术的支持.本人是Linux的布道者.邮箱:[email protected] 问题: 金融期货系统的延时优化方案 初步思路: 内核裁剪 对于内核模块的加载 内核优化 对于实时性的响应 内存管理 对于高负载情况下的,内存管理机制 网络优化 对于PING的实际性能延时的分析报告

系统延时与定时任务

一.延时任务   在Linux中延时任务是临时的,可以指定某一个任务在将来的特定时间运行 1.at命令  基本操作格式: 1 2 3 [[email protected] ~]# at now+1min at> date<EOT>   #EOT代表Ctrl+D来保存这个延时动作 job 2 at 2017-07-29 12:12 at -l|atq  这两个命令都是用来查看当前的延时任务 atrm | at -d +任务号   这个命令都是用来取消定时任务 at -c +任务号  查看延

《Linux菜鸟入门2》系统定时延时任务

第三单元   系统延时及定时机制 1.at延时 at time at> 动作 at>ctrl +d at> <EOT> at -l atrm 任务号 当执行动作有输出时 输出内容会以邮件的形式发送给任务的发起人 at用户的黑白名单 /etc/at.deny        ##默认存在并生效 /etc/at.allow        ##默认不存在.一旦存在,/etc/at.deny失效 ####2.定期任务 命令方式发起: crontab -u username -e mm