有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章- p2 m) y1 ^9 n$ M( \+ ^
1 R& [6 I4 a' \% ~& u) L
时间是很精确
* M. ]0 l* b) q e) w/ q还能省掉一个定时器和对应的中断, B5 ^0 |0 S9 @4 r1 N1 m
美滋滋
1 [1 k4 n# [/ p& r4 U
& N# P8 m* h5 x- a, G但是很奇怪的现象是# c4 Y5 o$ b& y1 v4 \& Y; [
: H2 e8 u5 D8 J; IF7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象
! R$ Z; M/ x5 r, W" H我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故
8 V3 t5 n2 l) f3 r
) E; @! I5 n8 i% P! d但是很有意思的是
: q, _4 d W' }% F" Z) }/ u在M4内核的芯片上同样的程序却没有这个现象
7 A2 B. v ]+ G- R6 i# Z/ @能够正常的工作 c9 C6 |, s( K5 `" @
) [. u- U. I: l4 {8 ^
有看到这位弟兄的文章
# {5 a2 l' E' j& A2 a+ g; D( M6 x/ I我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的4 S: k1 }0 H) r3 P
" K. W( E" o5 X2 s- /*" I7 n7 W, N; b* o" I9 b
- *********************************************************************************************************) g7 r" d+ d3 f' ]& t! j
- *: u2 o5 u' a- D1 |0 n
- * CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS3 D- c" M9 n; X# C; Q- _( Z
- *1 m: H5 h. r, H3 F8 Q; l
- * ARM-CORTEX-M7
- j/ v( s V4 V$ a9 g/ k) F - *0 z' ?& o7 Y5 _: N6 y2 X8 ?
- * Filename : bsp_cpu.c2 F1 l/ D& H+ ]# X, Z- A
- *********************************************************************************************************
( I: r* Y3 U3 X0 N3 x - */' r; x5 a2 {2 G3 L) K) T5 O
- 2 A8 K5 k! @ ?0 d! a4 U9 o
, {5 z) Q4 |! u# L9 `( z$ \- /*
0 S/ O4 c$ l3 D. i - *********************************************************************************************************
/ F( p0 U) J9 _- V - * INCLUDE FILES* Z9 I0 ]% K5 C) q7 `
- *********************************************************************************************************4 Z+ I; F1 E2 e* ]6 \# C5 A) [
- */4 o; `) G; d! J8 q& E2 ^
8 N5 R* Q3 s+ }( |- _$ e7 ?* _) ^, O- #define CPU_BSP_MODULE
- e8 {: [3 o1 \9 Y* {" c - #include <cpu_core.h>
) B5 E; X$ ^( ? - #include "bsp_clk.h"
5 e% _5 z. H) }, m
0 F" h) U6 ?& h/ [$ _
3 I3 X: E& \# h6 |; _8 v- /*# P: ?6 r5 ~" Q2 r
- *********************************************************************************************************
& H- X$ a/ a5 d' L4 ~6 y( ] - * LOCAL DEFINES
! x9 y" c6 ?" ^ - *********************************************************************************************************
* P: s: y8 _6 p' K - */) v! n" `& U1 |: H: ?" p" \% X3 P
4 a# X7 `1 \# D: ~& _: @- #define CPU_BSP_REG_DEMCR (*(CPU_REG32 *)(0xE000EDFCu))1 ]9 D8 q6 ]# L
- #define CPU_BSP_REG_DWT_CR (*(CPU_REG32 *)(0xE0001000u))
$ @- J) z" T* T5 r& T - #define CPU_BSP_REG_DWT_CYCCNT (*(CPU_REG32 *)(0xE0001004u))
4 f7 B7 o! T) K* k6 E* @( D+ K/ A - #define CPU_BSP_REG_DWT_LAR (*(CPU_REG32 *)(0xE0001FB0u))
7 C$ U; R8 I' ]! i# M1 l - #define CPU_BSP_REG_DWT_LSR (*(CPU_REG32 *)(0xE0001FB4u)): d& S. `5 U/ [
4 G0 F; C& \' ]. K, q8 Y# b- r- #define CPU_BSP_BIT_DWT_LSR_SLK DEF_BIT_01
Z. z& U5 P4 o8 y2 f - #define CPU_BSP_BIT_DWT_LSR_SLI DEF_BIT_00
: o# _( v0 v# U/ A# e - - p& v" }* Y' C! M1 z# b
- #define CPU_BSP_DWT_LAR_KEY 0xC5ACCE55u+ {, y7 j8 Y+ m* Q; @5 X7 a
- 6 C( Q' v/ S0 h3 a8 E
- //省略一部分无关的代码
: Z* A- k& B9 C: J+ j% C - ; h+ P! Q+ z0 G5 |! ?
- //DWT定时器初始化
/ l( h" A) j8 m2 J - void CPU_TS_TmrInit (void)
% v9 s% ^7 ]8 L8 j- X2 t0 g0 a - {
8 L5 C9 j1 s/ b1 b0 u - CPU_INT32U fclk_freq;
( s# M' U$ {% {, c. e4 _ - CPU_INT32U reg_val;
: E% I( E- H* u1 I! r
$ B) o4 B' d) S- L. r: _* N' @- /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */
( S, `& h! {/ |* q - reg_val = CPU_BSP_REG_DWT_LSR; /* Read lock status register. */
+ X* A+ g! ~. _3 z& S, |/ ` - if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) { /* Check if Software lock control mechanism exits */6 o$ p9 Q# P6 [! D4 l2 d" r
- if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) { /* Check if DWT access needs to be unlocked */
4 J5 g: Y4 n! W- W! ~ - CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY; /* Unlock DWT write access. */. I) j* a. [) g/ H& R" q6 K
- }2 X7 Y4 K: q& F3 r" r) H+ o' i
- }5 n' M1 @; \5 B- C! D
- A6 k* i' Y$ E# ~: W$ H
- fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);) J7 A$ [ w, ^
- + ] C2 m; |% T3 P
- CPU_BSP_REG_DEMCR |= DEF_BIT_24; /* Set DEM_CR_TRCENA */# S2 a2 M5 F4 o% r
- CPU_BSP_REG_DWT_CR |= DEF_BIT_00; /* Set DWT_CR_CYCCNTENA */0 B0 G2 f$ a/ i3 g G3 w- J+ n3 p
; g3 y& g* A; e" j& n# P- CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
f) A/ y: n, c& s) r - }
7 e# b! k% s. w' }2 O" H& y! J( l
复制代码 ! V9 u! x) k' O. T
UCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作$ G& e" P5 v7 g# B( p
这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样- y6 q5 a7 s9 D
$ ^2 ?" |9 S) G- J' X- void dwt_init(uint32_t clk)
- c/ y, n) h8 E* I - {
* Y9 ]7 v" C" ~8 O9 u) k - cpuclkfeq = clk;9 v: N" M) Z; J
- DWT_LAR |= DWT_LAR_UNLOCK;
6 s- u2 }* c) O" B7 l" ^ - DEM_CR |= (uint32_t)DEM_CR_TRCENA;
( {/ G+ `& G7 i+ @& j - DWT_CYCCNT = (uint32_t)0u;
( k( \$ D% o" r8 X3 |9 ~ - DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;. G0 R! D. ?5 ]! f
- }
复制代码
& h$ [! y( T% @( r, L' [! j我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题
! |0 ~- N# s( O3 a! [' d我有点怀疑是不是那个软件读取要不要解锁的操作的影响。
0 E4 T7 W$ Q) y! E9 K5 ]卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来
L; G( ?2 w& D我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的8 n3 k3 \1 D: j8 A) \* c& G
: N! ~! j# H; Q3 d* M4 ~7 ]. L
9 b' N0 }- J/ }0 ]1 Y* X; J |