#include "bsp.h"5 K. y! `% A5 M5 r$ U: k #define DEM_CR_TRCENA (1 << 24)# S% ], D4 v' p. ]' s0 C0 Q #define DWT_CR_CYCCNTENA (1 << 0) 9 l+ s" M" l. b8 D. u /**1 M9 ]' L. w) X' a * @description: 初始化DWT,被Bsp_Init调用 * @return {*} */7 _4 e8 d+ n3 E- }" I! M0 R6 ?4 A4 s+ d void Bsp_Dwt_Init(void)3 c Z4 F/ P, c { 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 } void Bsp_Delay_Ms(uint32_t _ms) {1 j2 C9 N1 m% F! ? Bsp_Delay_Us(1000* _ms);6 m; n5 `7 k% A F) S4 L } 0 b9 x q% E0 u void Bsp_Delay_Us(uint32_t _us) { uint32_t tCnt, tDelayCnt; uint32_t tStart;" O8 e, n# T8 e& ` - X, N7 J+ @: [- ~ tStart = DWT_CYCCNT; /* 刚进入时的计数器值 */ tCnt = 0; tDelayCnt = _us * (SystemCoreClock / 1000000); /* 需要的节拍数 */ while(tCnt < tDelayCnt) {+ k! n5 n; F. |/ r v/ Z+ W5 C tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */ . T$ f8 P1 t8 m, b( G8 d } }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) { 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; 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# @ { tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */ }- X3 w+ }. C( D) {* C }/ L: k; X2 L' R2 b* k- e8 P void 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); }. W0 A, j# z0 h! f" v2 j0 _ " I% N& w; l: ~% T HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority) { 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 if (osKernelGetState () == osKernelRunning)5 n; N. C- E. `2 T# A { return ((uint32_t)osKernelGetTickCount ()); }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(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();( f7 b7 \. d9 \ }0 |9 e. x3 u5 z1 f' }' Z! E) P return ++ticks; }( Y7 g! \. R' D% C/ Q6 | u5 v 4 z. e- J; |# p$ L |
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
【狂欢三】STM32C031使用TIM定时器DMA方式实现PWM输出(二)
【狂欢三】STM32C031使用TIM定时器PWM输出
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
定时器剩余通道是否可以做PWM输出呢?
基于STM32双定时器+ADC+DMA实战经验分享
基于STM32的定时器触发ADC时可能遇到的情形
【NUCLEO-U545RE-Q评测】5. 基本计时器
基于STM32的定时器不按设定超时产生中断
基于stm32用两个16位定时器级联成32位定时器经验分享