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

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

[复制链接]
一个脑子不够用 发布时间:2022-10-2 10:29
#include "bsp.h"
! C; R: d1 {( g; |' R
# k1 @! p# W/ h6 j5 Y7 b* f+ E#define  DEM_CR_TRCENA               (1 << 24), A* s- z. T& ?: h
#define  DWT_CR_CYCCNTENA            (1 <<  0)! j( H. K4 c7 K1 L8 {* S6 ^1 f1 h

) y" I- @, _+ x2 K4 o3 L+ P, D% M2 }% b+ J, Z% s
/**! z8 q( E/ ^( D6 ]9 E3 Z% Z
* @description: 初始化DWT,被Bsp_Init调用
* j% L' \. Z$ J" I * @return {*}7 o0 R9 F3 c" Q6 g' f$ Q) p4 ?
*/
" G; ^& M, t5 E7 Avoid Bsp_Dwt_Init(void)2 P2 o' N, x+ ~" O' z5 O
{* Q. d$ v! H& s0 C7 Q. b& f
        DEM_CR         |= (unsigned int)DEM_CR_TRCENA;   /* Enable Cortex-M's DWT CYCCNT reg. */
7 R# z( T" F7 d3 ]        DWT_CYCCNT      = (unsigned int)0u;  K. @! D1 h8 u; q: ~4 @
        DWT_CR         |= (unsigned int)DWT_CR_CYCCNTENA;; g/ Q* y0 d. F4 y3 b- y
}
0 ~: w7 C: D0 b: x/ K
2 x( R& _5 m: T& @9 K- J( ^, qvoid Bsp_Delay_Ms(uint32_t _ms)
! I; Y- ]7 S" N1 H8 ~* E7 |{" y5 c0 u3 V6 v, I" v4 [! D
     Bsp_Delay_Us(1000* _ms);
# g" C2 m+ _1 e$ c3 b) ^, q1 J# [}
. ^% o9 }( t! @2 r: Z9 ]' v3 Z
$ G  I# m/ ^# r; D8 Y, m/ i- jvoid Bsp_Delay_Us(uint32_t _us)
! N% Y) x% S) j! n5 D- D{, m9 ^- \; }( s7 i3 m7 y) e
    uint32_t tCnt, tDelayCnt;: n! u9 V+ o  z3 k
        uint32_t tStart;( m/ s* A; j/ |- @- o
               
: o; Y& U# n2 Q        tStart = DWT_CYCCNT;                                     /* 刚进入时的计数器值 */
2 g9 g4 [* [- ~4 T        tCnt = 0;# Z( J# P8 x6 ~* I7 |- F  i1 i
        tDelayCnt = _us * (SystemCoreClock / 1000000);         /* 需要的节拍数 */                       
( c$ b( X5 K6 q
+ `7 p) d( {+ J% ]        while(tCnt < tDelayCnt)
8 k4 g+ q) X  E) R" _- R        {2 d; _6 \+ O" n, E. l  a; Q
                tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */        
5 V4 `/ b* K) w( q# T        }: ~* ?# J1 Q2 O1 A
}
6 m8 b6 w! s4 ~7 M2 t6 V" C
; o2 p8 X( ?& j$ n* h- i+ O7 [+ [& p- U) {# Y
void Bsp_Delay_Dwt(uint32_t _dwt)- S3 ~1 T9 T8 h& c* a
{
7 B  M1 b7 D3 _1 f    uint32_t tCnt, tDelayCnt;
7 J3 Q( P/ Y, {5 J. u+ I        uint32_t tStart;
% n4 R7 X, u/ n* J                9 T; }. b3 k- n$ d4 S" w
        tCnt = 0;
+ ^7 {, U) j" g/ b4 R0 F        tDelayCnt = _dwt;         /* 需要的节拍数 */                       7 |7 k1 X  k. O8 f$ z
        tStart = DWT_CYCCNT;         /* 刚进入时的计数器值 */1 I9 U0 J6 l$ L% q: v9 F# ]4 G1 e
        
: x$ ?( J  b, ]5 v; f! C- B        while(tCnt < tDelayCnt)2 b; d6 t7 a! Q' ]+ u
        {
5 N7 J: V7 Z; ]0 t                tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */        
; E) U1 I0 w% v; @* L% v4 u        }
$ X; U4 o3 L2 u}
* N  m( ~6 o6 S
& z! M0 W0 O& j" L+ y
/ [% Q6 L+ S, u( k% bvoid HAL_Delay(uint32_t Delay)
1 B) r6 L# n+ s* ^# T1 M' `{
) U& [5 c% H8 }7 j: F        Bsp_Delay_Ms(Delay);, y$ q6 g' G$ s
}
0 v9 ^  U9 e3 y* S* _1 o9 {
; x" A  [4 q7 n* q5 BHAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)8 D" D' l# [7 K. @) M' V; F
{
8 M3 b, R+ N4 t% |$ A# ^# E$ [        return HAL_OK;
, M" @6 S0 f8 G; P2 {1 U}$ r% W' ^3 _+ i$ P1 j  K

3 ^  ?, I% \, \7 g5 muint32_t HAL_GetTick (void)
& O3 S7 Z# ^& o! A" r{; q( Z3 O- r9 x, y4 n( A
        static uint32_t ticks = 0U;
5 h4 ?+ X* z* _' J9 p4 Q( s2 y        uint32_t i;) |  U, \3 {: Z; A2 z8 P6 Y
4 S$ u# d0 ?/ k8 Q* T! B: K( U
        if (osKernelGetState () == osKernelRunning)
( m/ N0 a2 K+ b6 Q: E3 f        {$ b1 t$ |$ s1 Z2 Z
                return ((uint32_t)osKernelGetTickCount ());8 S7 ~4 y. T/ z0 Z! A0 N- x4 u
        }
" T+ U, z* n; m) j" y( W2 V" S7 r- o  f! W9 k/ b2 ]! }
        /* 如果RTX5还没有运行,采用下面方式 */
% `) R$ L/ P5 U) H        for (i = (SystemCoreClock >> 14U); i > 0U; i--) - Z2 U$ x5 `3 |  l2 r# d0 ^' w
        {
, M4 t' P$ N3 e                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();8 u' Q* |! }- X2 A
                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();  l9 t/ V8 v" j4 J, f
        }
4 U5 f0 h& J$ e( S. G        4 w4 q; f( O  W9 z
        return ++ticks;
$ m$ I. _6 g( ~0 j& ^8 O}+ A9 n7 Z; m4 k9 d, z; c  z
- V  j7 K8 O, ^9 @$ ?/ F/ t
2 n( |7 n4 a6 c
赞 收藏 评论0 发布时间:2022-10-2 10:29

举报

0个回答

所属标签

相似技术帖

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