请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-12-14 10:35
有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章
- V2 G4 R; ^  x6 D4 v" E( J8 ?
时间是很精确
) b6 P6 Z8 g, t4 L  @& r5 W还能省掉一个定时器和对应的中断
) [- a) g* |) Q5 v. n美滋滋
# e4 g5 [. a% H0 u3 e! Z( E9 g) H( O# g1 ?- i) y4 y
但是很奇怪的现象是. v9 f& x9 e' }# W
6 L2 s+ U2 {& T
F7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象8 b" ?, N  j0 [0 n0 h) K
我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故
! O3 n  @$ Q4 V7 o% w/ M# F2 @9 H7 j* x) J. C, |5 r, B
但是很有意思的是
0 i' t1 Z- L7 Q' c在M4内核的芯片上同样的程序却没有这个现象
& E3 T! g2 q! }1 P- ^! J1 Y能够正常的工作/ B8 C% e3 M  y" F

/ w; K1 r& h7 S* z有看到这位弟兄的文章
& O0 n+ A" i% e我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的# }  [1 L4 z" L" N4 Z5 H
9 ~, K3 s! w: M9 F) Z: M
  1. /*
    : ]$ d- P2 W% \5 v6 _; r; k
  2. *********************************************************************************************************1 _1 ]/ O5 W/ b* C8 @
  3. *
    3 h( Q9 V) Z- j+ x5 l1 S! \
  4. *                               CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS  q/ Q3 `4 l/ M4 l9 @3 e/ u
  5. *- ]2 O' H7 ?0 P' ]8 z8 O( o" D
  6. *                                            ARM-CORTEX-M7
    - V, D7 C  I! }3 z% B
  7. *
    # Z8 b/ s6 A3 J$ A
  8. * Filename : bsp_cpu.c# W* }0 Y& z$ r8 B* W
  9. *********************************************************************************************************, C8 e% u) x8 o5 O
  10. */
    % A1 u- A+ U3 g

  11. ; K% n% _" x8 Q$ W  T2 C
  12. * W3 d: S2 }2 i4 |
  13. /*
    6 p" \' ^* d: M: F! g- |
  14. *********************************************************************************************************  ?3 m: {" e: I0 Q: [
  15. *                                            INCLUDE FILES
    ( K, ]" @8 t7 e- j
  16. *********************************************************************************************************
    + \) n. e  f0 ^3 X* N. \
  17. */
    ) ]$ S: r+ ?; S8 _

  18. ) T( z6 C$ \7 J" T
  19. #define    CPU_BSP_MODULE! G' O$ P4 H# k- d
  20. #include  <cpu_core.h>2 g/ {8 ~  b; O
  21. #include  "bsp_clk.h"( e0 b  e1 V4 H% ~! @

  22. . _6 |7 v" H/ T2 m
  23. / N! c. y6 w% U$ r8 i, K
  24. /*, n$ t3 K2 Q% D9 t8 [# e+ F7 G
  25. *********************************************************************************************************3 h' Z& M0 y7 \' l" \/ ~
  26. *                                            LOCAL DEFINES
    # S3 m$ C7 A  {& `
  27. *********************************************************************************************************
    ! F0 M6 Y' b  ~9 b# `/ ~
  28. */
    2 w' Z& f1 D  |, o; b4 g
  29. 9 f6 d! c9 Z5 |4 E9 S
  30. #define  CPU_BSP_REG_DEMCR             (*(CPU_REG32 *)(0xE000EDFCu))
    6 X* ^8 g7 J3 P( v2 a0 D
  31. #define  CPU_BSP_REG_DWT_CR            (*(CPU_REG32 *)(0xE0001000u))
    % H9 b6 `: ~4 P7 V8 Q6 `8 A
  32. #define  CPU_BSP_REG_DWT_CYCCNT        (*(CPU_REG32 *)(0xE0001004u))$ K) ?" k. |. V( K5 G' i2 n$ |
  33. #define  CPU_BSP_REG_DWT_LAR           (*(CPU_REG32 *)(0xE0001FB0u))
    % K/ K+ y8 E) y& n3 Z
  34. #define  CPU_BSP_REG_DWT_LSR           (*(CPU_REG32 *)(0xE0001FB4u))0 r' X2 z1 u1 f1 H/ z' g

  35. " `" T* A; Q: Z
  36. #define  CPU_BSP_BIT_DWT_LSR_SLK        DEF_BIT_01) F6 x8 [  h; J- O. D- }( ]
  37. #define  CPU_BSP_BIT_DWT_LSR_SLI        DEF_BIT_00" T+ G1 U3 n7 o8 ]
  38. 1 K# e! `9 l0 N' G  l, \
  39. #define  CPU_BSP_DWT_LAR_KEY            0xC5ACCE55u
    2 K, N+ H; H9 e6 |

  40. ' {' k' L1 d& N1 n! M" `) `+ y7 Z
  41. //省略一部分无关的代码+ U+ _5 S- R7 d( r5 J7 C1 Y2 u3 W
  42. * X" l! p2 d& \# Q( j
  43. //DWT定时器初始化3 @# t9 g& ?5 ^7 @7 `! N6 {8 Z2 i5 Q
  44. void  CPU_TS_TmrInit (void)+ [& Q. l; s" f2 P* d
  45. {
    6 H( f! ^3 T9 V3 n6 r4 Y
  46.     CPU_INT32U  fclk_freq;
    5 j; n: P2 @4 ?/ `0 Y
  47.     CPU_INT32U  reg_val;
    - q# C3 z  B) W
  48. / x+ M; K% m3 u. c0 u
  49.                                                                 /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */" E' T3 f" ^7 N( r9 l. J! }: k
  50.     reg_val = CPU_BSP_REG_DWT_LSR;                              /* Read lock status register.                           */7 f+ V' X2 `" ~* f
  51.     if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) {             /* Check if Software lock control mechanism exits       */
    5 g/ S" v. @6 m6 _8 u1 D
  52.         if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) {         /* Check if DWT access needs to be unlocked             */5 ^7 g9 b( c& p# y: Y
  53.             CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY;          /* Unlock DWT write access.                             */
    2 F8 K& @+ O8 F0 Z
  54.         }6 C2 w+ L! c. H+ r
  55.     }, ^) @6 X8 u* ^* s- w$ N5 x( \

  56. ; D+ w* \$ B' o/ E$ @- p
  57.     fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);' L+ \% _$ a# g5 x6 _$ C. W

  58. / b3 ]$ Q% n( g8 e! U6 H, A
  59.     CPU_BSP_REG_DEMCR  |= DEF_BIT_24;                           /* Set DEM_CR_TRCENA                                    */
    2 ~- e6 D9 Q* Z4 N( g1 n
  60.     CPU_BSP_REG_DWT_CR |= DEF_BIT_00;                           /* Set DWT_CR_CYCCNTENA                                 */
    9 A! D3 _' H" r0 W' N  h
  61.   n' c0 W( y  s
  62.     CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);3 c' {: s0 k* O  B. z, R
  63. }, w5 q! a: l  g. d  ?( W' [$ L& s
复制代码

- V# K$ U) W7 u% oUCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作' G  [9 e" d2 y3 y! p+ H
这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样
" u( v8 Y  t/ B0 x7 f# L$ A# ~) h9 a) h: I$ ?, }
  1. void dwt_init(uint32_t clk)
    6 w1 Y# s- f# ]- y7 ]
  2. {
    % c* q& n: e; U4 U6 c: n
  3.     cpuclkfeq = clk;* ~% |: G# `  X% U
  4.     DWT_LAR        |= DWT_LAR_UNLOCK;! N8 p2 Y, B1 f
  5.     DEM_CR         |= (uint32_t)DEM_CR_TRCENA;3 @6 K- m. E  h+ S: y: G4 z1 d
  6.     DWT_CYCCNT      = (uint32_t)0u;
    2 p' J6 \1 I6 K2 O% `4 \. S. [
  7.     DWT_CR         |= (uint32_t)DWT_CR_CYCCNTENA;. X( T* W3 s* j6 Y# T
  8. }
复制代码

; f9 |" d' W, R8 @我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题+ g; ?4 t4 ^2 @% p9 B/ J; j
我有点怀疑是不是那个软件读取要不要解锁的操作的影响。
1 z0 ^% R7 r% w/ u* F$ d" {卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来
& v; U4 Y4 J5 y  n6 w+ c我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的' {9 T! Z( @$ t+ r# y3 k
) {9 q7 q+ s2 _1 B1 E  n$ x% S

* S+ q0 v3 B/ I( [5 d
收藏 评论0 发布时间:2021-12-14 10:35

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版