MXC-A36-Demo/MCU/examples/turnkey/lvgl_Dashboard_8080/Src/system_dwt.c

82 lines
2.8 KiB
C
Raw Permalink Normal View History

#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的情况下322^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位计数器重新计数依然可以正确计算 */
}
}