有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章1 V% `8 X. a; v4 Z `$ ^' f
! a! N& [+ p0 j% b8 U5 M$ Z
时间是很精确2 T- o* q) ~0 w% H" N$ E1 ?( k% C
还能省掉一个定时器和对应的中断# n3 e% }7 W0 l; p
美滋滋. S2 z7 d. V6 C
. h* E! t+ v4 ^; ]# v但是很奇怪的现象是% a2 y2 ]3 L% `! P
( q$ `/ P1 `5 E% h$ AF7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象* o [( [4 V, J' G6 X4 g
我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故
; \- r' M5 E# M: @7 A* g
) O8 H: ^! W+ m3 Z但是很有意思的是
# o' M5 o, G( Y2 i1 s在M4内核的芯片上同样的程序却没有这个现象
( z3 W3 q4 y$ }能够正常的工作0 Z* O( H$ Z F3 a# m9 y
2 _& y' W# |& U# O4 O9 D/ Z有看到这位弟兄的文章
; N/ t7 N& C2 a) V我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的
* U) Y% l9 A! S$ z% u
; Z) n7 h. B9 h: ~5 L. M. X/ H- /*
9 |) n8 T. e' B ]0 D - *********************************************************************************************************5 s" O1 T7 N- S; E3 k. p! Z
- *
" E2 P9 {$ E' U9 v - * CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS5 e. g/ x5 S! U5 d( {/ w
- *
( F. e" n P: e0 p' A - * ARM-CORTEX-M75 X6 P3 v2 v$ ^8 |5 A0 k
- *+ {8 p% P* L& T9 n
- * Filename : bsp_cpu.c
. K0 y% \' C i' F - *********************************************************************************************************
2 R6 A$ Z& B4 d) g# m+ k4 P - */4 [7 g: v' W) x5 W
( D# L1 \: c3 A" D( l% T- 4 A; ` v5 r _* S1 n' J4 h
- /*$ L+ w' a7 U/ O4 k% r
- *********************************************************************************************************
/ H/ `! r' R9 ^ - * INCLUDE FILES
7 m2 p3 a3 [( v: F - *********************************************************************************************************# g$ O/ o" g0 |- b7 j
- *// |7 j7 I B+ y0 |* f/ i9 f
9 a C" F" H0 p7 E I- #define CPU_BSP_MODULE( z& w% @5 o' \3 H; t
- #include <cpu_core.h>9 w) z: b1 N# K* B
- #include "bsp_clk.h"
4 F/ r) P9 d; d# I- Y - 4 l; N4 v' L3 s) ~$ P. t' r$ K
- : Y6 y6 D& E3 Y, ]
- /*! e8 P( O4 c' Z/ m$ b( B
- *********************************************************************************************************$ `$ z5 S: V% V/ ^6 z& s
- * LOCAL DEFINES
/ C4 L! K% b' @! f2 a - *********************************************************************************************************
0 O% \6 T" J% f - */+ n ~2 |/ P2 o2 F$ o7 G& U
9 `+ F4 d) G4 q+ Z; \# G7 l- #define CPU_BSP_REG_DEMCR (*(CPU_REG32 *)(0xE000EDFCu))
+ ]$ y" s. o+ \4 _7 }6 H' ^ u# T - #define CPU_BSP_REG_DWT_CR (*(CPU_REG32 *)(0xE0001000u))
2 J3 f6 _( F: h$ y. i - #define CPU_BSP_REG_DWT_CYCCNT (*(CPU_REG32 *)(0xE0001004u))
: c' ^7 j! E) f, ?& F - #define CPU_BSP_REG_DWT_LAR (*(CPU_REG32 *)(0xE0001FB0u))
2 _7 ~2 j7 I' {7 [) L3 G - #define CPU_BSP_REG_DWT_LSR (*(CPU_REG32 *)(0xE0001FB4u))
. T2 l( b7 C! K6 K - ( l; a2 M0 r; w9 K7 \
- #define CPU_BSP_BIT_DWT_LSR_SLK DEF_BIT_01% `" ^& n% v! J+ r" p/ {9 u2 M
- #define CPU_BSP_BIT_DWT_LSR_SLI DEF_BIT_00, {: y& b' B# Y: c1 V0 F
- ) ~2 K/ p1 C6 z) v9 B U: b6 M
- #define CPU_BSP_DWT_LAR_KEY 0xC5ACCE55u
; f/ e% R: ]# M+ V( U
G; @! d2 z. C: M2 x- //省略一部分无关的代码
$ N! z0 m4 N$ P3 {) n4 {
1 a; e0 f [5 O9 v2 y* O$ G- //DWT定时器初始化
+ a/ S' A( _* ~! t7 P - void CPU_TS_TmrInit (void)7 N5 p* o S+ _0 T- g! a
- {
5 Q$ a: L# H: @' f - CPU_INT32U fclk_freq;
, q# B7 V! @: J0 }2 q: e4 b/ J - CPU_INT32U reg_val;
. s0 n0 x! k7 P
5 V# C H$ D8 s, Q- /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */
8 @6 U# a0 D, A& Y: | - reg_val = CPU_BSP_REG_DWT_LSR; /* Read lock status register. */! d2 A8 G9 W; D8 b0 ]
- if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) { /* Check if Software lock control mechanism exits */) f) J* @: w7 t( D# A# J4 J+ y
- if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) { /* Check if DWT access needs to be unlocked */, c P- `: | Z1 K4 g$ \
- CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY; /* Unlock DWT write access. */5 W: D% C( _; e# P5 [: U
- }9 _& \2 T' B$ ~& s: @/ @
- }( E3 U8 |0 w& q0 v/ z) {
: l3 G# E9 m- F+ P- A, T8 I- fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);! w! \& x5 }' v/ M J" }
- 9 E# J7 I0 m! }% S# I$ Q$ C" K
- CPU_BSP_REG_DEMCR |= DEF_BIT_24; /* Set DEM_CR_TRCENA */* z8 \1 L) h5 i$ [+ }% f: h
- CPU_BSP_REG_DWT_CR |= DEF_BIT_00; /* Set DWT_CR_CYCCNTENA */2 t# t6 e1 s C( M
6 N6 c" _7 V$ p- CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
- p% m+ @6 A! {/ y) w( O5 d - }' Z! q0 h3 ~/ Y+ V3 z5 ^
复制代码
( U9 X$ f# C) B% G, D) Q/ E: gUCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作
* T3 @- ]) k6 J6 O+ A! w这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样: `: y. l: n4 a. U' N( _$ u3 b h
6 P) P* Q' K4 B: m0 m6 k- void dwt_init(uint32_t clk)
. ]# S5 @4 B& P( ]1 b - {
7 R5 z' J0 x- K7 G - cpuclkfeq = clk;8 z, w+ y! `3 [% ?' I9 n. X
- DWT_LAR |= DWT_LAR_UNLOCK;
4 `: t( D1 V( L2 ^ - DEM_CR |= (uint32_t)DEM_CR_TRCENA;
/ b! X1 {( y% P9 m - DWT_CYCCNT = (uint32_t)0u;1 o( @+ V- r; m F/ j& |8 _
- DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;, J1 t: R+ p! E% s) B
- }
复制代码 / V+ K4 l& m- A! s) a2 s
我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题
) J& m+ A# m0 a9 ~5 Y: i" t我有点怀疑是不是那个软件读取要不要解锁的操作的影响。
! W$ w: |6 Q) |3 V卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来6 d9 _: ^) f! }
我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的4 x+ _# S+ G# S( P6 h
5 ^3 m8 O/ [8 P$ `$ s
4 N) m0 T) d3 V" X+ I7 I |