使用DWT来实现系统延时
来源:互联网 发布:java多级菜单 编辑:程序博客网 时间:2024/05/21 09:32
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其它外设资源的延时函数就实现了。
1 1
- 使用DWT来实现系统延时
- DWT
- stm32f4使用Systick实现延时
- 系统延时
- 【PHP】PHP实现简单的setTimeOut来完成异步延时
- STM32 使用通用计时器实现微秒延时
- STM32 使用通用计时器实现微秒延时
- STM32 使用通用计时器实现微秒延时
- 使用延时策略实现弹性滑动
- android使用延时策略实现弹性滑动
- STM32使用systick实现精确延时
- Flex3学习轨迹:使用ToolTipManager来设置延时提示
- 使用Spring中的IoC功能来实现系统的国际化
- 不使用系统API来实现互斥保护功能
- 使用BINFS实现multi-bin来节省系统内存
- 使用java代码来实现dvd管理系统
- 数字水印学习系统之三 DWT操作
- STM32 systick做为系统时间使用(非简单延时)
- centos install rtl8188CUS wlan driver
- linux修改root密码(系统版本Centos 5.8)
- GUI 1 - Introduction
- 通信系统中为什么要进行编码和解码?常见的编码方法有哪些?
- linux下64位汇编的系统调用(2)
- 使用DWT来实现系统延时
- Maximum Gap --LeetCode
- 《Orange's 一个操作系统的实现》学习笔记--特权级代码段之间的转移(四)
- [pyhton]python cookbook学习笔记
- 【Java学习笔记】Comparable接口的实现和使用
- 50个C/C++面试题
- Spring的refresh()方法相关异常
- CocoaPod安装第三方库
- 二路归并排序