Files
SM-1000M/RTX5_20220316/Driver/dwt/bsp_dwt.c
2026-04-23 10:50:18 +08:00

97 lines
3.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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