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: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);
}
调试和 离线运行 明显的的区别就是 RCC 初始化部分了,
为啥不用CubeMx 生成一个拿来用呢? 这个问题最后解决了吗我也碰到了 你好,请问在 f7 上能够正常运行了吗 ?? misakamm20001 发表于 2018-9-5 22:04
这个问题最后解决了吗我也碰到了
你好,请问你的解决了没有啊 ?
我也遇到同样的问题了
页:
[1]