用看门狗定时器实现精准延时

 转载来源:技术贴-如何让STM32实现精准NOP延时 (amobbs.com 阿莫电子论坛 - 东莞阿莫电子网站)     

       对于C语音,实现精准的NOP延时不是很容易,延时时间过短时会有较大误差,但是我们可以通过CM3的调试接口获得精确的NOP延时方式。

       首先可以通过读RCC寄存器获得当前系统的时钟值,然后查询DWT寄存器的值之差就能计算出CPU运行时时间,代码如下。

#define  DWT_CR                      *(__IO uint32_t *)0xE0001000
#define  DWT_CYCCNT              *(__IO uint32_t *)0xE0001004
#define  DEM_CR                       *(__IO uint32_t *)0xE000EDFC
#define  DEM_CR_TRCENA          (1 << 24)
#define  DWT_CR_CYCCNTENA   (1 <<  0)

uint32_t uSValue = 0;

void  Nop_Conf(void)
{
    RCC_ClocksTypeDef rcc_clocks;

    RCC_GetClocksFreq(&rcc_clocks);

    uSValue = rcc_clocks.SYSCLK_Frequency / 1000000;  

    DEM_CR |= (uint32_t) DEM_CR_TRCENA;

    DWT_CYCCNT = (uint32_t) 0u;

    DWT_CR |= (uint32_t) DWT_CR_CYCCNTENA;
}

void usNOPDelay(uint16_t usDly)
{
    uint32_t i = DWT_CYCCNT;
    uint32_t j = uSValue * usDly;
    uint32_t k = 0;
    while (k < j)
    {
        k = (DWT_CYCCNT - i);
    }
}
     DWT_CNT 是一个32位的寄存器,CPU运行时每个时钟周期会自加1,调用 usNOPDelay函数时传入参数大小能获得较好的精度。

更正,查找了手册才明白这个寄存器是 Data Watchpoint and Trace Register,是个很好的方式做系统时钟的tick数做微小时间的查询方式延时,感谢!!
付一个arm论坛的帖子做说明
http://community.arm.com/message/5153#5153
http://infocenter.arm.com/help/i ... 0439c/BABJFFGJ.html
http://stackoverflow.com/questio ... ghly-optimized-code
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值