有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章" G1 S( n, M* R) o1 N
0 L3 E/ a0 ~. { [! b时间是很精确' g- H @- o4 }1 [+ p
还能省掉一个定时器和对应的中断( M8 y- w: a1 B' D4 f8 t
美滋滋0 G. o& ]+ a! L/ F1 q& u. \, m
% q( r3 z% [9 D8 p
但是很奇怪的现象是
8 L( I( s: v6 U) `0 r6 J" u2 O" ~4 G m9 Q8 G; M, d; e5 y% X5 ]
F7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象 @4 N3 ^" o) f$ Q6 d
我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故# l# G! H3 p" z( F( p
I8 A1 O, Q% Z8 e5 h
但是很有意思的是
6 h% s2 b7 Z5 z' y) C4 t) F: d( `在M4内核的芯片上同样的程序却没有这个现象- }. b1 A+ j! J) u( b
能够正常的工作0 m, {" T. c, n' X, p
) D; R0 M! B) y2 o有看到这位弟兄的文章
" d( v8 }, a7 f1 v2 Z: \9 ~; g我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的/ H1 H) @+ U& N. O! n( P
- r1 o1 E* }8 t$ I
- /*0 d8 ?2 l+ }# }$ p
- *********************************************************************************************************
, K: a8 w8 f# T' K- ~( T. H- r - *, B4 F* P- y( @& h* q
- * CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS
5 G* v; `2 A% q( y7 O: ?0 l - *! S" H3 f5 r( E I4 S* Z9 u9 b& n
- * ARM-CORTEX-M7
/ d4 G) ]3 w6 ]; i" r - *0 u+ c4 x! R0 `' [
- * Filename : bsp_cpu.c4 `3 O$ z9 j- d/ V {1 q/ }6 L
- *********************************************************************************************************
0 B7 r" T+ e( i' u' \9 b, K - */, G8 z( `2 j+ B
- / `) o+ R8 `* M9 T* H% o
( j4 z8 ?# Z, C7 v4 O- /*
6 D e" R$ z9 }1 B9 L/ _% w0 m - *********************************************************************************************************
1 Z) E4 x: X7 k7 X- U2 o - * INCLUDE FILES0 o3 ?. Q/ u4 I
- *********************************************************************************************************! ]" a! f' T8 V9 i/ g- H
- */
. A$ g4 G. q2 c8 Q( a4 A' `# c - 5 N1 V& n" `9 t
- #define CPU_BSP_MODULE
2 {* a2 g# C. K" d$ { - #include <cpu_core.h>1 _/ U5 S9 j% J: \
- #include "bsp_clk.h"
0 z, d, g% x ^0 z9 j; n' Q5 F6 {
7 [) A5 H2 h& J' N: S- ' @# d H% c5 S. M
- /*5 t7 I* _6 A/ m
- *********************************************************************************************************
Y# d. Z( R. W6 F - * LOCAL DEFINES
) ~! s: c* z' s. D0 P - *********************************************************************************************************
2 ^) u/ c0 d" G, h - */9 @3 O: V+ |' f3 A2 x: j
: [* f9 `! _: L: [/ c: v& i& t- #define CPU_BSP_REG_DEMCR (*(CPU_REG32 *)(0xE000EDFCu))8 I. k7 ?# v5 r4 a1 A6 |' a% X
- #define CPU_BSP_REG_DWT_CR (*(CPU_REG32 *)(0xE0001000u))9 R" z( s6 A- m1 D; P/ ?+ k+ H
- #define CPU_BSP_REG_DWT_CYCCNT (*(CPU_REG32 *)(0xE0001004u))
: c3 ?2 ?0 @' P4 L - #define CPU_BSP_REG_DWT_LAR (*(CPU_REG32 *)(0xE0001FB0u))# c- K7 n0 ]+ w4 A9 o, t, H% C
- #define CPU_BSP_REG_DWT_LSR (*(CPU_REG32 *)(0xE0001FB4u))* W, ^! A# n& x- e1 F4 c: x& P* A7 U
- & q9 B" _" _% Q2 W. w' N
- #define CPU_BSP_BIT_DWT_LSR_SLK DEF_BIT_015 E4 L% R$ f5 w( D
- #define CPU_BSP_BIT_DWT_LSR_SLI DEF_BIT_00
; T% r: k: p% W; f - + @& k8 d/ o2 [
- #define CPU_BSP_DWT_LAR_KEY 0xC5ACCE55u/ f* G, `. Z8 P! P$ ]
7 D2 T" C0 G E# q- //省略一部分无关的代码0 G6 c3 K, U6 c0 E1 {) d1 W1 N
2 \- Q* {7 Q& {- //DWT定时器初始化) h" t' y4 `. [ g* t# x4 \# r
- void CPU_TS_TmrInit (void)7 n' K6 X2 n* |, N! h8 u0 V+ O
- {
0 e- T, ] d3 g" H$ z% i; x - CPU_INT32U fclk_freq;
$ q9 d& x) M0 {4 O. C - CPU_INT32U reg_val;4 E3 g0 j- t/ T: d- b
- . z1 M% r* o0 G/ R" m ?
- /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */
6 ]3 U6 K+ t5 Y, [& P8 Q7 W7 m( L - reg_val = CPU_BSP_REG_DWT_LSR; /* Read lock status register. */3 @" b1 ?# Z! w" q! K
- if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) { /* Check if Software lock control mechanism exits */
. X( K. b. A) L# O" S - if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) { /* Check if DWT access needs to be unlocked */- B8 C3 e1 s7 [9 M; A
- CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY; /* Unlock DWT write access. */
0 C; V2 l! H+ O2 }7 n' @ - }. k6 ]4 f- f! f& b w
- }
5 n1 G& U |% D* ?4 n' m - 5 S- ]! ~9 n* ?7 Q4 c0 S3 K. D
- fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);& C3 ~% S1 F5 f
- 4 g* C' w9 V7 L3 W! p4 K. T# |
- CPU_BSP_REG_DEMCR |= DEF_BIT_24; /* Set DEM_CR_TRCENA */
5 v3 z+ r* ^% C( k - CPU_BSP_REG_DWT_CR |= DEF_BIT_00; /* Set DWT_CR_CYCCNTENA */
! t' [9 K8 g# o7 p3 Q - # ]9 R w* X7 U/ O
- CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);4 t2 j- v5 F0 G1 m, W" i4 L
- }# n! H0 y' q* \/ }
复制代码
5 s; v, L( @5 h/ dUCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作( l b1 F1 l+ X) h( K8 j2 m& i
这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样
; {. X- d( z2 d' M
: q; [0 w% r% U: o' g8 V$ ^- void dwt_init(uint32_t clk)
2 Z7 y, Q, W# }4 v% r5 S - {3 `) J) c6 g I
- cpuclkfeq = clk;
* c- ]& s$ R1 @' J7 Z* Q! R - DWT_LAR |= DWT_LAR_UNLOCK;
0 a9 K0 P+ i" E! w- | - DEM_CR |= (uint32_t)DEM_CR_TRCENA;6 S! q+ T, e2 w$ h5 k- |' y6 C2 s
- DWT_CYCCNT = (uint32_t)0u;
) J% U+ q# q; h& Q - DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;
r; V4 G5 G+ G# A L9 I - }
复制代码 ! u' [. C( V; {8 N
我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题
' _1 S( j& Q+ P. c我有点怀疑是不是那个软件读取要不要解锁的操作的影响。1 ]9 W/ x! P! m4 {3 S/ a
卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来
* P8 g1 n2 I ?$ n我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的# c; P, |+ y; ]) p5 A9 b4 n
9 m' Q+ b5 W A1 e( F0 H
+ x, q+ P" Q2 S" x: P |