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

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

[复制链接]
STMCU小助手 发布时间:2021-12-14 10:35
有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章- p2 m) y1 ^9 n$ M( \+ ^
1 R& [6 I4 a' \% ~& u) L
时间是很精确
* M. ]0 l* b) q  e) w/ q还能省掉一个定时器和对应的中断, B5 ^0 |0 S9 @4 r1 N1 m
美滋滋
1 [1 k4 n# [/ p& r4 U
& N# P8 m* h5 x- a, G但是很奇怪的现象是# c4 Y5 o$ b& y1 v4 \& Y; [

: H2 e8 u5 D8 J; IF7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象
! R$ Z; M/ x5 r, W" H我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故
8 V3 t5 n2 l) f3 r
) E; @! I5 n8 i% P! d但是很有意思的是
: q, _4 d  W' }% F" Z) }/ u在M4内核的芯片上同样的程序却没有这个现象
7 A2 B. v  ]+ G- R6 i# Z/ @能够正常的工作  c9 C6 |, s( K5 `" @
) [. u- U. I: l4 {8 ^
有看到这位弟兄的文章
# {5 a2 l' E' j& A2 a+ g; D( M6 x/ I我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的4 S: k1 }0 H) r3 P

" K. W( E" o5 X2 s
  1. /*" I7 n7 W, N; b* o" I9 b
  2. *********************************************************************************************************) g7 r" d+ d3 f' ]& t! j
  3. *: u2 o5 u' a- D1 |0 n
  4. *                               CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS3 D- c" M9 n; X# C; Q- _( Z
  5. *1 m: H5 h. r, H3 F8 Q; l
  6. *                                            ARM-CORTEX-M7
    - j/ v( s  V4 V$ a9 g/ k) F
  7. *0 z' ?& o7 Y5 _: N6 y2 X8 ?
  8. * Filename : bsp_cpu.c2 F1 l/ D& H+ ]# X, Z- A
  9. *********************************************************************************************************
    ( I: r* Y3 U3 X0 N3 x
  10. */' r; x5 a2 {2 G3 L) K) T5 O
  11. 2 A8 K5 k! @  ?0 d! a4 U9 o

  12. , {5 z) Q4 |! u# L9 `( z$ \
  13. /*
    0 S/ O4 c$ l3 D. i
  14. *********************************************************************************************************
    / F( p0 U) J9 _- V
  15. *                                            INCLUDE FILES* Z9 I0 ]% K5 C) q7 `
  16. *********************************************************************************************************4 Z+ I; F1 E2 e* ]6 \# C5 A) [
  17. */4 o; `) G; d! J8 q& E2 ^

  18. 8 N5 R* Q3 s+ }( |- _$ e7 ?* _) ^, O
  19. #define    CPU_BSP_MODULE
    - e8 {: [3 o1 \9 Y* {" c
  20. #include  <cpu_core.h>
    ) B5 E; X$ ^( ?
  21. #include  "bsp_clk.h"
    5 e% _5 z. H) }, m

  22. 0 F" h) U6 ?& h/ [$ _

  23. 3 I3 X: E& \# h6 |; _8 v
  24. /*# P: ?6 r5 ~" Q2 r
  25. *********************************************************************************************************
    & H- X$ a/ a5 d' L4 ~6 y( ]
  26. *                                            LOCAL DEFINES
    ! x9 y" c6 ?" ^
  27. *********************************************************************************************************
    * P: s: y8 _6 p' K
  28. */) v! n" `& U1 |: H: ?" p" \% X3 P

  29. 4 a# X7 `1 \# D: ~& _: @
  30. #define  CPU_BSP_REG_DEMCR             (*(CPU_REG32 *)(0xE000EDFCu))1 ]9 D8 q6 ]# L
  31. #define  CPU_BSP_REG_DWT_CR            (*(CPU_REG32 *)(0xE0001000u))
    $ @- J) z" T* T5 r& T
  32. #define  CPU_BSP_REG_DWT_CYCCNT        (*(CPU_REG32 *)(0xE0001004u))
    4 f7 B7 o! T) K* k6 E* @( D+ K/ A
  33. #define  CPU_BSP_REG_DWT_LAR           (*(CPU_REG32 *)(0xE0001FB0u))
    7 C$ U; R8 I' ]! i# M1 l
  34. #define  CPU_BSP_REG_DWT_LSR           (*(CPU_REG32 *)(0xE0001FB4u)): d& S. `5 U/ [

  35. 4 G0 F; C& \' ]. K, q8 Y# b- r
  36. #define  CPU_BSP_BIT_DWT_LSR_SLK        DEF_BIT_01
      Z. z& U5 P4 o8 y2 f
  37. #define  CPU_BSP_BIT_DWT_LSR_SLI        DEF_BIT_00
    : o# _( v0 v# U/ A# e
  38. - p& v" }* Y' C! M1 z# b
  39. #define  CPU_BSP_DWT_LAR_KEY            0xC5ACCE55u+ {, y7 j8 Y+ m* Q; @5 X7 a
  40. 6 C( Q' v/ S0 h3 a8 E
  41. //省略一部分无关的代码
    : Z* A- k& B9 C: J+ j% C
  42. ; h+ P! Q+ z0 G5 |! ?
  43. //DWT定时器初始化
    / l( h" A) j8 m2 J
  44. void  CPU_TS_TmrInit (void)
    % v9 s% ^7 ]8 L8 j- X2 t0 g0 a
  45. {
    8 L5 C9 j1 s/ b1 b0 u
  46.     CPU_INT32U  fclk_freq;
    ( s# M' U$ {% {, c. e4 _
  47.     CPU_INT32U  reg_val;
    : E% I( E- H* u1 I! r

  48. $ B) o4 B' d) S- L. r: _* N' @
  49.                                                                 /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */
    ( S, `& h! {/ |* q
  50.     reg_val = CPU_BSP_REG_DWT_LSR;                              /* Read lock status register.                           */
    + X* A+ g! ~. _3 z& S, |/ `
  51.     if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) {             /* Check if Software lock control mechanism exits       */6 o$ p9 Q# P6 [! D4 l2 d" r
  52.         if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) {         /* Check if DWT access needs to be unlocked             */
    4 J5 g: Y4 n! W- W! ~
  53.             CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY;          /* Unlock DWT write access.                             */. I) j* a. [) g/ H& R" q6 K
  54.         }2 X7 Y4 K: q& F3 r" r) H+ o' i
  55.     }5 n' M1 @; \5 B- C! D
  56.   A6 k* i' Y$ E# ~: W$ H
  57.     fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);) J7 A$ [  w, ^
  58. + ]  C2 m; |% T3 P
  59.     CPU_BSP_REG_DEMCR  |= DEF_BIT_24;                           /* Set DEM_CR_TRCENA                                    */# S2 a2 M5 F4 o% r
  60.     CPU_BSP_REG_DWT_CR |= DEF_BIT_00;                           /* Set DWT_CR_CYCCNTENA                                 */0 B0 G2 f$ a/ i3 g  G3 w- J+ n3 p

  61. ; g3 y& g* A; e" j& n# P
  62.     CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
      f) A/ y: n, c& s) r
  63. }
    7 e# b! k% s. w' }2 O" H& y! J( l
