本帖最后由 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); } |
b.使能CYCCNT寄存器之前,要先清0。
c.使能CYCCNT寄存器,由DWT_CTRL的位0控制,写1使能。
http://www.cnblogs.com/qiufengmuye/p/7899840.html
评分
查看全部评分
终于搞定了,f7内核的需要如下方法就可以了
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->LAR = 0xC5ACCE55; // unlock (CM7) 关键是这个,必须得解锁,否则启动位写入失败
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
评分
查看全部评分
恭喜楼主