有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章( L: I0 o9 g) |. ?
~4 O; S2 Q: S$ w0 k' f
时间是很精确
: t* |3 T) U: J2 o; W还能省掉一个定时器和对应的中断
' Z9 K, s' _1 x+ A6 \% j7 e+ e美滋滋
2 u0 @7 i8 o& V. W! f
' d0 C8 ~$ B5 [% l. E但是很奇怪的现象是6 T% n) j8 V* a* t- V# N% u
$ x( m: j) n' b0 i( t: U# y y
F7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象
' X; f& y. h5 f M& r- B9 }我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故9 G. ?4 ]( J& K$ k6 Z7 i. n0 z
: o* j+ _6 S2 ~& u' f7 W, y+ S
但是很有意思的是
- D6 Q' O" G S4 J# R在M4内核的芯片上同样的程序却没有这个现象
4 |$ P2 p- {3 y: F2 ^能够正常的工作
6 u N5 b; O3 m5 C5 c. j7 ~9 b
$ V: w! O+ J: V- W7 O有看到这位弟兄的文章
& Q& k4 i$ X2 F U+ p我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的2 R- b! X' }/ d, q
3 v' c2 p( c% I$ s) Q- H
- /*; g0 m* r* W% o
- *********************************************************************************************************5 l8 \7 v! ]" f; G& i% c" N
- *( F6 O( {& p% v
- * CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS; C7 q& F- W8 T4 ~, l
- *
1 f' W) B( R2 F/ K( I - * ARM-CORTEX-M7+ K$ w* }. Y# n+ A$ p
- *
. a4 @& O, w2 L/ x9 j - * Filename : bsp_cpu.c6 F+ Y3 m5 w! ] z
- *********************************************************************************************************8 c3 ~7 y* |& _, S- `4 s5 E* M
- */# s% \( y( t/ X6 }8 b8 A: D6 Y
- 8 F0 D0 Q( k* F/ A5 Z# g/ e& }' v
) t% D7 ?; G8 M. l+ z. v1 n' x- /*; s" O+ w( e' D1 ~9 p8 M* c" b' B; T
- *********************************************************************************************************
2 R* K9 x. C# o6 ?) k! {. P - * INCLUDE FILES
6 F, l$ V" U$ I! A! j& ?4 S' m - *********************************************************************************************************$ w: B- h* ]2 u* \. w1 N$ h
- */% V; b( U- a, @) A+ w1 O
0 k2 P5 U7 c% _% M6 I7 t- #define CPU_BSP_MODULE, @8 l3 M$ n: ~; b. z% W7 n5 T
- #include <cpu_core.h>% B; Z8 j0 G( X# s5 D; j6 Q* R
- #include "bsp_clk.h"& j4 x4 G6 J" L- `/ p9 f
$ c8 @( o9 Y( k" u% [$ ^4 i- 9 ?' M+ a$ _0 ~/ o! q) n
- /*
: R8 ^$ x+ Z0 N: ]9 w+ z - *********************************************************************************************************
$ Y. r3 i# R7 W3 g! I - * LOCAL DEFINES
0 f+ o; q \" k7 Z/ l9 U' T - *********************************************************************************************************# g+ J) |, { B& [0 E7 v, }
- */9 n) g9 V) |, L3 l, W, x4 L0 F# @
0 F: @& R/ }$ I/ b- #define CPU_BSP_REG_DEMCR (*(CPU_REG32 *)(0xE000EDFCu))$ C- ]$ N6 H- e& i9 S
- #define CPU_BSP_REG_DWT_CR (*(CPU_REG32 *)(0xE0001000u))
9 q1 |8 T. n- F1 s - #define CPU_BSP_REG_DWT_CYCCNT (*(CPU_REG32 *)(0xE0001004u))0 R+ B5 D& L, ?" B- P
- #define CPU_BSP_REG_DWT_LAR (*(CPU_REG32 *)(0xE0001FB0u))
0 {3 k& f, Y9 @! R$ x" m - #define CPU_BSP_REG_DWT_LSR (*(CPU_REG32 *)(0xE0001FB4u))
6 ?. I# z/ w! c/ ~/ I - & F( }/ i% r) d$ z7 u: a
- #define CPU_BSP_BIT_DWT_LSR_SLK DEF_BIT_018 b# O D! T d i0 @
- #define CPU_BSP_BIT_DWT_LSR_SLI DEF_BIT_00% c" \" T6 ?7 v% }: \. n
! U. s) \. B1 X3 ~$ t! p- #define CPU_BSP_DWT_LAR_KEY 0xC5ACCE55u0 K4 U+ A! |+ N6 F
- 7 Q/ f A* ?/ C
- //省略一部分无关的代码* V+ f) y, u; }5 h Q* h' z
: e' h4 |- S) Y9 ]$ a- //DWT定时器初始化
' j1 l- k( m$ Y" J0 z; p8 j. t3 ^; B - void CPU_TS_TmrInit (void)2 [! Y) g2 }& I) f' _# F
- {
8 I) c8 |1 l% M; e' W - CPU_INT32U fclk_freq;9 a h; [& o+ j* E- z2 s" H
- CPU_INT32U reg_val;% }; b6 B; V8 S C8 m7 p6 F D
- ; o. D5 _7 `$ Q
- /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */
' F% m; t: n' `$ ^( [2 l - reg_val = CPU_BSP_REG_DWT_LSR; /* Read lock status register. */! [% I+ @! N- p) N( k
- if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) { /* Check if Software lock control mechanism exits */( d% q( k, f4 ]2 H- f8 I+ t; C0 W
- if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) { /* Check if DWT access needs to be unlocked */
( b I, s) G5 E5 W, ~ - CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY; /* Unlock DWT write access. */
0 n' ?# [4 y* n. O$ X - }
3 H3 R6 P9 Z: r) V4 I! b7 A! L: R - }4 c8 W& v8 ~) _% ?- C8 E" A: g. A
- 1 n# Q. V, @2 ?1 p# T8 _5 k6 K
- fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);! Y% o& H0 q* a' y3 i) _! p
! h7 Y8 X0 d" v- CPU_BSP_REG_DEMCR |= DEF_BIT_24; /* Set DEM_CR_TRCENA */
2 p9 P5 `6 M# w: O8 Z - CPU_BSP_REG_DWT_CR |= DEF_BIT_00; /* Set DWT_CR_CYCCNTENA */ l6 @# }* u/ b S
- . e; v9 F" h7 z6 f3 I" x
- CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
- R, `6 R& E. E. }2 t - }
1 [/ E7 C* L, r+ E9 `3 ^
复制代码 " H2 T* v2 r/ G( h3 Y% D2 ~/ @
UCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作
8 a# |1 ] ]* K" _这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样( s) y; H9 A1 K* \$ h& ^8 m: _
3 a7 L* `4 k; }. n- void dwt_init(uint32_t clk): V$ p2 Z+ H6 ?& x) @+ J' r
- { z0 \6 Z/ D" a3 \
- cpuclkfeq = clk;
1 o/ ] l2 w% l# k- z1 ]3 ^+ v - DWT_LAR |= DWT_LAR_UNLOCK;' N9 p* e: `* R9 M3 W/ y
- DEM_CR |= (uint32_t)DEM_CR_TRCENA;1 p/ R4 d$ C: j6 E- F; U- g
- DWT_CYCCNT = (uint32_t)0u;& A$ ^4 @' R+ {/ y) D
- DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;8 q! |+ w3 h. Q' V3 ~/ ~- J
- }
复制代码
4 n9 h/ m% P: ?" W) O: ]- x/ d我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题' w1 u" y+ q8 U/ f3 `
我有点怀疑是不是那个软件读取要不要解锁的操作的影响。
1 n/ O8 q3 C: x5 r- Q" C卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来7 p$ T7 m' O* G5 }, B
我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的
/ q- e. H% `8 ~: T. t8 M$ O! t2 Y8 D) B. i6 r
) ?2 P: P5 q o$ C |