|
#include "bsp.h"! r6 o+ |9 u0 B, ]( |% y #define DEM_CR_TRCENA (1 << 24) #define DWT_CR_CYCCNTENA (1 << 0) $ n3 y7 [; ^% J1 K7 u" q /** * @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. */ DWT_CYCCNT = (unsigned int)0u;6 t5 [4 q5 l5 Z DWT_CR |= (unsigned int)DWT_CR_CYCCNTENA; }; 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); }* k$ q+ W+ ^! l) B " l% g3 N" V" F% o6 B3 _7 E void Bsp_Delay_Us(uint32_t _us) {" |+ r% g& d w& Q8 z uint32_t tCnt, tDelayCnt; uint32_t tStart;) ~) E# Z/ }# n5 t- e tStart = DWT_CYCCNT; /* 刚进入时的计数器值 */ tCnt = 0; 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位计数器重新计数,依然可以正确计算 */ } }! M% i% T% o _" K- G ! W/ Z2 z9 S; R# o D& X void Bsp_Delay_Dwt(uint32_t _dwt) {7 L' l: n2 D) H$ Y6 h; y% Y: X uint32_t tCnt, tDelayCnt;0 i+ t% V U6 Y uint32_t tStart; ; [; M3 x6 F6 O1 p. i- q9 N" V& \. P" z tCnt = 0; tDelayCnt = _dwt; /* 需要的节拍数 */ 6 |+ x: T, R5 e6 _" I tStart = DWT_CYCCNT; /* 刚进入时的计数器值 */7 h1 ~ x4 {5 Z; f n( k4 X while(tCnt < tDelayCnt) { tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */ ( l5 W# [9 i; ?, J; A2 O, j6 { } } void HAL_Delay(uint32_t Delay) {% N* X: `8 r5 Y2 E% f5 T Bsp_Delay_Ms(Delay);8 o; [+ s; i1 {& I }' p' n/ Y- L! e- B0 ? 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 }" _ } uint32_t HAL_GetTick (void) ' @3 u- Z# W. X" w { static uint32_t ticks = 0U; uint32_t i; P* U# {( z0 a( s+ ` x if (osKernelGetState () == osKernelRunning) { return ((uint32_t)osKernelGetTickCount ()); }6 v( C, ~3 ^8 L3 Y8 F# Z2 g /* 如果RTX5还没有运行,采用下面方式 */ 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(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();1 G4 h, h$ c1 R# P& A }8 S0 T5 P! m0 B return ++ticks; }7 d' A$ U7 I3 R' b F8 I9 q ) z* k l$ l) @# S5 m3 a6 h. V4 |1 D |
经验分享 | 利用TIMER定时和捕获功能实现编解码演示
STM32 LSE 不起振排查指南:五大核心原因与快速解决方案
我心中的ST中文论坛
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
2025软件工具兔哥知道
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
经验分享 | 一个基于TIMER事件的中断响应话题_续
经验分享 | 一个基于TIMER事件的中断响应话题
11张图学会STM32定时器!
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
微信公众号
手机版