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

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

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

0 L3 E/ a0 ~. {  [! b时间是很精确' g- H  @- o4 }1 [+ p
还能省掉一个定时器和对应的中断( M8 y- w: a1 B' D4 f8 t
美滋滋0 G. o& ]+ a! L/ F1 q& u. \, m
% q( r3 z% [9 D8 p
但是很奇怪的现象是
8 L( I( s: v6 U) `0 r6 J" u2 O" ~4 G  m9 Q8 G; M, d; e5 y% X5 ]
F7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象  @4 N3 ^" o) f$ Q6 d
我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故# l# G! H3 p" z( F( p
  I8 A1 O, Q% Z8 e5 h
但是很有意思的是
6 h% s2 b7 Z5 z' y) C4 t) F: d( `在M4内核的芯片上同样的程序却没有这个现象- }. b1 A+ j! J) u( b
能够正常的工作0 m, {" T. c, n' X, p

) D; R0 M! B) y2 o有看到这位弟兄的文章
" d( v8 }, a7 f1 v2 Z: \9 ~; g我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的/ H1 H) @+ U& N. O! n( P
- r1 o1 E* }8 t$ I
  1. /*0 d8 ?2 l+ }# }$ p
  2. *********************************************************************************************************
    , K: a8 w8 f# T' K- ~( T. H- r
  3. *, B4 F* P- y( @& h* q
  4. *                               CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS
    5 G* v; `2 A% q( y7 O: ?0 l
  5. *! S" H3 f5 r( E  I4 S* Z9 u9 b& n
  6. *                                            ARM-CORTEX-M7
    / d4 G) ]3 w6 ]; i" r
  7. *0 u+ c4 x! R0 `' [
  8. * Filename : bsp_cpu.c4 `3 O$ z9 j- d/ V  {1 q/ }6 L
  9. *********************************************************************************************************
    0 B7 r" T+ e( i' u' \9 b, K
  10. */, G8 z( `2 j+ B
  11. / `) o+ R8 `* M9 T* H% o

  12. ( j4 z8 ?# Z, C7 v4 O
  13. /*
    6 D  e" R$ z9 }1 B9 L/ _% w0 m
  14. *********************************************************************************************************
    1 Z) E4 x: X7 k7 X- U2 o
  15. *                                            INCLUDE FILES0 o3 ?. Q/ u4 I
  16. *********************************************************************************************************! ]" a! f' T8 V9 i/ g- H
  17. */
    . A$ g4 G. q2 c8 Q( a4 A' `# c
  18. 5 N1 V& n" `9 t
  19. #define    CPU_BSP_MODULE
    2 {* a2 g# C. K" d$ {
  20. #include  <cpu_core.h>1 _/ U5 S9 j% J: \
  21. #include  "bsp_clk.h"
    0 z, d, g% x  ^0 z9 j; n' Q5 F6 {

  22. 7 [) A5 H2 h& J' N: S
  23. ' @# d  H% c5 S. M
  24. /*5 t7 I* _6 A/ m
  25. *********************************************************************************************************
      Y# d. Z( R. W6 F
  26. *                                            LOCAL DEFINES
    ) ~! s: c* z' s. D0 P
  27. *********************************************************************************************************
    2 ^) u/ c0 d" G, h
  28. */9 @3 O: V+ |' f3 A2 x: j

  29. : [* f9 `! _: L: [/ c: v& i& t
  30. #define  CPU_BSP_REG_DEMCR             (*(CPU_REG32 *)(0xE000EDFCu))8 I. k7 ?# v5 r4 a1 A6 |' a% X
  31. #define  CPU_BSP_REG_DWT_CR            (*(CPU_REG32 *)(0xE0001000u))9 R" z( s6 A- m1 D; P/ ?+ k+ H
  32. #define  CPU_BSP_REG_DWT_CYCCNT        (*(CPU_REG32 *)(0xE0001004u))
    : c3 ?2 ?0 @' P4 L
  33. #define  CPU_BSP_REG_DWT_LAR           (*(CPU_REG32 *)(0xE0001FB0u))# c- K7 n0 ]+ w4 A9 o, t, H% C
  34. #define  CPU_BSP_REG_DWT_LSR           (*(CPU_REG32 *)(0xE0001FB4u))* W, ^! A# n& x- e1 F4 c: x& P* A7 U
  35. & q9 B" _" _% Q2 W. w' N
  36. #define  CPU_BSP_BIT_DWT_LSR_SLK        DEF_BIT_015 E4 L% R$ f5 w( D
  37. #define  CPU_BSP_BIT_DWT_LSR_SLI        DEF_BIT_00
    ; T% r: k: p% W; f
  38. + @& k8 d/ o2 [
  39. #define  CPU_BSP_DWT_LAR_KEY            0xC5ACCE55u/ f* G, `. Z8 P! P$ ]

  40. 7 D2 T" C0 G  E# q
  41. //省略一部分无关的代码0 G6 c3 K, U6 c0 E1 {) d1 W1 N

  42. 2 \- Q* {7 Q& {
  43. //DWT定时器初始化) h" t' y4 `. [  g* t# x4 \# r
  44. void  CPU_TS_TmrInit (void)7 n' K6 X2 n* |, N! h8 u0 V+ O
  45. {
    0 e- T, ]  d3 g" H$ z% i; x
  46.     CPU_INT32U  fclk_freq;
    $ q9 d& x) M0 {4 O. C
  47.     CPU_INT32U  reg_val;4 E3 g0 j- t/ T: d- b
  48. . z1 M% r* o0 G/ R" m  ?
  49.                                                                 /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */
    6 ]3 U6 K+ t5 Y, [& P8 Q7 W7 m( L
  50.     reg_val = CPU_BSP_REG_DWT_LSR;                              /* Read lock status register.                           */3 @" b1 ?# Z! w" q! K
  51.     if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) {             /* Check if Software lock control mechanism exits       */
    . X( K. b. A) L# O" S
  52.         if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) {         /* Check if DWT access needs to be unlocked             */- B8 C3 e1 s7 [9 M; A
  53.             CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY;          /* Unlock DWT write access.                             */
    0 C; V2 l! H+ O2 }7 n' @
  54.         }. k6 ]4 f- f! f& b  w
  55.     }
    5 n1 G& U  |% D* ?4 n' m
  56. 5 S- ]! ~9 n* ?7 Q4 c0 S3 K. D
  57.     fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);& C3 ~% S1 F5 f
  58. 4 g* C' w9 V7 L3 W! p4 K. T# |
  59.     CPU_BSP_REG_DEMCR  |= DEF_BIT_24;                           /* Set DEM_CR_TRCENA                                    */
    5 v3 z+ r* ^% C( k
  60.     CPU_BSP_REG_DWT_CR |= DEF_BIT_00;                           /* Set DWT_CR_CYCCNTENA                                 */
    ! t' [9 K8 g# o7 p3 Q
  61. # ]9 R  w* X7 U/ O
  62.     CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);4 t2 j- v5 F0 G1 m, W" i4 L
  63. }# n! H0 y' q* \/ }
