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

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

[复制链接]
STMCU小助手 发布时间:2021-12-14 10:35
有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章
! t' P: v. R$ t: f8 q0 f
8 I6 a# `6 M$ _0 |, y& ^时间是很精确5 V  o3 e0 \# }- L) H
还能省掉一个定时器和对应的中断- X- Y$ L5 P! Q7 \6 l- r  _
美滋滋# U: K" \  S' g* V' P8 N
- H6 M$ m1 T6 ?8 n+ H
但是很奇怪的现象是
$ |0 s& U  a2 f4 x
; k. I# {8 O: u5 s# E; RF7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象: n) K  i6 _/ l
我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故  e" `* d# S( s. F, o
1 Y( p  {& J5 C) l5 a+ z
但是很有意思的是$ r$ m5 F( c0 C6 H* l- d
在M4内核的芯片上同样的程序却没有这个现象1 v( L2 S- J. P9 I4 K4 D0 z4 n
能够正常的工作
3 k- T8 a5 o# z' z# q5 T' O+ W5 Q5 G  K' g9 |, s  O! b
有看到这位弟兄的文章; C: D  F& c& Z' W
我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的4 r  k- L( m6 L1 T1 w" H% J
" X! Y- c: M. ]% c* `+ _. w- j/ l
  1. /*2 F% E' Z+ P- m3 o8 U0 t, h
  2. *********************************************************************************************************% P  q- P! ~7 V9 r/ K4 O
  3. *
    7 F) r$ X; E7 j+ ^1 Y. K3 j! j
  4. *                               CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS
    & U) A" h* q8 R: B
  5. *
    ! n: e7 _2 B8 ?
  6. *                                            ARM-CORTEX-M74 d7 L. @$ e% X$ y9 ^; `
  7. *2 ~6 j  i$ g, p; x& y
  8. * Filename : bsp_cpu.c8 H, P, Z+ P5 c- g) S( [% x( u4 B9 S
  9. *********************************************************************************************************5 h! d1 A) N/ n. T. i
  10. *// }- U! V. u7 E' i# ?1 l

  11. % g! y# G/ u; E
  12.   T( A' f% h0 J. l+ m/ T5 z
  13. /*
    - t# V) d+ u# K7 e. c
  14. *********************************************************************************************************
    9 c( f4 r/ B  \6 F( }
  15. *                                            INCLUDE FILES
    : a9 u  q0 N3 `1 |" v& B* n5 T
  16. *********************************************************************************************************
    2 ^; s( Z& M" D# i6 D9 `6 O1 `
  17. */
    & V$ ^% Y+ f* a% n
  18. 0 K& l" S" ?% d* _: E
  19. #define    CPU_BSP_MODULE1 A7 R& _6 _: W; v
  20. #include  <cpu_core.h>5 A. D2 U% y& E
  21. #include  "bsp_clk.h"! h. \) s' r* B# P, X
  22. * [* Z8 R- f( R1 k5 g; O
  23. " l& q+ c5 y1 r# d
  24. /*3 k4 I$ R" z# x; b0 y
  25. *********************************************************************************************************8 o9 O9 ^0 T: |/ B3 ]+ U9 K
  26. *                                            LOCAL DEFINES- _2 H" E9 i9 D: \& s: v( Y2 |
  27. *********************************************************************************************************! e" w( s) K& u& _7 @, o- A4 U( b7 H; P
  28. */
    1 s& o. W+ d" }7 P

  29. 0 }, D& M" {- a* ?( o' h0 K
  30. #define  CPU_BSP_REG_DEMCR             (*(CPU_REG32 *)(0xE000EDFCu))" n2 G; Z- {9 p1 k6 A! ]: p( o: D
  31. #define  CPU_BSP_REG_DWT_CR            (*(CPU_REG32 *)(0xE0001000u))
    : Q1 Z8 A  A( u9 g5 F* V
  32. #define  CPU_BSP_REG_DWT_CYCCNT        (*(CPU_REG32 *)(0xE0001004u))+ x0 L/ y' s0 {6 w# C8 t8 [/ s% b
  33. #define  CPU_BSP_REG_DWT_LAR           (*(CPU_REG32 *)(0xE0001FB0u))
    ! Q6 Z2 }) E; E
  34. #define  CPU_BSP_REG_DWT_LSR           (*(CPU_REG32 *)(0xE0001FB4u))6 H6 w8 J! h/ t9 D- o
  35. 7 b% h* u4 t& y( F8 ~) {* e
  36. #define  CPU_BSP_BIT_DWT_LSR_SLK        DEF_BIT_01
    7 ]* n. k5 s0 U! I2 a) n
  37. #define  CPU_BSP_BIT_DWT_LSR_SLI        DEF_BIT_00
    / U2 z& U0 K5 l5 k+ {& G8 V

  38. + I8 ~5 e+ g4 b) X, c
  39. #define  CPU_BSP_DWT_LAR_KEY            0xC5ACCE55u' U" e* B9 e, ^4 K5 s; |/ @

  40. 3 T# Y1 G. H# a4 d" C) Q! H
  41. //省略一部分无关的代码) m5 R2 f& I+ ]% _  }! j: @
  42. " V  A) b! r" J9 b) S+ y3 i" ~
  43. //DWT定时器初始化
    2 A" ^& q3 r1 R; |8 Y1 i- m. a
  44. void  CPU_TS_TmrInit (void)! A; j& Z- N( k4 @8 X8 M  }9 Z
  45. {5 ^6 B; {0 b1 _# \0 G; E* b
  46.     CPU_INT32U  fclk_freq;
    + E6 ^/ ], w8 _# T
  47.     CPU_INT32U  reg_val;  L5 a  x, }& P

  48. 3 C; H! {- t! R7 X7 B+ n' Y
  49.                                                                 /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */* Q$ S% B: B' E
  50.     reg_val = CPU_BSP_REG_DWT_LSR;                              /* Read lock status register.                           */
    & s# v5 r9 H4 _3 n( G, |& e, f
  51.     if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) {             /* Check if Software lock control mechanism exits       */
      W+ T% F$ E& X
  52.         if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) {         /* Check if DWT access needs to be unlocked             */- K5 a8 [3 `; i: e" t' d  [
  53.             CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY;          /* Unlock DWT write access.                             */8 ~( g  {% E& B: R
  54.         }
    # |- a7 \0 T4 ^/ P& Y/ ^2 @' `4 c
  55.     }5 C* v5 _$ D; n' M! ?

  56. 1 F5 _: S% M9 D* S7 I. q$ R
  57.     fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);
    9 ]: U* H% `% B4 X6 e6 S( F

  58. ! j# `9 _5 G* K, H6 d4 Z
  59.     CPU_BSP_REG_DEMCR  |= DEF_BIT_24;                           /* Set DEM_CR_TRCENA                                    */$ t; o5 L+ q: T) t6 Q: u$ k' B2 A: B
  60.     CPU_BSP_REG_DWT_CR |= DEF_BIT_00;                           /* Set DWT_CR_CYCCNTENA                                 */
    : q! l: J$ W( n6 y) `

  61. * n0 i9 Y# n) k( {5 w
  62.     CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
      z0 J/ e' u5 h# X% J2 k' a, `
  63. }
    7 T' ?! t' S& f$ T% p8 ?: o- J2 q
