STM32 M7内核芯片【F7/H7】 DWT作延时功能的奇怪现象

14 篇文章 7 订阅

有读过关于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核心板测的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值