有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章
! t' P: v. R$ t: f8 q0 f
8 I6 a# `6 M$ _0 |, y& ^时间是很精确5 V o3 e0 \# }- L) H
还能省掉一个定时器和对应的中断- X- Y$ L5 P! Q7 \6 l- r _
美滋滋# U: K" \ S' g* V' P8 N
- H6 M$ m1 T6 ?8 n+ H
但是很奇怪的现象是
$ |0 s& U a2 f4 x
; k. I# {8 O: u5 s# E; RF7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象: n) K i6 _/ l
我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故 e" `* d# S( s. F, o
1 Y( p {& J5 C) l5 a+ z
但是很有意思的是$ r$ m5 F( c0 C6 H* l- d
在M4内核的芯片上同样的程序却没有这个现象1 v( L2 S- J. P9 I4 K4 D0 z4 n
能够正常的工作
3 k- T8 a5 o# z' z# q5 T' O+ W5 Q5 G K' g9 |, s O! b
有看到这位弟兄的文章; C: D F& c& Z' W
我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的4 r k- L( m6 L1 T1 w" H% J
" X! Y- c: M. ]% c* `+ _. w- j/ l
- /*2 F% E' Z+ P- m3 o8 U0 t, h
- *********************************************************************************************************% P q- P! ~7 V9 r/ K4 O
- *
7 F) r$ X; E7 j+ ^1 Y. K3 j! j - * CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS
& U) A" h* q8 R: B - *
! n: e7 _2 B8 ? - * ARM-CORTEX-M74 d7 L. @$ e% X$ y9 ^; `
- *2 ~6 j i$ g, p; x& y
- * Filename : bsp_cpu.c8 H, P, Z+ P5 c- g) S( [% x( u4 B9 S
- *********************************************************************************************************5 h! d1 A) N/ n. T. i
- *// }- U! V. u7 E' i# ?1 l
% g! y# G/ u; E- T( A' f% h0 J. l+ m/ T5 z
- /*
- t# V) d+ u# K7 e. c - *********************************************************************************************************
9 c( f4 r/ B \6 F( } - * INCLUDE FILES
: a9 u q0 N3 `1 |" v& B* n5 T - *********************************************************************************************************
2 ^; s( Z& M" D# i6 D9 `6 O1 ` - */
& V$ ^% Y+ f* a% n - 0 K& l" S" ?% d* _: E
- #define CPU_BSP_MODULE1 A7 R& _6 _: W; v
- #include <cpu_core.h>5 A. D2 U% y& E
- #include "bsp_clk.h"! h. \) s' r* B# P, X
- * [* Z8 R- f( R1 k5 g; O
- " l& q+ c5 y1 r# d
- /*3 k4 I$ R" z# x; b0 y
- *********************************************************************************************************8 o9 O9 ^0 T: |/ B3 ]+ U9 K
- * LOCAL DEFINES- _2 H" E9 i9 D: \& s: v( Y2 |
- *********************************************************************************************************! e" w( s) K& u& _7 @, o- A4 U( b7 H; P
- */
1 s& o. W+ d" }7 P
0 }, D& M" {- a* ?( o' h0 K- #define CPU_BSP_REG_DEMCR (*(CPU_REG32 *)(0xE000EDFCu))" n2 G; Z- {9 p1 k6 A! ]: p( o: D
- #define CPU_BSP_REG_DWT_CR (*(CPU_REG32 *)(0xE0001000u))
: Q1 Z8 A A( u9 g5 F* V - #define CPU_BSP_REG_DWT_CYCCNT (*(CPU_REG32 *)(0xE0001004u))+ x0 L/ y' s0 {6 w# C8 t8 [/ s% b
- #define CPU_BSP_REG_DWT_LAR (*(CPU_REG32 *)(0xE0001FB0u))
! Q6 Z2 }) E; E - #define CPU_BSP_REG_DWT_LSR (*(CPU_REG32 *)(0xE0001FB4u))6 H6 w8 J! h/ t9 D- o
- 7 b% h* u4 t& y( F8 ~) {* e
- #define CPU_BSP_BIT_DWT_LSR_SLK DEF_BIT_01
7 ]* n. k5 s0 U! I2 a) n - #define CPU_BSP_BIT_DWT_LSR_SLI DEF_BIT_00
/ U2 z& U0 K5 l5 k+ {& G8 V
+ I8 ~5 e+ g4 b) X, c- #define CPU_BSP_DWT_LAR_KEY 0xC5ACCE55u' U" e* B9 e, ^4 K5 s; |/ @
3 T# Y1 G. H# a4 d" C) Q! H- //省略一部分无关的代码) m5 R2 f& I+ ]% _ }! j: @
- " V A) b! r" J9 b) S+ y3 i" ~
- //DWT定时器初始化
2 A" ^& q3 r1 R; |8 Y1 i- m. a - void CPU_TS_TmrInit (void)! A; j& Z- N( k4 @8 X8 M }9 Z
- {5 ^6 B; {0 b1 _# \0 G; E* b
- CPU_INT32U fclk_freq;
+ E6 ^/ ], w8 _# T - CPU_INT32U reg_val; L5 a x, }& P
3 C; H! {- t! R7 X7 B+ n' Y- /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */* Q$ S% B: B' E
- reg_val = CPU_BSP_REG_DWT_LSR; /* Read lock status register. */
& s# v5 r9 H4 _3 n( G, |& e, f - if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) { /* Check if Software lock control mechanism exits */
W+ T% F$ E& X - if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) { /* Check if DWT access needs to be unlocked */- K5 a8 [3 `; i: e" t' d [
- CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY; /* Unlock DWT write access. */8 ~( g {% E& B: R
- }
# |- a7 \0 T4 ^/ P& Y/ ^2 @' `4 c - }5 C* v5 _$ D; n' M! ?
1 F5 _: S% M9 D* S7 I. q$ R- fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);
9 ]: U* H% `% B4 X6 e6 S( F
! j# `9 _5 G* K, H6 d4 Z- CPU_BSP_REG_DEMCR |= DEF_BIT_24; /* Set DEM_CR_TRCENA */$ t; o5 L+ q: T) t6 Q: u$ k' B2 A: B
- CPU_BSP_REG_DWT_CR |= DEF_BIT_00; /* Set DWT_CR_CYCCNTENA */
: q! l: J$ W( n6 y) `
* n0 i9 Y# n) k( {5 w- CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
z0 J/ e' u5 h# X% J2 k' a, ` - }
7 T' ?! t' S& f$ T% p8 ?: o- J2 q
复制代码
- r' g; I0 p6 T/ |; fUCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作3 D5 R/ D' w5 S) y: e( a
这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样
2 ]6 v+ I- I4 \+ D" v0 }5 ]0 f/ k3 }% P
- void dwt_init(uint32_t clk) e$ X" a) `0 T; _/ k% g
- {2 W, d0 `1 v. Z4 ] D$ p( N- M
- cpuclkfeq = clk;
7 F/ r9 F8 W1 o2 n - DWT_LAR |= DWT_LAR_UNLOCK;( R* j. ^- \& n1 N* f
- DEM_CR |= (uint32_t)DEM_CR_TRCENA;
- m" t3 y1 F5 h- E0 | _8 ] - DWT_CYCCNT = (uint32_t)0u;
0 \0 k: K/ c0 g - DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;( }& ~8 C, N7 U! p$ R
- }
复制代码
( \( [. {& y1 ? u* L Y我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题
- e- n% a! D( q我有点怀疑是不是那个软件读取要不要解锁的操作的影响。: B0 P: p7 K' O2 K7 U# R7 t/ i0 ]
卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来/ v1 O/ p' d: X# G
我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的
; d2 I! o _$ Q6 o) F8 Q, a. |! M* w/ P" V8 N% b( D" e
$ U% ^3 `, L8 u5 E |