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

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

[复制链接]
STMCU小助手 发布时间:2021-12-14 10:35
有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章( L: I0 o9 g) |. ?
  ~4 O; S2 Q: S$ w0 k' f
时间是很精确
: t* |3 T) U: J2 o; W还能省掉一个定时器和对应的中断
' Z9 K, s' _1 x+ A6 \% j7 e+ e美滋滋
2 u0 @7 i8 o& V. W! f
' d0 C8 ~$ B5 [% l. E但是很奇怪的现象是6 T% n) j8 V* a* t- V# N% u
$ x( m: j) n' b0 i( t: U# y  y
F7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象
' X; f& y. h5 f  M& r- B9 }我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故9 G. ?4 ]( J& K$ k6 Z7 i. n0 z
: o* j+ _6 S2 ~& u' f7 W, y+ S
但是很有意思的是
- D6 Q' O" G  S4 J# R在M4内核的芯片上同样的程序却没有这个现象
4 |$ P2 p- {3 y: F2 ^能够正常的工作
6 u  N5 b; O3 m5 C5 c. j7 ~9 b
$ V: w! O+ J: V- W7 O有看到这位弟兄的文章
& Q& k4 i$ X2 F  U+ p我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的2 R- b! X' }/ d, q
3 v' c2 p( c% I$ s) Q- H
  1. /*; g0 m* r* W% o
  2. *********************************************************************************************************5 l8 \7 v! ]" f; G& i% c" N
  3. *( F6 O( {& p% v
  4. *                               CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS; C7 q& F- W8 T4 ~, l
  5. *
    1 f' W) B( R2 F/ K( I
  6. *                                            ARM-CORTEX-M7+ K$ w* }. Y# n+ A$ p
  7. *
    . a4 @& O, w2 L/ x9 j
  8. * Filename : bsp_cpu.c6 F+ Y3 m5 w! ]  z
  9. *********************************************************************************************************8 c3 ~7 y* |& _, S- `4 s5 E* M
  10. */# s% \( y( t/ X6 }8 b8 A: D6 Y
  11. 8 F0 D0 Q( k* F/ A5 Z# g/ e& }' v

  12. ) t% D7 ?; G8 M. l+ z. v1 n' x
  13. /*; s" O+ w( e' D1 ~9 p8 M* c" b' B; T
  14. *********************************************************************************************************
    2 R* K9 x. C# o6 ?) k! {. P
  15. *                                            INCLUDE FILES
    6 F, l$ V" U$ I! A! j& ?4 S' m
  16. *********************************************************************************************************$ w: B- h* ]2 u* \. w1 N$ h
  17. */% V; b( U- a, @) A+ w1 O

  18. 0 k2 P5 U7 c% _% M6 I7 t
  19. #define    CPU_BSP_MODULE, @8 l3 M$ n: ~; b. z% W7 n5 T
  20. #include  <cpu_core.h>% B; Z8 j0 G( X# s5 D; j6 Q* R
  21. #include  "bsp_clk.h"& j4 x4 G6 J" L- `/ p9 f

  22. $ c8 @( o9 Y( k" u% [$ ^4 i
  23. 9 ?' M+ a$ _0 ~/ o! q) n
  24. /*
    : R8 ^$ x+ Z0 N: ]9 w+ z
  25. *********************************************************************************************************
    $ Y. r3 i# R7 W3 g! I
  26. *                                            LOCAL DEFINES
    0 f+ o; q  \" k7 Z/ l9 U' T
  27. *********************************************************************************************************# g+ J) |, {  B& [0 E7 v, }
  28. */9 n) g9 V) |, L3 l, W, x4 L0 F# @

  29. 0 F: @& R/ }$ I/ b
  30. #define  CPU_BSP_REG_DEMCR             (*(CPU_REG32 *)(0xE000EDFCu))$ C- ]$ N6 H- e& i9 S
  31. #define  CPU_BSP_REG_DWT_CR            (*(CPU_REG32 *)(0xE0001000u))
    9 q1 |8 T. n- F1 s
  32. #define  CPU_BSP_REG_DWT_CYCCNT        (*(CPU_REG32 *)(0xE0001004u))0 R+ B5 D& L, ?" B- P
  33. #define  CPU_BSP_REG_DWT_LAR           (*(CPU_REG32 *)(0xE0001FB0u))
    0 {3 k& f, Y9 @! R$ x" m
  34. #define  CPU_BSP_REG_DWT_LSR           (*(CPU_REG32 *)(0xE0001FB4u))
    6 ?. I# z/ w! c/ ~/ I
  35. & F( }/ i% r) d$ z7 u: a
  36. #define  CPU_BSP_BIT_DWT_LSR_SLK        DEF_BIT_018 b# O  D! T  d  i0 @
  37. #define  CPU_BSP_BIT_DWT_LSR_SLI        DEF_BIT_00% c" \" T6 ?7 v% }: \. n

  38. ! U. s) \. B1 X3 ~$ t! p
  39. #define  CPU_BSP_DWT_LAR_KEY            0xC5ACCE55u0 K4 U+ A! |+ N6 F
  40. 7 Q/ f  A* ?/ C
  41. //省略一部分无关的代码* V+ f) y, u; }5 h  Q* h' z

  42. : e' h4 |- S) Y9 ]$ a
  43. //DWT定时器初始化
    ' j1 l- k( m$ Y" J0 z; p8 j. t3 ^; B
  44. void  CPU_TS_TmrInit (void)2 [! Y) g2 }& I) f' _# F
  45. {
    8 I) c8 |1 l% M; e' W
  46.     CPU_INT32U  fclk_freq;9 a  h; [& o+ j* E- z2 s" H
  47.     CPU_INT32U  reg_val;% }; b6 B; V8 S  C8 m7 p6 F  D
  48. ; o. D5 _7 `$ Q
  49.                                                                 /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */
    ' F% m; t: n' `$ ^( [2 l
  50.     reg_val = CPU_BSP_REG_DWT_LSR;                              /* Read lock status register.                           */! [% I+ @! N- p) N( k
  51.     if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) {             /* Check if Software lock control mechanism exits       */( d% q( k, f4 ]2 H- f8 I+ t; C0 W
  52.         if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) {         /* Check if DWT access needs to be unlocked             */
    ( b  I, s) G5 E5 W, ~
  53.             CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY;          /* Unlock DWT write access.                             */
    0 n' ?# [4 y* n. O$ X
  54.         }
    3 H3 R6 P9 Z: r) V4 I! b7 A! L: R
  55.     }4 c8 W& v8 ~) _% ?- C8 E" A: g. A
  56. 1 n# Q. V, @2 ?1 p# T8 _5 k6 K
  57.     fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);! Y% o& H0 q* a' y3 i) _! p

  58. ! h7 Y8 X0 d" v
  59.     CPU_BSP_REG_DEMCR  |= DEF_BIT_24;                           /* Set DEM_CR_TRCENA                                    */
    2 p9 P5 `6 M# w: O8 Z
  60.     CPU_BSP_REG_DWT_CR |= DEF_BIT_00;                           /* Set DWT_CR_CYCCNTENA                                 */  l6 @# }* u/ b  S
  61. . e; v9 F" h7 z6 f3 I" x
  62.     CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
    - R, `6 R& E. E. }2 t
  63. }
    1 [/ E7 C* L, r+ E9 `3 ^
复制代码
" H2 T* v2 r/ G( h3 Y% D2 ~/ @
UCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作
8 a# |1 ]  ]* K" _这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样( s) y; H9 A1 K* \$ h& ^8 m: _

3 a7 L* `4 k; }. n
  1. void dwt_init(uint32_t clk): V$ p2 Z+ H6 ?& x) @+ J' r
  2. {  z0 \6 Z/ D" a3 \
  3.     cpuclkfeq = clk;
    1 o/ ]  l2 w% l# k- z1 ]3 ^+ v
  4.     DWT_LAR        |= DWT_LAR_UNLOCK;' N9 p* e: `* R9 M3 W/ y
  5.     DEM_CR         |= (uint32_t)DEM_CR_TRCENA;1 p/ R4 d$ C: j6 E- F; U- g
  6.     DWT_CYCCNT      = (uint32_t)0u;& A$ ^4 @' R+ {/ y) D
  7.     DWT_CR         |= (uint32_t)DWT_CR_CYCCNTENA;8 q! |+ w3 h. Q' V3 ~/ ~- J
  8. }
复制代码

4 n9 h/ m% P: ?" W) O: ]- x/ d我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题' w1 u" y+ q8 U/ f3 `
我有点怀疑是不是那个软件读取要不要解锁的操作的影响。
1 n/ O8 q3 C: x5 r- Q" C卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来7 p$ T7 m' O* G5 }, B
我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的
/ q- e. H% `8 ~: T. t8 M$ O! t2 Y8 D) B. i6 r

) ?2 P: P5 q  o$ C
收藏 评论0 发布时间:2021-12-14 10:35

举报

0个回答

所属标签

相似分享

官网相关资源

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