• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

DWT在哪个文档有详细讲解?

Spirit 2018-11-20 浏览量:1036

DWT是Cortex-M3内核的“数据观察点及跟踪”部件

见到有人用它做uS级的定时器

想详细了解,但不知道在哪个文档有对它及其相关寄存器的讲解。

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 这个代码可以试试啊


    #define  DWT_CR      *(volatile u32 *)0xE0001000

    #define  DWT_CYCCNT  *(volatile u32 *)0xE0001004

    #define  DEM_CR      *(volatile u32 *)0xE000EDFC

    #define  DEM_CR_TRCENA                   (1 << 24)

    #define  DWT_CR_CYCCNTENA                (1 <<  0)




    #define Delayms(msec)         Delayus(msec*1000)  //对于延时毫秒级的只需要定义一个宏
     
    static u32 cpuclkfeq;     //用于保存cpu运行频率,可运行时动态修改


     
    //初始化延时系统,参数为CPU频率

    void DelayInit(u32 clk)
    {

        cpuclkfeq = clk;
    //打开CYCCNT功能并把计数器清零,最后打开计数器对cpu时钟进行向上计数

        DEM_CR         |=  DEM_CR_TRCENA;

    //    DWT_CYCCNT      = 0u;    //根据需要如果调试,或其他程序要使用CYCCNT时注释掉,否则可直接清零

        DWT_CR         |= DWT_CR_CYCCNTENA;

    }


     
     //延时函数,参数为需要延时的微秒数
    void Delayus(u32 usec)

    {

         u32 starttsendtsts;

      //保存进入函数时的计数器值

         startts = DWT_CYCCNT;

         ts =  usec * (cpuclkfeq /(1000*1000) );        //计算达到所需延时值的cpu时钟数^-^如果想要更精确此处可以减去运行前面代码所需的时钟数。

         endts = startts + ts;           //计算达到所需延时时间的DWT_CYCCNT计数值,超过32bit所能表达的最大值2的32次方-1是自动绕回丢弃进位

          if(endts > startts)            //判断是否跨越最大值边界

          {

              while(DWT_CYCCNT < endts);        //等到计数到所需延时值的cpu时钟数值

           }

           else

          {

               while(DWT_CYCCNT > endts);       //等待跨域32bit的最大值,2的32次方-1

               while(DWT_CYCCNT < endts);        //等到计数到所需延时值的cpu时钟数值

          }



    }


    • 发布于 2018-12-18
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:1
  • 参考M3内核指南,里面有详细的介绍
    • 发布于2018-12-28
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

DWT在哪个文档有详细讲解?