xieyuanfu 发表于 2018-5-29 11:54:51

stm32F767 使用DWT一点问题

tm32F767 使用DWT 来设计延时函数,程序如下 初始化,但是 我只有在使用jlink调试器的时候才起作用。 关机 ,拿掉jlink 重新启动的话 ,dwt不计数 了 。就是说 才调试情况下 ,这dwt才工作 。(这个程序在M4内核的429上运行时正常的)我怀疑过M4
内核可能和M7内核的寄存器位置不一样,查了 头文件,还有ARMV7-M Architecture Reference Manual。 看寄存器的地址什么的都是一样的。
但是就是不行这个在429上面运行就没啥问题。。。。。。有谁用过的吗?指教一下谢谢

#defineDWT_CYCCNT*((volatile unsigned int *)0xE0001004)
#defineDWT_CR      *((volatile unsigned int *)0xE0001000)
#defineDEM_CR      *((volatile unsigned int *)0xE000EDFC)
#defineDBGMCU_CR   *((volatile unsigned int *)0xE0042004)
#defineITM_LAR   *((volatile unsigned int *)0xE0000FB0)
#defineDEM_CR_TRCENA               (1 << 24)
#defineDWT_CR_CYCCNTENA            (1 <<0)

//dwt 初始化函数
void bsp_DWT_Init(void)
{
      //ITM_LAR         = 0xC5ACCE55;
      DEM_CR         |= (unsigned int)DEM_CR_TRCENA;   /* Enable Cortex-M4's DWT CYCCNT reg.*/
      //ITM_LAR         = 0xC5ACCE55;
      DWT_CYCCNT      = (unsigned int)0u;
      DWT_CR         |= (unsigned int)DWT_CR_CYCCNTENA;
}// 延时函数
void bsp_DWT_DelayUS(uint32_t _ulDelayTime)
{
    uint32_t tCnt, tDelayCnt;
        uint32_t tStart;
               
        tStart = DWT_CYCCNT;                                    
        tCnt = 0;
        tDelayCnt = _ulDelayTime * (SystemCoreClock / 1000000);                             

        while(tCnt < tDelayCnt)
        {
                tCnt = DWT_CYCCNT - tStart;        
        }
}


wolfgang2015 发表于 2018-6-29 10:54:15

本帖最后由 wolfgang2015 于 2018-6-29 10:55 编辑

    a.先使能DWT外设,由内核调试寄存器DEM_CR的位24控制,写1使能。
    b.使能CYCCNT寄存器之前,先清0。
    c.使能CYCCNT寄存器,由DWT_CTRL的位0控制,写1使能。

1、看看相关RCC是否初始化。
2、先看看能否正常Get ,代码如下,跟你的代码区别在 uint32_t 和 volatile unsigned int 定义上。看看是否为类型定义的差别。
//寄存器基地址
#define    DWT_CR    *(uint32_t*)0xE0001000
#define    DWT_CYCCNT    *(uint32_t*)0xE0001004
#define    DEM_CR    *(uint32_t*)0xE000EDFC

//定义需使能位
#define    DEM_CR_TRCENA    (1<<24)
#define    DWT_CR_CYCCNTENA    (1<<0)

//DWT init
void DWT_init(void)
{
    DEM_CR |= (uint32_t)DEM_CR_TRCENA;
    DWT_CYCCNT = (uint32_t)0u;
    DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;
}
//get DWT count
uint32_t DWT_TS_GET(void)
{
    return((uint32_t)DWT_CYCCNT);
}

50031185 发表于 2018-6-30 23:01:20

调试和 离线运行 明显的的区别就是 RCC 初始化部分了,
为啥不用CubeMx 生成一个拿来用呢?

misakamm20001 发表于 2018-9-5 22:04:30

这个问题最后解决了吗我也碰到了

hpdell 发表于 2018-9-18 15:16:58

你好,请问在 f7 上能够正常运行了吗 ??

hpdell 发表于 2018-9-19 11:30:04

misakamm20001 发表于 2018-9-5 22:04
这个问题最后解决了吗我也碰到了

你好,请问你的解决了没有啊 ?

我也遇到同样的问题了
页: [1]
查看完整版本: stm32F767 使用DWT一点问题