你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
STMCU小助手 发布时间:2021-12-14 10:35
有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章

时间是很精确
还能省掉一个定时器和对应的中断
美滋滋

但是很奇怪的现象是

F7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象
我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故

但是很有意思的是
在M4内核的芯片上同样的程序却没有这个现象
能够正常的工作

有看到这位弟兄的文章
我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的

  1. /*
  2. *********************************************************************************************************
  3. *
  4. *                               CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS
  5. *
  6. *                                            ARM-CORTEX-M7
  7. *
  8. * Filename : bsp_cpu.c
  9. *********************************************************************************************************
  10. */


  11. /*
  12. *********************************************************************************************************
  13. *                                            INCLUDE FILES
  14. *********************************************************************************************************
  15. */

  16. #define    CPU_BSP_MODULE
  17. #include  <cpu_core.h>
  18. #include  "bsp_clk.h"


  19. /*
  20. *********************************************************************************************************
  21. *                                            LOCAL DEFINES
  22. *********************************************************************************************************
  23. */

  24. #define  CPU_BSP_REG_DEMCR             (*(CPU_REG32 *)(0xE000EDFCu))
  25. #define  CPU_BSP_REG_DWT_CR            (*(CPU_REG32 *)(0xE0001000u))
  26. #define  CPU_BSP_REG_DWT_CYCCNT        (*(CPU_REG32 *)(0xE0001004u))
  27. #define  CPU_BSP_REG_DWT_LAR           (*(CPU_REG32 *)(0xE0001FB0u))
  28. #define  CPU_BSP_REG_DWT_LSR           (*(CPU_REG32 *)(0xE0001FB4u))

  29. #define  CPU_BSP_BIT_DWT_LSR_SLK        DEF_BIT_01
  30. #define  CPU_BSP_BIT_DWT_LSR_SLI        DEF_BIT_00

  31. #define  CPU_BSP_DWT_LAR_KEY            0xC5ACCE55u

  32. //省略一部分无关的代码

  33. //DWT定时器初始化
  34. void  CPU_TS_TmrInit (void)
  35. {
  36.     CPU_INT32U  fclk_freq;
  37.     CPU_INT32U  reg_val;

  38.                                                                 /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */
  39.     reg_val = CPU_BSP_REG_DWT_LSR;                              /* Read lock status register.                           */
  40.     if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) {             /* Check if Software lock control mechanism exits       */
  41.         if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) {         /* Check if DWT access needs to be unlocked             */
  42.             CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY;          /* Unlock DWT write access.                             */
  43.         }
  44.     }

  45.     fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);

  46.     CPU_BSP_REG_DEMCR  |= DEF_BIT_24;                           /* Set DEM_CR_TRCENA                                    */
  47.     CPU_BSP_REG_DWT_CR |= DEF_BIT_00;                           /* Set DWT_CR_CYCCNTENA                                 */

  48.     CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
  49. }
复制代码

UCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作
这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样

  1. void dwt_init(uint32_t clk)
  2. {
  3.     cpuclkfeq = clk;
  4.     DWT_LAR        |= DWT_LAR_UNLOCK;
  5.     DEM_CR         |= (uint32_t)DEM_CR_TRCENA;
  6.     DWT_CYCCNT      = (uint32_t)0u;
  7.     DWT_CR         |= (uint32_t)DWT_CR_CYCCNTENA;
  8. }
复制代码

我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题
我有点怀疑是不是那个软件读取要不要解锁的操作的影响。
卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来
我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的


收藏 评论0 发布时间:2021-12-14 10:35

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版