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

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

[复制链接]
STMCU小助手 发布时间:2021-12-14 10:35
有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章1 V% `8 X. a; v4 Z  `$ ^' f
! a! N& [+ p0 j% b8 U5 M$ Z
时间是很精确2 T- o* q) ~0 w% H" N$ E1 ?( k% C
还能省掉一个定时器和对应的中断# n3 e% }7 W0 l; p
美滋滋. S2 z7 d. V6 C

. h* E! t+ v4 ^; ]# v但是很奇怪的现象是% a2 y2 ]3 L% `! P

( q$ `/ P1 `5 E% h$ AF7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象* o  [( [4 V, J' G6 X4 g
我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故
; \- r' M5 E# M: @7 A* g
) O8 H: ^! W+ m3 Z但是很有意思的是
# o' M5 o, G( Y2 i1 s在M4内核的芯片上同样的程序却没有这个现象
( z3 W3 q4 y$ }能够正常的工作0 Z* O( H$ Z  F3 a# m9 y

2 _& y' W# |& U# O4 O9 D/ Z有看到这位弟兄的文章
; N/ t7 N& C2 a) V我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的
* U) Y% l9 A! S$ z% u
; Z) n7 h. B9 h: ~5 L. M. X/ H
  1. /*
    9 |) n8 T. e' B  ]0 D
  2. *********************************************************************************************************5 s" O1 T7 N- S; E3 k. p! Z
  3. *
    " E2 P9 {$ E' U9 v
  4. *                               CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS5 e. g/ x5 S! U5 d( {/ w
  5. *
    ( F. e" n  P: e0 p' A
  6. *                                            ARM-CORTEX-M75 X6 P3 v2 v$ ^8 |5 A0 k
  7. *+ {8 p% P* L& T9 n
  8. * Filename : bsp_cpu.c
    . K0 y% \' C  i' F
  9. *********************************************************************************************************
    2 R6 A$ Z& B4 d) g# m+ k4 P
  10. */4 [7 g: v' W) x5 W

  11. ( D# L1 \: c3 A" D( l% T
  12. 4 A; `  v5 r  _* S1 n' J4 h
  13. /*$ L+ w' a7 U/ O4 k% r
  14. *********************************************************************************************************
    / H/ `! r' R9 ^
  15. *                                            INCLUDE FILES
    7 m2 p3 a3 [( v: F
  16. *********************************************************************************************************# g$ O/ o" g0 |- b7 j
  17. *// |7 j7 I  B+ y0 |* f/ i9 f

  18. 9 a  C" F" H0 p7 E  I
  19. #define    CPU_BSP_MODULE( z& w% @5 o' \3 H; t
  20. #include  <cpu_core.h>9 w) z: b1 N# K* B
  21. #include  "bsp_clk.h"
    4 F/ r) P9 d; d# I- Y
  22. 4 l; N4 v' L3 s) ~$ P. t' r$ K
  23. : Y6 y6 D& E3 Y, ]
  24. /*! e8 P( O4 c' Z/ m$ b( B
  25. *********************************************************************************************************$ `$ z5 S: V% V/ ^6 z& s
  26. *                                            LOCAL DEFINES
    / C4 L! K% b' @! f2 a
  27. *********************************************************************************************************
    0 O% \6 T" J% f
  28. */+ n  ~2 |/ P2 o2 F$ o7 G& U

  29. 9 `+ F4 d) G4 q+ Z; \# G7 l
  30. #define  CPU_BSP_REG_DEMCR             (*(CPU_REG32 *)(0xE000EDFCu))
    + ]$ y" s. o+ \4 _7 }6 H' ^  u# T
  31. #define  CPU_BSP_REG_DWT_CR            (*(CPU_REG32 *)(0xE0001000u))
    2 J3 f6 _( F: h$ y. i
  32. #define  CPU_BSP_REG_DWT_CYCCNT        (*(CPU_REG32 *)(0xE0001004u))
    : c' ^7 j! E) f, ?& F
  33. #define  CPU_BSP_REG_DWT_LAR           (*(CPU_REG32 *)(0xE0001FB0u))
    2 _7 ~2 j7 I' {7 [) L3 G
  34. #define  CPU_BSP_REG_DWT_LSR           (*(CPU_REG32 *)(0xE0001FB4u))
    . T2 l( b7 C! K6 K
  35. ( l; a2 M0 r; w9 K7 \
  36. #define  CPU_BSP_BIT_DWT_LSR_SLK        DEF_BIT_01% `" ^& n% v! J+ r" p/ {9 u2 M
  37. #define  CPU_BSP_BIT_DWT_LSR_SLI        DEF_BIT_00, {: y& b' B# Y: c1 V0 F
  38. ) ~2 K/ p1 C6 z) v9 B  U: b6 M
  39. #define  CPU_BSP_DWT_LAR_KEY            0xC5ACCE55u
    ; f/ e% R: ]# M+ V( U

  40.   G; @! d2 z. C: M2 x
  41. //省略一部分无关的代码
    $ N! z0 m4 N$ P3 {) n4 {

  42. 1 a; e0 f  [5 O9 v2 y* O$ G
  43. //DWT定时器初始化
    + a/ S' A( _* ~! t7 P
  44. void  CPU_TS_TmrInit (void)7 N5 p* o  S+ _0 T- g! a
  45. {
    5 Q$ a: L# H: @' f
  46.     CPU_INT32U  fclk_freq;
    , q# B7 V! @: J0 }2 q: e4 b/ J
  47.     CPU_INT32U  reg_val;
    . s0 n0 x! k7 P

  48. 5 V# C  H$ D8 s, Q
  49.                                                                 /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */
    8 @6 U# a0 D, A& Y: |
  50.     reg_val = CPU_BSP_REG_DWT_LSR;                              /* Read lock status register.                           */! d2 A8 G9 W; D8 b0 ]
  51.     if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) {             /* Check if Software lock control mechanism exits       */) f) J* @: w7 t( D# A# J4 J+ y
  52.         if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) {         /* Check if DWT access needs to be unlocked             */, c  P- `: |  Z1 K4 g$ \
  53.             CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY;          /* Unlock DWT write access.                             */5 W: D% C( _; e# P5 [: U
  54.         }9 _& \2 T' B$ ~& s: @/ @
  55.     }( E3 U8 |0 w& q0 v/ z) {

  56. : l3 G# E9 m- F+ P- A, T8 I
  57.     fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);! w! \& x5 }' v/ M  J" }
  58. 9 E# J7 I0 m! }% S# I$ Q$ C" K
  59.     CPU_BSP_REG_DEMCR  |= DEF_BIT_24;                           /* Set DEM_CR_TRCENA                                    */* z8 \1 L) h5 i$ [+ }% f: h
  60.     CPU_BSP_REG_DWT_CR |= DEF_BIT_00;                           /* Set DWT_CR_CYCCNTENA                                 */2 t# t6 e1 s  C( M

  61. 6 N6 c" _7 V$ p
  62.     CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
    - p% m+ @6 A! {/ y) w( O5 d
  63. }' Z! q0 h3 ~/ Y+ V3 z5 ^
复制代码

( U9 X$ f# C) B% G, D) Q/ E: gUCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作
* T3 @- ]) k6 J6 O+ A! w这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样: `: y. l: n4 a. U' N( _$ u3 b  h

6 P) P* Q' K4 B: m0 m6 k
  1. void dwt_init(uint32_t clk)
    . ]# S5 @4 B& P( ]1 b
  2. {
    7 R5 z' J0 x- K7 G
  3.     cpuclkfeq = clk;8 z, w+ y! `3 [% ?' I9 n. X
  4.     DWT_LAR        |= DWT_LAR_UNLOCK;
    4 `: t( D1 V( L2 ^
  5.     DEM_CR         |= (uint32_t)DEM_CR_TRCENA;
    / b! X1 {( y% P9 m
  6.     DWT_CYCCNT      = (uint32_t)0u;1 o( @+ V- r; m  F/ j& |8 _
  7.     DWT_CR         |= (uint32_t)DWT_CR_CYCCNTENA;, J1 t: R+ p! E% s) B
  8. }
复制代码
/ V+ K4 l& m- A! s) a2 s
我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题
) J& m+ A# m0 a9 ~5 Y: i" t我有点怀疑是不是那个软件读取要不要解锁的操作的影响。
! W$ w: |6 Q) |3 V卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来6 d9 _: ^) f! }
我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的4 x+ _# S+ G# S( P6 h
5 ^3 m8 O/ [8 P$ `$ s

4 N) m0 T) d3 V" X+ I7 I
收藏 评论0 发布时间:2021-12-14 10:35

举报

0个回答

所属标签

相似分享

官网相关资源

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