你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32小技巧】+使用DWT代替定时器作为时基

[复制链接]
一个脑子不够用 发布时间:2022-10-2 10:29
#include "bsp.h"
2 h7 i- b3 H+ G) M: l1 V$ A2 w
. i5 m/ |: _: o: W3 F#define  DEM_CR_TRCENA               (1 << 24)
# i6 d! n, u3 {# o  N1 e1 L#define  DWT_CR_CYCCNTENA            (1 <<  0)' v: w% K' |) D
! i: X- A4 P5 i! |7 t9 S1 ~
! P' ~- _" V9 d2 \7 B- x* k8 R
/**
: ~4 `2 v$ ~+ P4 O+ M( P; q * @description: 初始化DWT,被Bsp_Init调用: @: k. n$ B/ l1 G  @
* @return {*}, d! g8 K9 [6 c* I
*/
1 b8 ~2 C, u+ x6 j) ?% J. J* k) Vvoid Bsp_Dwt_Init(void). l; D" c) H$ H/ \. D" K# G6 m4 o
{2 ~. ]8 k; S& U  j# z
        DEM_CR         |= (unsigned int)DEM_CR_TRCENA;   /* Enable Cortex-M's DWT CYCCNT reg. */! g8 x, }1 N! X4 |$ j' S" W
        DWT_CYCCNT      = (unsigned int)0u;: c6 d  f' n  g2 o$ a3 I( n* w
        DWT_CR         |= (unsigned int)DWT_CR_CYCCNTENA;# q  b) |5 f, {  I- k4 o, I
}5 X/ S9 x/ ?+ M" F

8 J1 N* ?1 Q+ S% G+ E% mvoid Bsp_Delay_Ms(uint32_t _ms)
0 ~1 M% b/ J( Q! u1 N/ E. q* g" I6 x{
# K1 d6 n1 F% |     Bsp_Delay_Us(1000* _ms);) ^  o$ g8 n/ w: B4 U7 z
}
/ i) X+ K0 [8 O5 Y7 Y& G; |4 F$ `
void Bsp_Delay_Us(uint32_t _us)
* H5 o% f: |0 y: L% K/ Q{! A/ [5 F8 o+ B* s$ X+ e: H, u+ y
    uint32_t tCnt, tDelayCnt;
; L/ Y' k7 M$ ]2 E' R- `        uint32_t tStart;/ E2 K/ ]+ @& _' X9 B2 W
                : R- s) A9 m$ F3 N5 V# a! L/ ~
        tStart = DWT_CYCCNT;                                     /* 刚进入时的计数器值 */
8 Q2 V( d- Z" b  G' q9 a        tCnt = 0;0 c9 q# V# W/ n" Y# E' t2 ~
        tDelayCnt = _us * (SystemCoreClock / 1000000);         /* 需要的节拍数 */                       
( b7 W. z2 c! F$ N$ K
2 d: i; c2 G0 Q1 ^$ G        while(tCnt < tDelayCnt)1 b, w" H  K( Z$ l6 x$ z& p+ o
        {* \. j# K6 P! J5 b4 n% Q, V/ N
                tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */        , V# L. T$ j1 ^+ z0 L
        }
* h8 I, v' h/ G( I3 T- l* D, A}
. S9 H0 D2 P1 w! R1 L9 d* e
0 }& U. Y7 q" f% @2 }2 A$ g/ Z
3 S7 {" I/ s2 w  j0 M& ]; N: Yvoid Bsp_Delay_Dwt(uint32_t _dwt)
: P! F( j  y2 [4 R: T( j* d{
' T5 y- N; s* q! }. |2 Y    uint32_t tCnt, tDelayCnt;
, ~5 h- K( A) h" \2 |4 C# A        uint32_t tStart;
; J* R8 v3 o7 r) ~0 _8 u                0 z1 Q. M9 I2 e& _7 F* h1 R+ X5 S
        tCnt = 0;
9 Q  ^5 r$ t/ t/ @: r        tDelayCnt = _dwt;         /* 需要的节拍数 */                       " k- I9 K* P' z3 R% m$ x' j0 O
        tStart = DWT_CYCCNT;         /* 刚进入时的计数器值 */
0 M& |5 ^; A: a; N/ @7 Y  T        * C! H* k+ V" v8 b. r! \5 D8 ]9 `
        while(tCnt < tDelayCnt)2 V8 s# V- x/ C& ]/ l
        {* E/ Y0 r: h( l8 f# |/ N9 x9 o2 @8 i
                tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */        
, D: G- c) R$ Z/ K        }5 Z1 m) k4 T: }3 V4 j" U: w
}
# [) j+ A* q$ a/ H3 Q1 Q, o  S$ ]2 B" K. h# p9 R
* i. o" S# X" D2 N% k1 j9 ?5 @
void HAL_Delay(uint32_t Delay)2 {# ~5 F0 [0 ^1 t
{
4 j# A% P1 k  j1 a6 j& m        Bsp_Delay_Ms(Delay);
1 ?# m. f! _) o  m; K! h}5 c. K5 u( c4 s+ I  @' F; }
+ ]8 L" r( w6 ^: W  F1 E& ]1 x
HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)
$ Z1 y1 p. ^$ S! W' e! ^2 D) |{2 q' f9 m$ W' _$ M1 o
        return HAL_OK;3 y# k/ ]  H5 Q
}9 a0 @$ `. v. {$ A! X% }

; q. H0 o# K2 O& auint32_t HAL_GetTick (void)
' J  [& F- K" }0 P{3 J/ U: Q7 }. w2 H& X$ g
        static uint32_t ticks = 0U;6 E5 D) W  O2 ^( v' E
        uint32_t i;
7 D  }  \, t! V" D) a$ s
: V+ K7 h0 y2 t        if (osKernelGetState () == osKernelRunning)
! y$ |" I, y0 h# C' f        {0 _9 d# ^: z* Z0 S
                return ((uint32_t)osKernelGetTickCount ());
. a; M% O4 g, S/ z  x! C, w        }
# b/ `; w0 F6 G: E: p! r( i# u1 w$ D/ H
        /* 如果RTX5还没有运行,采用下面方式 *// F+ M9 @4 s% D6 H' ]& H
        for (i = (SystemCoreClock >> 14U); i > 0U; i--)
* \! b7 k( S/ ]  C) [; |        {
+ a6 @6 o, [  N  t- l( p" T                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();' u5 m& `& w/ Y* r- C/ K
                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();7 R2 U$ X% z& A5 h# V8 P+ r
        }* j2 d* Q; k: v
        
' ^0 V$ x% ~" ?% H; {        return ++ticks;
5 w1 l! r, S9 ~/ r! ]}
% q1 W- ^8 S# @8 O2 ]8 r5 o3 z/ a* o/ y3 L
% \4 m; U1 o. f5 M
收藏 评论0 发布时间:2022-10-2 10:29

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版