[STM32F1]STM32上的DWT与延时实现

  对于做单片机程序开发来说,定时管理的需求非常普遍,不管是:系统滴答定时器systick计数器延时或者是通过外设定时器timer的向上向下等计数来延时,甚至在精度要求不高的地方还可以通过变量自加判断来延时,这都是一种延时管理实现的方法。但是对于cortex-M3内核来说,还有一个可以延时的方法往往被大家所忽视,就是M3内核跟踪系统:数据观察点与跟踪单元(DWT)。

  而DWT其实原本是为了做为系统调试及跟踪用的,属于DBG部分的功能,它包含了 4 个比较器,可以配置成在发生比较匹配时,执行相关动作,如程序计数器(PC)采样器事件触发、ETM 触发,可以触发 ETM 发出一个数据包,并汇入指令跟踪数据流中等,其中每一个比较器都有 3 个寄存器,COMP 寄存器、MASK 寄存器和FUNCTION 控制寄存器;DWT也可以作为计数器,进行时钟周期(CYCCNT)计数、被折叠(Folded)的指令或者是每指令周期数(CPI)等,另外DWT还可以以固定的周期采样 PC 的值等功能,在Cortex‐M3芯片中,DWT的基地址为:0xE000_1000。

 

  既然DWT可以进行计数,那么他就可以进行延时,原因是因为它有一个32位的一个向上计数的计数器,当它溢出时会自动清零并重新开始向上计数,它的频率是内核的主频,如72Mhz,精度是1/72M= 14ns,那么时钟节拍一次,计数就加一次,这样的精度对于大部分应用延时都是非常高的了。原理弄清楚了,那么如果要实现延时功能,总共用到三个寄存器:DEMCR 、DWT_CTRL、DWT_CYCCNT,他们的地址分别为:0xE000EDFC、0xE0001000、0xE0001004,分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值。

配置方式为:
1、对DEMCR的位24控制,写1使能DWT外设。
2、对于CYCCNT寄存器清0。
3、对DWT控制寄存器的位0控制,写1使能CYCCNT寄存器。
4、通过编写函数获取DWT_CYCCNT的值,并通过判断是否到达新的DWT_CYCCNT值来实现延时。
配置函数:
#define  DEM_CR      *(volatile u32 *)0xE000EDFC

#define  DWT_CR      *(volatile u32 *)0xE0001000

#define  DWT_CYCCNT  *(volatile u32 *)0xE0001004



#define  DEM_CR_TRCENA                   (1 << 24)

#define  DWT_CR_CYCCNTENA                (1 <<  0)



void DelayInit()

{

    DEM_CR  |=  DEM_CR_TRCENA; 

    DWT_CR  |=  DWT_CR_CYCCNTENA;

    DWT_CYCCNT = 0;

}
延时函数:
void Delayus(u32 usec)

{

     u32 start,end,ts;

        

     start = DWT_CYCCNT;

     ts =  usec * (72);      

     end = start + ts;      

     while(DWT_CYCCNT < end){;} 

}

  很多人说,由于DWT是属于M3内核自带的功能,便于在不同M3处理器之间的移植,实际上想相比较普通的外设定时器来说,不管从定时方式还是最长时间上来说,DWT并没有优势,毕竟DWT原本设计不是为了做定时器用的,而且现在的各个厂家的定时器原理基本一样,也不存在着说移植后在定时器的处理上的难度有多大,所以具体要不要用DWT来实现延时功能见仁见智。
---------------------
作者:forgot
链接:https://bbs.21ic.com/icview-3288126-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值