复制代码
! V9 u! x) k' O. T
UCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作$ G& e" P5 v7 g# B( p
这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样- y6 q5 a7 s9 D

$ ^2 ?" |9 S) G- J' X
  1. void dwt_init(uint32_t clk)
    - c/ y, n) h8 E* I
  2. {
    * Y9 ]7 v" C" ~8 O9 u) k
  3.     cpuclkfeq = clk;9 v: N" M) Z; J
  4.     DWT_LAR        |= DWT_LAR_UNLOCK;
    6 s- u2 }* c) O" B7 l" ^
  5.     DEM_CR         |= (uint32_t)DEM_CR_TRCENA;
    ( {/ G+ `& G7 i+ @& j
  6.     DWT_CYCCNT      = (uint32_t)0u;
    ( k( \$ D% o" r8 X3 |9 ~
  7.     DWT_CR         |= (uint32_t)DWT_CR_CYCCNTENA;. G0 R! D. ?5 ]! f
  8. }
复制代码

& h$ [! y( T% @( r, L' [! j我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题
! |0 ~- N# s( O3 a! [' d我有点怀疑是不是那个软件读取要不要解锁的操作的影响。
0 E4 T7 W$ Q) y! E9 K5 ]卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来
  L; G( ?2 w& D我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的8 n3 k3 \1 D: j8 A) \* c& G
: N! ~! j# H; Q3 d* M4 ~7 ]. L

9 b' N0 }- J/ }0 ]1 Y* X; J
收藏 评论0 发布时间:2021-12-14 10:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

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