你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
hpdell 提问时间:2018-9-19 21:31 /
本帖最后由 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;
  /* Enable  clock 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);               
        
        

}

收藏 评论4 发布时间:2018-9-19 21:31

举报

4个回答
馒头弟 回答时间: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

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

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;

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

馒头弟 回答时间: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

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版