有读过关于M核的芯片都可以使用内核DWT调试组件为整个系统提供时间基准的文章
- V2 G4 R; ^ x6 D4 v" E( J8 ?
时间是很精确
) b6 P6 Z8 g, t4 L @& r5 W还能省掉一个定时器和对应的中断
) [- a) g* |) Q5 v. n美滋滋
# e4 g5 [. a% H0 u3 e! Z( E9 g) H( O# g1 ?- i) y4 y
但是很奇怪的现象是. v9 f& x9 e' }# W
6 L2 s+ U2 {& T
F7【M7内核】使用后会导致程序在上电以后不能正常运行会卡住,然后复位以后就能正常工作的奇怪现象8 b" ?, N j0 [0 n0 h) K
我把业务逻辑全部去掉,只剩最最基本的时钟初始化后,依然如故
! O3 n @$ Q4 V7 o% w/ M# F2 @9 H7 j* x) J. C, |5 r, B
但是很有意思的是
0 i' t1 Z- L7 Q' c在M4内核的芯片上同样的程序却没有这个现象
& E3 T! g2 q! }1 P- ^! J1 Y能够正常的工作/ B8 C% e3 M y" F
/ w; K1 r& h7 S* z有看到这位弟兄的文章
& O0 n+ A" i% e我自己的DWT初始化代码是从UCOS-III内核【bsp_cpu.c】搬运来的# } [1 L4 z" L" N4 Z5 H
9 ~, K3 s! w: M9 F) Z: M
- /*
: ]$ d- P2 W% \5 v6 _; r; k - *********************************************************************************************************1 _1 ]/ O5 W/ b* C8 @
- *
3 h( Q9 V) Z- j+ x5 l1 S! \ - * CPU BOARD SUPPORT PACKAGE (BSP) FUNCTIONS q/ Q3 `4 l/ M4 l9 @3 e/ u
- *- ]2 O' H7 ?0 P' ]8 z8 O( o" D
- * ARM-CORTEX-M7
- V, D7 C I! }3 z% B - *
# Z8 b/ s6 A3 J$ A - * Filename : bsp_cpu.c# W* }0 Y& z$ r8 B* W
- *********************************************************************************************************, C8 e% u) x8 o5 O
- */
% A1 u- A+ U3 g
; K% n% _" x8 Q$ W T2 C- * W3 d: S2 }2 i4 |
- /*
6 p" \' ^* d: M: F! g- | - ********************************************************************************************************* ?3 m: {" e: I0 Q: [
- * INCLUDE FILES
( K, ]" @8 t7 e- j - *********************************************************************************************************
+ \) n. e f0 ^3 X* N. \ - */
) ]$ S: r+ ?; S8 _
) T( z6 C$ \7 J" T- #define CPU_BSP_MODULE! G' O$ P4 H# k- d
- #include <cpu_core.h>2 g/ {8 ~ b; O
- #include "bsp_clk.h"( e0 b e1 V4 H% ~! @
. _6 |7 v" H/ T2 m- / N! c. y6 w% U$ r8 i, K
- /*, n$ t3 K2 Q% D9 t8 [# e+ F7 G
- *********************************************************************************************************3 h' Z& M0 y7 \' l" \/ ~
- * LOCAL DEFINES
# S3 m$ C7 A {& ` - *********************************************************************************************************
! F0 M6 Y' b ~9 b# `/ ~ - */
2 w' Z& f1 D |, o; b4 g - 9 f6 d! c9 Z5 |4 E9 S
- #define CPU_BSP_REG_DEMCR (*(CPU_REG32 *)(0xE000EDFCu))
6 X* ^8 g7 J3 P( v2 a0 D - #define CPU_BSP_REG_DWT_CR (*(CPU_REG32 *)(0xE0001000u))
% H9 b6 `: ~4 P7 V8 Q6 `8 A - #define CPU_BSP_REG_DWT_CYCCNT (*(CPU_REG32 *)(0xE0001004u))$ K) ?" k. |. V( K5 G' i2 n$ |
- #define CPU_BSP_REG_DWT_LAR (*(CPU_REG32 *)(0xE0001FB0u))
% K/ K+ y8 E) y& n3 Z - #define CPU_BSP_REG_DWT_LSR (*(CPU_REG32 *)(0xE0001FB4u))0 r' X2 z1 u1 f1 H/ z' g
" `" T* A; Q: Z- #define CPU_BSP_BIT_DWT_LSR_SLK DEF_BIT_01) F6 x8 [ h; J- O. D- }( ]
- #define CPU_BSP_BIT_DWT_LSR_SLI DEF_BIT_00" T+ G1 U3 n7 o8 ]
- 1 K# e! `9 l0 N' G l, \
- #define CPU_BSP_DWT_LAR_KEY 0xC5ACCE55u
2 K, N+ H; H9 e6 |
' {' k' L1 d& N1 n! M" `) `+ y7 Z- //省略一部分无关的代码+ U+ _5 S- R7 d( r5 J7 C1 Y2 u3 W
- * X" l! p2 d& \# Q( j
- //DWT定时器初始化3 @# t9 g& ?5 ^7 @7 `! N6 {8 Z2 i5 Q
- void CPU_TS_TmrInit (void)+ [& Q. l; s" f2 P* d
- {
6 H( f! ^3 T9 V3 n6 r4 Y - CPU_INT32U fclk_freq;
5 j; n: P2 @4 ?/ `0 Y - CPU_INT32U reg_val;
- q# C3 z B) W - / x+ M; K% m3 u. c0 u
- /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */" E' T3 f" ^7 N( r9 l. J! }: k
- reg_val = CPU_BSP_REG_DWT_LSR; /* Read lock status register. */7 f+ V' X2 `" ~* f
- if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) { /* Check if Software lock control mechanism exits */
5 g/ S" v. @6 m6 _8 u1 D - if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) { /* Check if DWT access needs to be unlocked */5 ^7 g9 b( c& p# y: Y
- CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY; /* Unlock DWT write access. */
2 F8 K& @+ O8 F0 Z - }6 C2 w+ L! c. H+ r
- }, ^) @6 X8 u* ^* s- w$ N5 x( \
; D+ w* \$ B' o/ E$ @- p- fclk_freq = BSP_ClkFreqGet(CLK_ID_SYSCLK);' L+ \% _$ a# g5 x6 _$ C. W
/ b3 ]$ Q% n( g8 e! U6 H, A- CPU_BSP_REG_DEMCR |= DEF_BIT_24; /* Set DEM_CR_TRCENA */
2 ~- e6 D9 Q* Z4 N( g1 n - CPU_BSP_REG_DWT_CR |= DEF_BIT_00; /* Set DWT_CR_CYCCNTENA */
9 A! D3 _' H" r0 W' N h - n' c0 W( y s
- CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);3 c' {: s0 k* O B. z, R
- }, w5 q! a: l g. d ?( W' [$ L& s
复制代码
- V# K$ U) W7 u% oUCOS-III的这段DWT初始化,它是要一个软件判断需不需要解锁的操作' G [9 e" d2 y3 y! p+ H
这个弟兄的代码是直接上来就解锁的,然后它多了一个清除CYCCNT的操作,似乎其他和UCOS-III那部分代码一样
" u( v8 Y t/ B0 x7 f# L$ A# ~) h9 a) h: I$ ?, }
- void dwt_init(uint32_t clk)
6 w1 Y# s- f# ]- y7 ] - {
% c* q& n: e; U4 U6 c: n - cpuclkfeq = clk;* ~% |: G# ` X% U
- DWT_LAR |= DWT_LAR_UNLOCK;! N8 p2 Y, B1 f
- DEM_CR |= (uint32_t)DEM_CR_TRCENA;3 @6 K- m. E h+ S: y: G4 z1 d
- DWT_CYCCNT = (uint32_t)0u;
2 p' J6 \1 I6 K2 O% `4 \. S. [ - DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;. X( T* W3 s* j6 Y# T
- }
复制代码
; f9 |" d' W, R8 @我试了试他的代码,似乎它没有之前用UCOS这个初始化的那个上电运行有关DWT延时功能的代码卡住的奇怪问题+ g; ?4 t4 ^2 @% p9 B/ J; j
我有点怀疑是不是那个软件读取要不要解锁的操作的影响。
1 z0 ^% R7 r% w/ u* F$ d" {卡住的原因多半是没有解锁,导致寄存器没有递增,导致循环卡住退不出来
& v; U4 Y4 J5 y n6 w+ c我感觉这个代码应该是OK了吧,我现在是拿手边的一块H7核心板测的' {9 T! Z( @$ t+ r# y3 k
) {9 q7 q+ s2 _1 B1 E n$ x% S
* S+ q0 v3 B/ I( [5 d |