82 lines
2.8 KiB
C
82 lines
2.8 KiB
C
|
#include "system_dwt.h"
|
|||
|
|
|||
|
#define DWT_CR *(volatile uint32_t *)0xE0001000
|
|||
|
#define DWT_CYCCNT *(volatile uint32_t *)0xE0001004
|
|||
|
#define DEM_CR *(volatile uint32_t *)0xE000EDFC
|
|||
|
#define DEM_CR_TRCENA_EN (1 << 24)
|
|||
|
#define DWT_CR_CYCCNTENA (1 << 0)
|
|||
|
|
|||
|
/************************************************************
|
|||
|
* @brief 系统dwt周期性计时器初始化
|
|||
|
* @param NULL
|
|||
|
* @return 时钟周期计数器计数值
|
|||
|
* @author LH
|
|||
|
* @date 2020-05-19
|
|||
|
***********************************************************/
|
|||
|
uint8_t system_dwt_init(void)
|
|||
|
{
|
|||
|
DEM_CR |= (uint32_t)DEM_CR_TRCENA_EN; /* 使能DWT外设 */
|
|||
|
DWT_CYCCNT = (uint32_t)0u;
|
|||
|
DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;
|
|||
|
__ASM volatile ("NOP");
|
|||
|
__ASM volatile ("NOP");
|
|||
|
__ASM volatile ("NOP"); //执行3条空指令
|
|||
|
return (DWT_CYCCNT)?0:1; //检查时钟周期计数器是否已经启动
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************
|
|||
|
* @brief 获取时钟周期计数器计数值
|
|||
|
* @param NULL
|
|||
|
* @return 计数值
|
|||
|
* @author LH
|
|||
|
* @date 2020-05-19
|
|||
|
***********************************************************/
|
|||
|
uint32_t get_system_dwt_value(void)
|
|||
|
{
|
|||
|
return ((uint32_t)DWT_CYCCNT);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/************************************************************
|
|||
|
* @brief 通过dwt周期计数器延时us 主频96MHz的情况下,32位计数器计满是2^32/96000000 = 44.739秒 建议使用本函数做延迟的话,延迟在1秒以下。
|
|||
|
* @param delay_time/us 延迟长度,单位1us
|
|||
|
* @return
|
|||
|
* @author LH
|
|||
|
* @date 2020-05-19
|
|||
|
***********************************************************/
|
|||
|
void dwt_delay_us(uint32_t delay_time)
|
|||
|
{
|
|||
|
uint32_t temp_cnt, delay_cnt;
|
|||
|
uint32_t start_time;
|
|||
|
start_time = DWT_CYCCNT; /* 刚进入时的计数器值 */
|
|||
|
temp_cnt = 0;
|
|||
|
//delay_cnt = delay_time * (system_get_clock() / 1000000); /* 需要的节拍数 */
|
|||
|
while(temp_cnt < delay_cnt)
|
|||
|
{
|
|||
|
temp_cnt = DWT_CYCCNT - start_time; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************
|
|||
|
* @brief 通过dwt周期计数器延时计数节拍
|
|||
|
* @param delay_time
|
|||
|
* @return
|
|||
|
* @author LH
|
|||
|
* @date 2020-05-19
|
|||
|
***********************************************************/
|
|||
|
void dwt_delay_tick(uint32_t tick)
|
|||
|
{
|
|||
|
uint32_t temp_cnt, delay_cnt;
|
|||
|
uint32_t start_time;
|
|||
|
temp_cnt = 0;
|
|||
|
delay_cnt = tick; /* 需要的节拍数 */
|
|||
|
start_time = DWT_CYCCNT; /* 刚进入时的计数器值 */
|
|||
|
while(temp_cnt < delay_cnt)
|
|||
|
{
|
|||
|
temp_cnt = DWT_CYCCNT - start_time; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|