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

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

[复制链接]
一个脑子不够用 发布时间:2022-10-2 10:29
#include "bsp.h"! r6 o+ |9 u0 B, ]( |% y

/ q/ s) q$ n6 h#define  DEM_CR_TRCENA               (1 << 24)
: ^7 F' E; l) d1 A/ ^2 @% R#define  DWT_CR_CYCCNTENA            (1 <<  0)
7 s- a1 W* T: f3 S" a7 k  e
' z1 z& T( \+ e" t% X2 ]2 a$ n3 y7 [; ^% J1 K7 u" q
/**
2 D0 ?  ~" r0 Q0 y9 X, X4 X& D) | * @description: 初始化DWT,被Bsp_Init调用" x* @3 r4 q; `: h8 [
* @return {*}4 X. @. x5 {2 v! a5 A) Y
*/" f: @. N3 L4 p; f. V* j) E
void Bsp_Dwt_Init(void)3 F" _) @+ T6 p) h# p1 z
{4 {9 U7 \3 c7 K1 h' w) @3 u
        DEM_CR         |= (unsigned int)DEM_CR_TRCENA;   /* Enable Cortex-M's DWT CYCCNT reg. */
! y( M& O- }, D9 m        DWT_CYCCNT      = (unsigned int)0u;6 t5 [4 q5 l5 Z
        DWT_CR         |= (unsigned int)DWT_CR_CYCCNTENA;
7 N5 B  s1 @0 T0 Z}; O# e% L, i$ Z
. B% v5 A7 D3 \1 c, A, w: A+ b$ d
void Bsp_Delay_Ms(uint32_t _ms) ! R# D. S: t( O# |! q
{2 b$ J% G2 g; z* W5 D3 ~
     Bsp_Delay_Us(1000* _ms);
( T" t0 \4 ?" V+ T6 w# ~  o8 Q}* k$ q+ W+ ^! l) B
" l% g3 N" V" F% o6 B3 _7 E
void Bsp_Delay_Us(uint32_t _us)
: c- S2 _1 Y, P, U+ t4 n* c7 Z7 t{" |+ r% g& d  w& Q8 z
    uint32_t tCnt, tDelayCnt;
* Z6 E* T8 I/ G; g! Z- V9 j1 C' O) w        uint32_t tStart;) ~) E# Z/ }# n5 t- e
               
9 O2 y* f* d; C        tStart = DWT_CYCCNT;                                     /* 刚进入时的计数器值 */
( t$ G& r7 I; ^$ S  N+ u        tCnt = 0;
8 Q4 c6 J) j( ^( f; u4 L        tDelayCnt = _us * (SystemCoreClock / 1000000);         /* 需要的节拍数 */                       6 \) ^- _( k7 B% o3 ~+ a5 T6 L
, c3 |! f6 }/ M. \
        while(tCnt < tDelayCnt)" a  C. d2 J$ [; X5 l; _
        {  E. g( j- V2 }5 q: W$ z$ E' t
                tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */        
- F( ~. Z% i! `: d5 z% S& c        }
5 Y( j  q, ]8 d$ Z}! M% i% T% o  _" K- G

6 P* v5 u! g% r! w0 f6 l! W/ Z2 z9 S; R# o  D& X
void Bsp_Delay_Dwt(uint32_t _dwt)
- K5 T: @) r2 A- d{7 L' l: n2 D) H$ Y6 h; y% Y: X
    uint32_t tCnt, tDelayCnt;0 i+ t% V  U6 Y
        uint32_t tStart;
; R) w7 [3 w" p2 Z9 m. H                ; [; M3 x6 F6 O1 p. i- q9 N" V& \. P" z
        tCnt = 0;
, Q5 P. [& t: x4 D$ z+ q& I        tDelayCnt = _dwt;         /* 需要的节拍数 */                       6 |+ x: T, R5 e6 _" I
        tStart = DWT_CYCCNT;         /* 刚进入时的计数器值 */7 h1 ~  x4 {5 Z; f  n( k4 X
        
$ Y: \8 T  e" h( n' X) m' b        while(tCnt < tDelayCnt)
4 G- x2 K$ p/ @8 q. \+ c$ I& U        {
$ g+ ?& ~. }$ N2 K" k, X6 K4 D: R                tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */        ( l5 W# [9 i; ?, J; A2 O, j6 {
        }
* z1 M' j8 P6 [; k}
9 ]. M6 @, d4 l# G% L9 P
/ o+ N. g7 U" f/ t% o& u: b* D
! M' C. a4 ]4 B8 }7 Cvoid HAL_Delay(uint32_t Delay)
. ?# G& E. P4 W! y{% N* X: `8 r5 Y2 E% f5 T
        Bsp_Delay_Ms(Delay);8 o; [+ s; i1 {& I
}' p' n/ Y- L! e- B0 ?

3 B+ A7 D! o7 W& F4 m' z# ^HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)# {; T& s7 [9 i# E3 w" E6 w
{2 c. F# v7 y3 ^
        return HAL_OK;) G0 p1 Q# v+ n7 k2 }" _
}
/ W  H. O! O! Z7 U- Z" h3 J! J9 m9 N7 {
9 t" s/ z0 P# u1 ~4 \, duint32_t HAL_GetTick (void) ' @3 u- Z# W. X" w
{
) K$ q, ^- ~1 g( S' G        static uint32_t ticks = 0U;
6 T0 H3 ~' t2 h0 B4 q8 S, R        uint32_t i;  P* U# {( z0 a( s+ `  x

: g6 ~6 _7 F# e8 `        if (osKernelGetState () == osKernelRunning)
) c7 B2 @1 T; o4 k, g1 _( T1 J        {
, \- r! B8 l- B2 G. B' e                return ((uint32_t)osKernelGetTickCount ());
) v, y" A' e9 X1 y9 A% C( N        }6 v( C, ~3 ^8 L3 Y8 F# Z2 g

4 x7 E+ j9 s8 l  z( e8 o- k. q3 y        /* 如果RTX5还没有运行,采用下面方式 */
* |6 A0 z% D- U1 z        for (i = (SystemCoreClock >> 14U); i > 0U; i--) 0 o* y0 P+ F  b5 a& B
        {1 s, ^3 {1 ]3 e) [% s% K
                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
0 z& O7 U8 g% P  G3 M                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();1 G4 h, h$ c1 R# P& A
        }8 S0 T5 P! m0 B
        
7 n; Z1 ]8 {1 ]2 q        return ++ticks;
& G; Z; ]5 W) N% T/ [0 O- O/ T}7 d' A$ U7 I3 R' b  F8 I9 q

+ E, w1 m5 k; a. U6 ?) z* k  l$ l) @# S5 m3 a6 h. V4 |1 D
收藏 评论0 发布时间:2022-10-2 10:29

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版