|
#include "bsp.h" #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 , D% M2 }% b+ J, Z% s /**! z8 q( E/ ^( D6 ]9 E3 Z% Z * @description: 初始化DWT,被Bsp_Init调用 * @return {*}7 o0 R9 F3 c" Q6 g' f$ Q) p4 ? */ void 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. */ 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 } void Bsp_Delay_Ms(uint32_t _ms) {" y5 c0 u3 V6 v, I" v4 [! D Bsp_Delay_Us(1000* _ms); } void Bsp_Delay_Us(uint32_t _us) {, m9 ^- \; }( s7 i3 m7 y) e uint32_t tCnt, tDelayCnt;: n! u9 V+ o z3 k uint32_t tStart;( m/ s* A; j/ |- @- o tStart = DWT_CYCCNT; /* 刚进入时的计数器值 */ tCnt = 0;# Z( J# P8 x6 ~* I7 |- F i1 i tDelayCnt = _us * (SystemCoreClock / 1000000); /* 需要的节拍数 */ while(tCnt < tDelayCnt) {2 d; _6 \+ O" n, E. l a; Q tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */ }: ~* ?# J1 Q2 O1 A } - i+ O7 [+ [& p- U) {# Y void Bsp_Delay_Dwt(uint32_t _dwt)- S3 ~1 T9 T8 h& c* a { uint32_t tCnt, tDelayCnt; uint32_t tStart; 9 T; }. b3 k- n$ d4 S" w tCnt = 0; 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 while(tCnt < tDelayCnt)2 b; d6 t7 a! Q' ]+ u { tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */ } } void HAL_Delay(uint32_t Delay) { Bsp_Delay_Ms(Delay);, y$ q6 g' G$ s } HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)8 D" D' l# [7 K. @) M' V; F { return HAL_OK; }$ r% W' ^3 _+ i$ P1 j K uint32_t HAL_GetTick (void) {; q( Z3 O- r9 x, y4 n( A static uint32_t ticks = 0U; uint32_t i;) | U, \3 {: Z; A2 z8 P6 Y 4 S$ u# d0 ?/ k8 Q* T! B: K( U if (osKernelGetState () == osKernelRunning) {$ b1 t$ |$ s1 Z2 Z return ((uint32_t)osKernelGetTickCount ());8 S7 ~4 y. T/ z0 Z! A0 N- x4 u } f! W9 k/ b2 ]! } /* 如果RTX5还没有运行,采用下面方式 */ for (i = (SystemCoreClock >> 14U); i > 0U; i--) - Z2 U$ x5 `3 | l2 r# d0 ^' w { __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 w4 q; f( O W9 z return ++ticks; }+ A9 n7 Z; m4 k9 d, z; c z - V j7 K8 O, ^9 @$ ?/ F/ t 2 n( |7 n4 a6 c |
经验分享 | 利用TIMER定时和捕获功能实现编解码演示
STM32 LSE 不起振排查指南:五大核心原因与快速解决方案
我心中的ST中文论坛
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
2025软件工具兔哥知道
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
经验分享 | 一个基于TIMER事件的中断响应话题_续
经验分享 | 一个基于TIMER事件的中断响应话题
11张图学会STM32定时器!
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
微信公众号
手机版