有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章
时间是很精确
还能省掉一个定时器和对应的中断
美滋滋
但是很奇怪的现象是
F7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象
我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故
但是很有意思的是
在M4内核的芯片上同样的程序却没有这个现象
能够正常的工作
目前暂时还没有找到关于这个问题的解释
20-9-13
有看到这位弟兄的文章
我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的
/*
*********************************************************************************************************
*
* CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS
*
* ARM-CORTEX-M7
*
* Filename : bsp_cpu.c
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#define CPU_BSP_MODULE
#include <cpu_core.h>
#include "bsp_clk.h"
/*
*********************************************************************************************************
* LOCAL DEFINES
*********************************************************************************************************
*/
#define CPU_BSP_REG_DEMCR (*(CPU_REG32 *)(0xE000EDFCu))
#define CPU_BSP_REG_DWT_CR (*(CPU_REG32 *)(0xE0001000u))
#define CPU_BSP_REG_DWT_CYCCNT (*(CPU_REG32 *)(0xE0001004u))
#define CPU_BSP_REG_DWT_LAR (*(CPU_REG32 *)(0xE0001FB0u))
#define CPU_BSP_REG_DWT_LSR (*(CPU_REG32 *)(0xE0001FB4u))
#define CPU_BSP_BIT_DWT_LSR_SLK DEF_BIT_01
#define CPU_BSP_BIT_DWT_LSR_SLI DEF_BIT_00
#define CPU_BSP_DWT_LAR_KEY 0xC5ACCE55u
//省略一部分无关的代码
//DWT定时器初始化
void CPU_TS_TmrInit (void)
{
CPU_INT32U fclk_freq;
CPU_INT32U reg_val;
/* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */
reg_val = CPU_BSP_REG_DWT_LSR; /* Read lock status register. */
if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) { /* Check if Software lock control mechanism exits */
if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) { /* Check if DWT access needs to be unlocked */
CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY; /* Unlock DWT write access. */
}
}
fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);
CPU_BSP_REG_DEMCR |= DEF_BIT_24; /* Set DEM_CR_TRCENA */
CPU_BSP_REG_DWT_CR |= DEF_BIT_00; /* Set DWT_CR_CYCCNTENA */
CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
}
UCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作
这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样
void dwt_init(uint32_t clk)
{
cpuclkfeq = clk;
DWT_LAR |= DWT_LAR_UNLOCK;
DEM_CR |= (uint32_t)DEM_CR_TRCENA;
DWT_CYCCNT = (uint32_t)0u;
DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;
}
我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题
我有点怀疑是不是那个软件读取要不要解锁的操作的影响。
卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来
我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的