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

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

[复制链接]
STMCU小助手 发布时间:2021-12-14 10:35
有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章( I1 q3 R+ U! f

/ Z3 [* ~% [- z5 j时间是很精确
0 M7 V: n, t3 x5 U1 {- {2 `还能省掉一个定时器和对应的中断' c# l0 J& f$ G# M! Y
美滋滋
7 T% S/ Y, C, c$ `6 T. }
/ y0 {# s1 H) u- J- E2 l但是很奇怪的现象是
2 l' w) \7 N* Z  L; z+ Z0 u" N# X4 }  I1 U' o$ I
F7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象+ ?* v: i' d- ]2 f) m/ _" J
我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故
3 t# E$ r. o- O; t/ O
1 p  O# T& Z4 w* x- _2 w4 Z但是很有意思的是
  X5 O2 k& I. J在M4内核的芯片上同样的程序却没有这个现象+ S& E2 p1 N# M! P2 K0 i4 m
能够正常的工作, W- {5 ^* l: ?1 [# P
2 |; N7 |& @% }: a& d$ D0 Z( k
有看到这位弟兄的文章# F1 l, M, ~9 W1 h/ {6 r
我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的
% I7 C- g6 F% k7 T8 V$ P; u4 ]7 W7 N- x! q% J
  1. /*/ Q2 I( b( |% X! j. w# j* T
  2. *********************************************************************************************************
    3 I9 g" G/ D6 m8 z
  3. *
    - o  _  Q, q: A
  4. *                               CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS
    " i0 N* a6 z2 w3 N5 g8 ?. G
  5. *; k$ V) g& B) J1 Q" M
  6. *                                            ARM-CORTEX-M7
    # r: p2 [- x# q8 i" L" e. R$ ^. C
  7. *
    ! y2 ^( T+ f8 `. U* w1 c, o
  8. * Filename : bsp_cpu.c
    & X( W) b# \. a5 f  N( E- f2 w& Y
  9. *********************************************************************************************************
    ) ]7 V+ {+ K/ T
  10. */
    8 x5 X7 ?' q$ r: g! H) a
  11. : d, k3 k+ b6 I1 \

  12. - Z, M- e+ q+ X! H! a4 s  a: ?
  13. /*
    8 O% M3 M  o: I' Q" |8 p
  14. *********************************************************************************************************2 j; ^- F3 H' Q5 V/ ]
  15. *                                            INCLUDE FILES
    + `$ {6 M' l2 K$ X
  16. ********************************************************************************************************** L) a7 l0 h* K
  17. */
    6 t6 Z" f: D; L- C3 l4 I. r; g: v

  18. 1 s% a  k( r! ^4 a
  19. #define    CPU_BSP_MODULE, m6 {/ W6 u; B& Q- V
  20. #include  <cpu_core.h>/ T+ ^0 B, w% y* g
  21. #include  "bsp_clk.h"
    2 N: J9 b# k& k8 q+ \! |

  22. % G- i) F; m8 S
  23. 9 ?9 I; k7 p2 y
  24. /*0 ~; t) Y3 Y. Y. M( r1 A
  25. *********************************************************************************************************$ ^! r. t9 A5 k7 y$ F
  26. *                                            LOCAL DEFINES
    0 Q7 ]1 e* x- ^. r3 c/ A/ [
  27. *********************************************************************************************************) w9 k" U! K* j7 Y6 p
  28. */) c. I+ {4 h% m. g) Z5 \8 }" o

  29. $ P4 i# N0 [3 C& z6 ]" C
  30. #define  CPU_BSP_REG_DEMCR             (*(CPU_REG32 *)(0xE000EDFCu))$ g; n0 ]; Y- i9 {- I) u
  31. #define  CPU_BSP_REG_DWT_CR            (*(CPU_REG32 *)(0xE0001000u))
    " P5 [6 H7 |% L: X
  32. #define  CPU_BSP_REG_DWT_CYCCNT        (*(CPU_REG32 *)(0xE0001004u))
    7 c) p, s3 \' z0 j9 V5 J
  33. #define  CPU_BSP_REG_DWT_LAR           (*(CPU_REG32 *)(0xE0001FB0u))7 {6 y; u) ~& R6 S+ Q% y' N
  34. #define  CPU_BSP_REG_DWT_LSR           (*(CPU_REG32 *)(0xE0001FB4u))
    % u4 s6 X. U/ P& G& Y" H

  35. * q8 S% H4 f  A/ c
  36. #define  CPU_BSP_BIT_DWT_LSR_SLK        DEF_BIT_01# }* A, i% Q, y* D( F8 K- i% K
  37. #define  CPU_BSP_BIT_DWT_LSR_SLI        DEF_BIT_00# r, Y: s7 y. ]8 t$ B7 ^& @. b

  38. * h/ M, t( t3 U: n
  39. #define  CPU_BSP_DWT_LAR_KEY            0xC5ACCE55u3 V! B! l" |: e2 n  T5 N

  40. ! e/ x- I" C# _  S8 C& D# l
  41. //省略一部分无关的代码1 w( z0 a0 Z: o, Z- P) E5 B2 L

  42. + p3 d9 Z3 R' M
  43. //DWT定时器初始化
    # n+ w9 B0 E* F' g* B. E1 W  `
  44. void  CPU_TS_TmrInit (void)
    3 ]# W1 S& C" m+ w' {
  45. {8 Z: h) m! E; a& ]* k
  46.     CPU_INT32U  fclk_freq;
    4 [' W& p( J2 j* d7 J5 `
  47.     CPU_INT32U  reg_val;
      {; i( O. h5 d4 G: r

  48. ' t9 K% s  r- E1 s4 X
  49.                                                                 /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */# ^& K' g  I* ^& H* A
  50.     reg_val = CPU_BSP_REG_DWT_LSR;                              /* Read lock status register.                           */! [- T8 P: j4 @3 }2 q4 @
  51.     if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) {             /* Check if Software lock control mechanism exits       */, V7 r/ s; ?- s/ M) b/ o1 B( J6 q
  52.         if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) {         /* Check if DWT access needs to be unlocked             */
    ( ~- r' j! B; Z8 K" X# m1 {
  53.             CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY;          /* Unlock DWT write access.                             */6 `2 @8 P4 [: t) A' d
  54.         }: b, U) b4 f% E& z
  55.     }
    $ j$ G8 E, K/ e6 W/ o

  56. . v/ q& ?/ [, b" G
  57.     fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);
    0 p0 Q( _  E- e% U- q3 U
  58. + v/ s- B1 \2 C7 K9 n; c
  59.     CPU_BSP_REG_DEMCR  |= DEF_BIT_24;                           /* Set DEM_CR_TRCENA                                    */
    ' Q  o* j3 _0 o9 D
  60.     CPU_BSP_REG_DWT_CR |= DEF_BIT_00;                           /* Set DWT_CR_CYCCNTENA                                 */
    + I6 s) r* Q5 N" C2 y- W, c8 k
  61. 7 H8 A  F, ]0 s9 v; Q1 Y
  62.     CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
    5 ~8 e6 Q9 s8 _8 }/ z. q
  63. }
    / O1 f* X$ M! g5 D) Q- `
复制代码
, r1 \+ v# K( I) M# ^
UCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作0 t1 a  A% O' U: m; [6 g
这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样
) W: J& E' Y- k6 O1 z
* q5 L$ F5 W. w0 p; v
  1. void dwt_init(uint32_t clk)
    # O* B; J' l* m+ U2 J7 D
  2. {
    ( e- i3 _8 e3 }; v* i9 w+ r4 k, }
  3.     cpuclkfeq = clk;
    5 p2 c4 `% d" g2 A+ O' l7 [* e
  4.     DWT_LAR        |= DWT_LAR_UNLOCK;
    4 r1 J4 s2 g! C5 E
  5.     DEM_CR         |= (uint32_t)DEM_CR_TRCENA;$ n8 A# ?% [/ {# G! j- s( X! I
  6.     DWT_CYCCNT      = (uint32_t)0u;
    - V" y* l% H9 x% p& t
  7.     DWT_CR         |= (uint32_t)DWT_CR_CYCCNTENA;) w- F' b( b. S/ |5 P; z
  8. }
复制代码
0 [0 r* a# Q+ R  v$ A# @
我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题! R  K/ l8 T$ a
我有点怀疑是不是那个软件读取要不要解锁的操作的影响。' p$ w2 ^, c  I8 v- G9 @. P8 K
卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来6 i" _& f, v* Z7 \3 W" a
我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的
1 G; D# V6 s$ A
: I) D7 r1 `8 m( h  l, c' Z# X
0 k3 |8 _2 y- o  ?- Y
收藏 评论0 发布时间:2021-12-14 10:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

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