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

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

[复制链接]
一个脑子不够用 发布时间:2022-10-2 10:29
#include "bsp.h"5 K. y! `% A5 M5 r$ U: k

. D3 b- \4 ^3 l$ o1 C#define  DEM_CR_TRCENA               (1 << 24)# S% ], D4 v' p. ]' s0 C0 Q
#define  DWT_CR_CYCCNTENA            (1 <<  0)
5 R, S5 |$ p2 F( |: b1 K! f9 l+ s" M" l. b8 D. u

' M7 M8 s$ J: M' q1 @& R. d/**1 M9 ]' L. w) X' a
* @description: 初始化DWT,被Bsp_Init调用
1 q& l3 I0 H7 x$ I * @return {*}
" f" o! L0 I1 r  u8 Q# A: n */7 _4 e8 d+ n3 E- }" I! M0 R6 ?4 A4 s+ d
void Bsp_Dwt_Init(void)3 c  Z4 F/ P, c
{
" I$ a2 y% K7 {3 r        DEM_CR         |= (unsigned int)DEM_CR_TRCENA;   /* Enable Cortex-M's DWT CYCCNT reg. */$ v1 b+ T( y- W; k' v3 n" }
        DWT_CYCCNT      = (unsigned int)0u;/ D" t; p0 \1 G. ]& i$ [
        DWT_CR         |= (unsigned int)DWT_CR_CYCCNTENA;: g, A& e3 U& V
}
: }8 \7 g7 b3 i. @, f
; y5 a$ g0 J) C5 ?% mvoid Bsp_Delay_Ms(uint32_t _ms)
  Q1 L" K5 i3 B, R7 U" I/ Y  B. _{1 j2 C9 N1 m% F! ?
     Bsp_Delay_Us(1000* _ms);6 m; n5 `7 k% A  F) S4 L
}
3 Z( a( q5 `" S( u) ^2 W0 b9 x  q% E0 u
void Bsp_Delay_Us(uint32_t _us)
6 U  [8 S) x* g5 r- r+ O0 r{
% |6 v7 T- l% J2 `9 {4 c) s    uint32_t tCnt, tDelayCnt;
% S  m8 q# _2 l% P        uint32_t tStart;" O8 e, n# T8 e& `
                - X, N7 J+ @: [- ~
        tStart = DWT_CYCCNT;                                     /* 刚进入时的计数器值 */
, D" l/ ^0 G6 F0 n! E        tCnt = 0;
8 y! [7 O: q) U2 l$ \        tDelayCnt = _us * (SystemCoreClock / 1000000);         /* 需要的节拍数 */                       
0 n  ~+ c  q. d: K. f( t% ^3 K
8 s3 p/ S; e# I7 _' l        while(tCnt < tDelayCnt)
3 Q) d, }. d! C  A7 R, ]$ m        {+ k! n5 n; F. |/ r  v/ Z+ W5 C
                tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */        . T$ f8 P1 t8 m, b( G8 d
        }
+ r5 O/ a/ f, k! Z9 a$ y. r- q}1 X  \+ `5 q% S( w5 H; c
9 k$ e/ P% Y6 n  ~  M, c5 z6 i0 v
% ]; X* Q, e' R& q5 b! M
void Bsp_Delay_Dwt(uint32_t _dwt)
# t9 n8 f3 @1 M, z$ }5 v* x{
9 g, V# I$ H( D. O( p. I    uint32_t tCnt, tDelayCnt;% M' F& |% R8 O/ G) `: B4 V- s
        uint32_t tStart;4 n4 q# ?5 }* Z( A
                ( c# Y# B- p* ?; W# U# o
        tCnt = 0;
3 W6 v2 D* h9 Y        tDelayCnt = _dwt;         /* 需要的节拍数 */                       # J, ]7 _1 T, Z, _3 e
        tStart = DWT_CYCCNT;         /* 刚进入时的计数器值 */4 X7 x+ u2 n4 |/ r* Z6 G
        ; V4 b2 m# v3 X4 c
        while(tCnt < tDelayCnt)) r0 Z9 W* @6 y7 c# @
        {
( U) X* j9 G  O0 \+ i! W0 V; x0 W                tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */        
! m5 ^, w3 T! I, }0 x        }- X3 w+ }. C( D) {* C
}/ L: k; X2 L' R2 b* k- e8 P

7 K8 b% V( Y& d5 D! k+ s
: N( r  q4 \. H. M! C  m# B& Y7 i( Evoid HAL_Delay(uint32_t Delay)) k( j& z) c' ^8 w
{8 V! ~0 v% B) B/ u6 q. ?/ Z+ E
        Bsp_Delay_Ms(Delay);
4 {4 ]4 R9 O- Q}. W0 A, j# z0 h! f" v2 j0 _
" I% N& w; l: ~% T
HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)
4 i. {1 Z5 I3 q( D{
7 G; S( [2 S3 j  A        return HAL_OK;. ~1 s) C# h" b) o( Z
}4 T0 ~) s% d$ K4 W  n
  t+ g! B; D- ?& t
uint32_t HAL_GetTick (void)   A# ^  [0 f, v: J2 [+ G# a
{" l! f* t& \0 O! a( `
        static uint32_t ticks = 0U;' `& X5 a% w% i/ b' h/ C9 @' D
        uint32_t i;# d+ ?1 _. s( T/ y5 E

1 Q8 _- B: n# @7 i; S( |% }        if (osKernelGetState () == osKernelRunning)5 n; N. C- E. `2 T# A
        {
0 a2 s4 y. e0 j8 T, E                return ((uint32_t)osKernelGetTickCount ());
" V8 Q8 @- L  P0 Q& L% q        }2 }. H2 f" X2 M$ b4 a
$ D; S% P# Y7 n8 F+ k3 n
        /* 如果RTX5还没有运行,采用下面方式 */2 P7 o6 X) P5 i" _" l; S- ~8 `3 h
        for (i = (SystemCoreClock >> 14U); i > 0U; i--) ' t$ o. Z; d8 k* }1 c0 C
        {/ i" f% O- y* D" r: X' y
                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
* S2 b. C  i! V* Y                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();( f7 b7 \. d9 \
        }0 |9 e. x3 u5 z1 f' }' Z! E) P
        
; y# o; R% G3 }        return ++ticks;
3 o: f$ [4 x0 J1 L}( Y7 g! \. R' D% C/ Q6 |  u5 v

; q  m0 a6 x6 o, w4 z. e- J; |# p$ L
收藏 评论0 发布时间:2022-10-2 10:29

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版