tdse-tp3_02-code_integration

Index Commits Files Refs
app/inc/dwt.h (5300B)
   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 ******************************************/