/* ********************************************************************************************************* * * 模块名称 : 数据观察点与跟踪(DWT)模块 * 文件名称 : bsp_dwt.c ********************************************************************************************************* */ #include "bsp.h" /* ********************************************************************************************************* * 寄存器 ********************************************************************************************************* */ #define DWT_CYCCNT *(volatile unsigned int *)0xE0001004 #define DWT_CR *(volatile unsigned int *)0xE0001000 #define DEM_CR *(volatile unsigned int *)0xE000EDFC #define DBGMCU_CR *(volatile unsigned int *)0xE0042004 #define DEM_CR_TRCENA (1 << 24) #define DWT_CR_CYCCNTENA (1 << 0) /* ********************************************************************************************************* * 函 数 名: bsp_InitDWT * 功能说明: 初始化DWT. 该函数被 bsp_Init() 调用。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_InitDWT(void) { DEM_CR |= (unsigned int)DEM_CR_TRCENA; /* Enable Cortex-M4's DWT CYCCNT reg. */ DWT_CYCCNT = (unsigned int)0u; DWT_CR |= (unsigned int)DWT_CR_CYCCNTENA; } /* ********************************************************************************************************* * 函 数 名: bsp_DelayUS * 功能说明: 这里的延时采用CPU的内部计数实现,32位计数器 * OSSchedLock(&err); * bsp_DelayUS(5); * OSSchedUnlock(&err); 根据实际情况看看是否需要加调度锁或选择关中断 * 形 参: _ulDelayTime 延迟长度,单位1 us * 返 回 值: 无 ********************************************************************************************************* */ void bsp_DelayUS(uint32_t _ulDelayTime) { uint32_t tCnt, tDelayCnt; uint32_t tStart; tStart = DWT_CYCCNT; /* 刚进入时的计数器值 */ tCnt = 0; tDelayCnt = _ulDelayTime * (SystemCoreClock / 1000000); /* 需要的节拍数 */ while(tCnt < tDelayCnt) { tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */ } } /* ********************************************************************************************************* * 函 数 名: bsp_DelayMS * 功能说明: 为了让底层驱动在带RTOS和裸机情况下有更好的兼容性 * 专门制作一个阻塞式的延迟函数,在底层驱动中ms毫秒延迟主要用于初始化,并不会影响实时性。 * 形 参: n 延迟长度,单位1 ms * 返 回 值: 无 ********************************************************************************************************* */ void bsp_DelayMS(uint32_t _ulDelayTime) { bsp_DelayUS(1000*_ulDelayTime); } void bsp_DelayDWT(uint32_t _ulDelayTime) { uint32_t tCnt, tDelayCnt; uint32_t tStart; tCnt = 0; tDelayCnt = _ulDelayTime; /* 需要的节拍数 */ tStart = DWT_CYCCNT; /* 刚进入时的计数器值 */ while(tCnt < tDelayCnt) { tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */ } } /***************************** END OF FILE *********************************/