有读过关于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
- /*/ Q2 I( b( |% X! j. w# j* T
- *********************************************************************************************************
3 I9 g" G/ D6 m8 z - *
- o _ Q, q: A - * CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS
" i0 N* a6 z2 w3 N5 g8 ?. G - *; k$ V) g& B) J1 Q" M
- * ARM-CORTEX-M7
# r: p2 [- x# q8 i" L" e. R$ ^. C - *
! y2 ^( T+ f8 `. U* w1 c, o - * Filename : bsp_cpu.c
& X( W) b# \. a5 f N( E- f2 w& Y - *********************************************************************************************************
) ]7 V+ {+ K/ T - */
8 x5 X7 ?' q$ r: g! H) a - : d, k3 k+ b6 I1 \
- Z, M- e+ q+ X! H! a4 s a: ?- /*
8 O% M3 M o: I' Q" |8 p - *********************************************************************************************************2 j; ^- F3 H' Q5 V/ ]
- * INCLUDE FILES
+ `$ {6 M' l2 K$ X - ********************************************************************************************************** L) a7 l0 h* K
- */
6 t6 Z" f: D; L- C3 l4 I. r; g: v
1 s% a k( r! ^4 a- #define CPU_BSP_MODULE, m6 {/ W6 u; B& Q- V
- #include <cpu_core.h>/ T+ ^0 B, w% y* g
- #include "bsp_clk.h"
2 N: J9 b# k& k8 q+ \! |
% G- i) F; m8 S- 9 ?9 I; k7 p2 y
- /*0 ~; t) Y3 Y. Y. M( r1 A
- *********************************************************************************************************$ ^! r. t9 A5 k7 y$ F
- * LOCAL DEFINES
0 Q7 ]1 e* x- ^. r3 c/ A/ [ - *********************************************************************************************************) w9 k" U! K* j7 Y6 p
- */) c. I+ {4 h% m. g) Z5 \8 }" o
$ P4 i# N0 [3 C& z6 ]" C- #define CPU_BSP_REG_DEMCR (*(CPU_REG32 *)(0xE000EDFCu))$ g; n0 ]; Y- i9 {- I) u
- #define CPU_BSP_REG_DWT_CR (*(CPU_REG32 *)(0xE0001000u))
" P5 [6 H7 |% L: X - #define CPU_BSP_REG_DWT_CYCCNT (*(CPU_REG32 *)(0xE0001004u))
7 c) p, s3 \' z0 j9 V5 J - #define CPU_BSP_REG_DWT_LAR (*(CPU_REG32 *)(0xE0001FB0u))7 {6 y; u) ~& R6 S+ Q% y' N
- #define CPU_BSP_REG_DWT_LSR (*(CPU_REG32 *)(0xE0001FB4u))
% u4 s6 X. U/ P& G& Y" H
* q8 S% H4 f A/ c- #define CPU_BSP_BIT_DWT_LSR_SLK DEF_BIT_01# }* A, i% Q, y* D( F8 K- i% K
- #define CPU_BSP_BIT_DWT_LSR_SLI DEF_BIT_00# r, Y: s7 y. ]8 t$ B7 ^& @. b
* h/ M, t( t3 U: n- #define CPU_BSP_DWT_LAR_KEY 0xC5ACCE55u3 V! B! l" |: e2 n T5 N
! e/ x- I" C# _ S8 C& D# l- //省略一部分无关的代码1 w( z0 a0 Z: o, Z- P) E5 B2 L
+ p3 d9 Z3 R' M- //DWT定时器初始化
# n+ w9 B0 E* F' g* B. E1 W ` - void CPU_TS_TmrInit (void)
3 ]# W1 S& C" m+ w' { - {8 Z: h) m! E; a& ]* k
- CPU_INT32U fclk_freq;
4 [' W& p( J2 j* d7 J5 ` - CPU_INT32U reg_val;
{; i( O. h5 d4 G: r
' t9 K% s r- E1 s4 X- /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */# ^& K' g I* ^& H* A
- reg_val = CPU_BSP_REG_DWT_LSR; /* Read lock status register. */! [- T8 P: j4 @3 }2 q4 @
- 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
- 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 { - CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY; /* Unlock DWT write access. */6 `2 @8 P4 [: t) A' d
- }: b, U) b4 f% E& z
- }
$ j$ G8 E, K/ e6 W/ o
. v/ q& ?/ [, b" G- fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);
0 p0 Q( _ E- e% U- q3 U - + v/ s- B1 \2 C7 K9 n; c
- CPU_BSP_REG_DEMCR |= DEF_BIT_24; /* Set DEM_CR_TRCENA */
' Q o* j3 _0 o9 D - CPU_BSP_REG_DWT_CR |= DEF_BIT_00; /* Set DWT_CR_CYCCNTENA */
+ I6 s) r* Q5 N" C2 y- W, c8 k - 7 H8 A F, ]0 s9 v; Q1 Y
- CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
5 ~8 e6 Q9 s8 _8 }/ z. q - }
/ 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- void dwt_init(uint32_t clk)
# O* B; J' l* m+ U2 J7 D - {
( e- i3 _8 e3 }; v* i9 w+ r4 k, } - cpuclkfeq = clk;
5 p2 c4 `% d" g2 A+ O' l7 [* e - DWT_LAR |= DWT_LAR_UNLOCK;
4 r1 J4 s2 g! C5 E - DEM_CR |= (uint32_t)DEM_CR_TRCENA;$ n8 A# ?% [/ {# G! j- s( X! I
- DWT_CYCCNT = (uint32_t)0u;
- V" y* l% H9 x% p& t - DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;) w- F' b( b. S/ |5 P; z
- }
复制代码 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 |