复制代码

- r' g; I0 p6 T/ |; fUCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作3 D5 R/ D' w5 S) y: e( a
这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样
2 ]6 v+ I- I4 \+ D" v0 }5 ]0 f/ k3 }% P
  1. void dwt_init(uint32_t clk)  e$ X" a) `0 T; _/ k% g
  2. {2 W, d0 `1 v. Z4 ]  D$ p( N- M
  3.     cpuclkfeq = clk;
    7 F/ r9 F8 W1 o2 n
  4.     DWT_LAR        |= DWT_LAR_UNLOCK;( R* j. ^- \& n1 N* f
  5.     DEM_CR         |= (uint32_t)DEM_CR_TRCENA;
    - m" t3 y1 F5 h- E0 |  _8 ]
  6.     DWT_CYCCNT      = (uint32_t)0u;
    0 \0 k: K/ c0 g
  7.     DWT_CR         |= (uint32_t)DWT_CR_CYCCNTENA;( }& ~8 C, N7 U! p$ R
  8. }
复制代码

( \( [. {& y1 ?  u* L  Y我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题
- e- n% a! D( q我有点怀疑是不是那个软件读取要不要解锁的操作的影响。: B0 P: p7 K' O2 K7 U# R7 t/ i0 ]
卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来/ v1 O/ p' d: X# G
我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的
; d2 I! o  _$ Q6 o) F8 Q, a. |! M* w/ P" V8 N% b( D" e

$ U% ^3 `, L8 u5 E
收藏 评论0 发布时间:2021-12-14 10:35

举报

0个回答

所属标签

相似分享

官网相关资源

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