hpdell 发表于 2018-9-19 21:31:10

请教下使用f7的芯片dwt作为延时功能不能够正常运行?

本帖最后由 hpdell 于 2018-9-19 21:33 编辑


请教下,使用 stm32f77x 的单片机,把dwt 作为 延时使用

刚开始使用jlink 下载程序可以正常运行,

但是 板子重新开关机启动后,
DWT->CTRL |=DWT_CTRL_CYCCNTENA_Msk;这个启动位写不进去 ,是怎么回事啊 ?

代码如下:
int bsp_InitDWT(void)
{
      uint32_t dwt_reg;
      
      /* Disable TRC */
         CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; // ~0x01000000;
      
      /* Enable TRC */
CoreDebug->DEMCR |=CoreDebug_DEMCR_TRCENA_Msk; // 0x01000000;
      
      /* Disable clock cycle counter */
DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001;
/* Enableclock cycle counter */
DWT->CTRL |=DWT_CTRL_CYCCNTENA_Msk; //0x00000001;
      
      
//      ITM->TCR |= (uint32_t)(ITM_TCR_SYNCENA_Msk | ITM_TCR_DWTENA_Msk | ITM_TCR_TSENA_Msk | ITM_TCR_ITMENA_Msk);
//      ITM->TCR |= (uint32_t)(ITM_TCR_SYNCENA_Msk);
      
      /*DWT 必须配置为触发 ITM:必须将 DWT->CTRL 控制寄存器的位 CYCCNTENA(位 0)置1;
          此外,还必须将 ITM 跟踪控制寄存器的位 2 (SYNCENA) 置 1。
                注: 如果未将 SYNENA 位置 1, DWT 产生给 TPIU 的同步触发,将仅发送 TPIU 同步数据包,
                不发送 ITM 同步数据包
      */
      
      DWT->CYCCNT = (uint32_t)0;   //显示或设置处理器的周期计数值
      
      /*
      当DWT->CTRL的CYCCNTENA位置位后,该寄存器的值与系统周期计数值保持同步,我们可以用它的值来实现一个延时的功能。
      (注意,当CYCCNT计数器溢满后,会复位为0x0,重新开始计数,不停循环)
*/

      
      
      dwt_reg = CoreDebug->DEMCR;
      printf("DEMCR 0x%X\r\n", dwt_reg);
      
      dwt_reg = ITM->TCR;
      printf("ITM->TCR 0x%X\r\n", dwt_reg);      
      
      dwt_reg = DWT->CYCCNT;
      printf("DWT->CYCCNT 0x%X\r\n", dwt_reg);      
      
      dwt_reg = DWT->CTRL;
      printf("DWT->CTRL 0x%X\r\n", dwt_reg);               
      
      

}

馒头弟 发表于 2018-9-28 09:24:02

a.先使能DWT外设,由内核调试寄存器DEM_CR的位24控制,写1使能。
b.使能CYCCNT寄存器之前,要先清0。
c.使能CYCCNT寄存器,由DWT_CTRL的位0控制,写1使能。
http://www.cnblogs.com/qiufengmuye/p/7899840.html

hpdell 发表于 2018-9-29 15:28:16

馒头弟 发表于 2018-9-28 09:24
a.先使能DWT外设,由内核调试寄存器DEM_CR的位24控制,写1使能。
b.使能CYCCNT寄存器之前,要先清0。
c.使 ...

终于搞定了,f7内核的需要如下方法就可以了

        CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
        DWT->LAR = 0xC5ACCE55;// unlock (CM7)                            关键是这个,必须得解锁,否则启动位写入失败
        DWT->CYCCNT = 0;
        DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;

馒头弟 发表于 2018-9-29 17:02:30

hpdell 发表于 2018-9-29 15:28
终于搞定了,f7内核的需要如下方法就可以了

        CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;


恭喜楼主

hpdell 发表于 2018-9-30 10:49:53

馒头弟 发表于 2018-9-29 17:02
恭喜楼主

:handshake
页: [1]
查看完整版本: 请教下使用f7的芯片dwt作为延时功能不能够正常运行?