1 /* 2 * Copyright (c) 2023 Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 22 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 23 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 28 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 29 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 * 32 * @file : dwt.h 33 * @date : Set 26, 2023 34 * @author : Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar> 35 * @version v1.0.0 36 */ 37 38 #ifndef DWT_INC_DWT_H_ 39 #define DWT_INC_DWT_H_ 40 41 /********************** CPP guard ********************************************/ 42 #ifdef __cplusplus 43 extern "C" { 44 #endif 45 46 /********************** inclusions *******************************************/ 47 48 /********************** macros ***********************************************/ 49 50 /* init cycle counter */ 51 /* DWT (Data Watchpoint and Trace) registers, only exists on ARM Cortex with a DWT unit */ 52 /*!< DEMCR: Debug Exception and Monitor Control Register */ 53 /*!< TRCENA: Enable trace and debug block DEMCR (Debug Exception and Monitor Control Register) */ 54 /*!< DWT Cycle Counter register */ 55 /*!< CYCCNTENA bit in DWT_CONTROL register */ 56 static inline void cycle_counter_init(void) __attribute__((always_inline)); 57 static inline void cycle_counter_init(void) 58 { 59 CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; /* enable DWT hardware */ 60 DWT->CYCCNT = 0; /* reset cycle counter */ 61 DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; /* start counting */ 62 } 63 64 /* reset cycle counter */ 65 /*!< DWT Cycle Counter register */ 66 static inline void cycle_counter_reset(void) __attribute__((always_inline)); 67 static inline void cycle_counter_reset(void) 68 { 69 DWT->CYCCNT = 0; 70 } 71 72 /* enable counting */ 73 /*!< CYCCNTENA bit in DWT_CONTROL register */ 74 static inline void cycle_counter_enable(void) __attribute__((always_inline)); 75 static inline void cycle_counter_enable(void) 76 { 77 DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; 78 } 79 80 /* disable counting */ 81 /*!< CYCCNTENA bit in DWT_CONTROL register */ 82 static inline void cycle_counter_disable(void) __attribute__((always_inline)); 83 static inline void cycle_counter_disable(void) 84 { 85 DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; 86 } 87 88 /* read cycle counter */ 89 /*!< DWT Cycle Counter register */ 90 static inline uint32_t cycle_counter_get(void) __attribute__((always_inline)); 91 static inline uint32_t cycle_counter_get(void) 92 { 93 return (DWT->CYCCNT); 94 } 95 96 static inline uint32_t cycle_counter_get_time_us(void) __attribute__((always_inline)); 97 static inline uint32_t cycle_counter_get_time_us(void) 98 { 99 return (DWT->CYCCNT / (SystemCoreClock / 1000000)); 100 } 101 102 /* uint32_t cycle_counter = 0; 103 * uint32_t cycle_counter_time_us = 0; 104 * // PC8 (GPIO) 105 * HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET); // => ______ 106 * cycle_counter_init(); 107 * 108 * ... 109 * ... // => ______ 110 * // ___ 111 * HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET); // => __/ 112 * // or => HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8); 113 * cycle_counter_reset(); 114 * // ______ 115 * ... // => 116 * 117 * cycle_counter = cycle_counter_get(); 118 * cycle_counter_time_us = cycle_counter_get_time_us(); // __ 119 * HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET); // => \___ 120 * // or => HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8); 121 * 122 * // => ______ 123 * 124 * LOGGER_LOG("Cycles: %lu - Time %lu uS\r\n", cycle_counter, cycle_counter_time_us); 125 */ 126 127 /********************** typedef **********************************************/ 128 129 /********************** external data declaration ****************************/ 130 131 /********************** external functions declaration ***********************/ 132 133 /********************** End of CPP guard *************************************/ 134 #ifdef __cplusplus 135 } 136 #endif 137 138 #endif /* DWT_INC_DWT_H_ */ 139 140 /********************** end of file ******************************************/
