请教下使用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);
}
a.先使能DWT外设,由内核调试寄存器DEM_CR的位24控制,写1使能。
b.使能CYCCNT寄存器之前,要先清0。
c.使能CYCCNT寄存器,由DWT_CTRL的位0控制,写1使能。
http://www.cnblogs.com/qiufengmuye/p/7899840.html 馒头弟 发表于 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; hpdell 发表于 2018-9-29 15:28
终于搞定了,f7内核的需要如下方法就可以了
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
恭喜楼主 馒头弟 发表于 2018-9-29 17:02
恭喜楼主
:handshake
页:
[1]