Files
CuboBmsFirmware/firmware/Libs/Utils/micros.c
Dmitriy Semenov 9c2667bbe5 CAN Update
2023-04-03 21:51:33 +03:00

49 lines
1.2 KiB
C
Executable File

//
// Created by enik on 18.02.2022.
//
#include "micros.h"
#define DWT_CYCCNT *(volatile uint32_t*)0xE0001004
#define DWT_CONTROL *(volatile uint32_t*)0xE0001000
#define SCB_DEMCR *(volatile uint32_t*)0xE000EDFC
static volatile bool dwt_enabled = 0;
/**
* @brief Enable DWT Counter
*/
void EnableDWT(void){
SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // allow to use DWT
DWT_CONTROL |= DWT_CTRL_CYCCNTENA_Msk; // Start DWT counter
dwt_enabled = 1;
}
/**
* @brief Delay Microseconds
* @param[in] val Value in microseconds to delay
*/
void DelayMicros(u32_t val){
if (!dwt_enabled) EnableDWT();
u32_t us_count_tic = val * (SystemCoreClock / 1000000); // get delay value in ticks
DWT->CYCCNT = 0U; // zero counter value
while(DWT->CYCCNT < us_count_tic);
}
/**
* @brief Start code measure from this point
*/
void StartCodeMeasure(void){
if (!dwt_enabled) EnableDWT();
DWT_CYCCNT = 0; // zero counter value
}
/**
* @brief Stop code measure in this point
* @param[out] micros Value in microseconds
*/
void StopCodeMeasure(u32_t *micros){
if (!dwt_enabled){ *micros = 0; return; }
//*micros = DWT_CYCCNT / SystemCoreClock; // get counter value
*micros = DWT_CYCCNT; // get counter value
}