
#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; } |
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
经验分享 | STM32G4 UART+TIMER+DMA应用示例
经验分享 | STM32定时器同步启动示例及应用提醒
经验分享 | STM32 TIMER+DMA输出PWM异常二案例
经验分享 | 更改STM32定时器周期后的输出疑问分析
基于定时器捕获测量脉宽的应用示例
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
【狂欢三】STM32C031使用TIM定时器DMA方式实现PWM输出(二)
【狂欢三】STM32C031使用TIM定时器PWM输出
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法