
#include "bsp.h" #define DEM_CR_TRCENA (1 << 24) #define DWT_CR_CYCCNTENA (1 << 0) /** * @description: 初始化DWT,被Bsp_Init调用 * @return {*} */ void Bsp_Dwt_Init(void) { DEM_CR |= (unsigned int)DEM_CR_TRCENA; /* Enable Cortex-M's DWT CYCCNT reg. */ DWT_CYCCNT = (unsigned int)0u; DWT_CR |= (unsigned int)DWT_CR_CYCCNTENA; } void Bsp_Delay_Ms(uint32_t _ms) { Bsp_Delay_Us(1000* _ms); } void Bsp_Delay_Us(uint32_t _us) { uint32_t tCnt, tDelayCnt; uint32_t tStart; tStart = DWT_CYCCNT; /* 刚进入时的计数器值 */ tCnt = 0; tDelayCnt = _us * (SystemCoreClock / 1000000); /* 需要的节拍数 */ while(tCnt < tDelayCnt) { tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */ } } void Bsp_Delay_Dwt(uint32_t _dwt) { uint32_t tCnt, tDelayCnt; uint32_t tStart; tCnt = 0; tDelayCnt = _dwt; /* 需要的节拍数 */ tStart = DWT_CYCCNT; /* 刚进入时的计数器值 */ while(tCnt < tDelayCnt) { tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */ } } void HAL_Delay(uint32_t Delay) { Bsp_Delay_Ms(Delay); } HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority) { return HAL_OK; } uint32_t HAL_GetTick (void) { static uint32_t ticks = 0U; uint32_t i; if (osKernelGetState () == osKernelRunning) { return ((uint32_t)osKernelGetTickCount ()); } /* 如果RTX5还没有运行,采用下面方式 */ for (i = (SystemCoreClock >> 14U); i > 0U; i--) { __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); } return ++ticks; } |
基于定时器捕获测量脉宽的应用示例
狂欢三】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的定时器不按设定超时产生中断