复制代码

5 s; v, L( @5 h/ dUCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作( l  b1 F1 l+ X) h( K8 j2 m& i
这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样
; {. X- d( z2 d' M
: q; [0 w% r% U: o' g8 V$ ^
  1. void dwt_init(uint32_t clk)
    2 Z7 y, Q, W# }4 v% r5 S
  2. {3 `) J) c6 g  I
  3.     cpuclkfeq = clk;
    * c- ]& s$ R1 @' J7 Z* Q! R
  4.     DWT_LAR        |= DWT_LAR_UNLOCK;
    0 a9 K0 P+ i" E! w- |
  5.     DEM_CR         |= (uint32_t)DEM_CR_TRCENA;6 S! q+ T, e2 w$ h5 k- |' y6 C2 s
  6.     DWT_CYCCNT      = (uint32_t)0u;
    ) J% U+ q# q; h& Q
  7.     DWT_CR         |= (uint32_t)DWT_CR_CYCCNTENA;
      r; V4 G5 G+ G# A  L9 I
  8. }
复制代码
! u' [. C( V; {8 N
我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题
' _1 S( j& Q+ P. c我有点怀疑是不是那个软件读取要不要解锁的操作的影响。1 ]9 W/ x! P! m4 {3 S/ a
卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来
* P8 g1 n2 I  ?$ n我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的# c; P, |+ y; ]) p5 A9 b4 n

9 m' Q+ b5 W  A1 e( F0 H
+ x, q+ P" Q2 S" x: P
赞 收藏 评论0 发布时间:2021-12-14 10:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版