97 lines
3.2 KiB
C
97 lines
3.2 KiB
C
/*
|
||
*********************************************************************************************************
|
||
*
|
||
* 模块名称 : 数据观察点与跟踪(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 *********************************/
|
||
|
||
|