HAL Library 19- CPU LOAD monitor for STM32Fxxx
CPU load monitor library is simple library, which counts number of sleeping cycles using WFI() instruction compared to working cycles in one second.
Load variable is updated every 1 second to determinate how much your processor works. For that case, you have to always put your system to sleep mode when you don’t need it.
It uses DWT counter in Cortex M4/M7 to measure cycle counters!
Library
Features
- Measures CPU load. Load depends between sleep time and work time of CPU
- CPU load is updated for every System core clock cycles. In other words, that is each 1 second
- DWT counter used for measurements
- Sleep mode which is measured can be wait for interrupt or wait for event
Dependencies
- HAL
- TM
- STM32Fxxx HAL
- defines.h
Functions and enumerations
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/** * @defgroup TM_CPULOAD_Typedefs * @brief Library Typedefs * @{ */ /** * @brief CPU LOAD structure */ typedef struct { float Load; /*!< CPU load percentage */ uint8_t Updated; /*!< Set to 1 when new CPU load is calculated */ uint32_t WCNT; /*!< Number of working cycles in one period. Meant for private use */ uint32_t SCNT; /*!< Number of sleeping cycles in one period. Meant for private use */ } TM_CPULOAD_t; /** * @} */ /** * @defgroup TM_CPULOAD_Functions * @brief Library Functions * @{ */ /** * @brief Initializes DWT functionality for sleep counter and prepares everything for CPU LOAD measurement * @param *CPU_Load: Pointer to empty @ref TM_CPULOAD_t structure * @retval Returns DWT counter status: * - 0: DWT counter has not started, measurement will fail * - > 0: DWT counter has started, everything OK */ uint8_t TM_CPULOAD_Init(TM_CPULOAD_t* CPU_Load); /** * @brief Goes to low power mode and measures sleeping time and working time using DWT cycle counter * @note You need wake up source, otherwise you might stay forever inside low power mode. * For wakeup source, you can use any interrupt, because __WFI() instruction is used. * @param *CPU_Load: Pointer to @ref TM_CPULOAD_t structure * @retval CPU load value updated status. * - 0: CPU load value is not updated, still old results * - > 0: CPU load value is updated */ uint8_t TM_CPULOAD_GoToSleepMode(TM_CPULOAD_t* CPU_Load); /** * @} */ |
Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
/** * Keil project example for CPU load monitor * * Before you start, select your target, on the right of the "Load" button * * @author Tilen Majerle * @email tilen@majerle.eu * @website http://stm32f4-discovery.net * @ide Keil uVision 5 * @conf PLL parameters are set in "Options for Target" -> "C/C++" -> "Defines" * @packs STM32F4xx/STM32F7xx Keil packs are requred with HAL driver support * @stdperiph STM32F4xx/STM32F7xx HAL drivers required */ /* Include core modules */ #include "stm32fxxx_hal.h" /* Include my libraries here */ #include "defines.h" #include "tm_stm32_disco.h" #include "tm_stm32_delay.h" #include "tm_stm32_cpu_load.h" #include "tm_stm32_usart.h" /* CPU load structure */ TM_CPULOAD_t CPU_LOAD; int main(void) { __IO uint32_t i; /* Init system clock for maximum system speed */ TM_RCC_InitSystem(); /* Init HAL layer */ HAL_Init(); /* Init CPU load monitor */ TM_CPULOAD_Init(&CPU_LOAD); /* Init leds */ TM_DISCO_LedInit(); /* Init button */ TM_DISCO_ButtonInit(); /* Init USART6, TX: PC6, RX: PC7, 921600 bauds */ TM_USART_Init(USART6, TM_USART_PinsPack_1, 921600); while (1) { /* Check if CPU LOAD variable is updated */ if (CPU_LOAD.Updated) { /* Print to user */ printf("W: %u; S: %u; Load: %5.2f\n", CPU_LOAD.WCNT, CPU_LOAD.SCNT, CPU_LOAD.Load); } /* Toggle leds */ TM_DISCO_LedToggle(LED_ALL); /* If button pressed, do some useless counting */ if (TM_DISCO_ButtonPressed()) { /* Count something to waste some time before entering to sleep mode */ i = 0; while (i++ < 0x1FFF); } /* Go low power mode, sleep mode until next interrupt (Systick or anything else), measure CPU load */ TM_CPULOAD_GoToSleepMode(&CPU_LOAD); } } /* Handle printf functionality */ int fputc(int ch, FILE* fil) { /* Send character over USART */ TM_USART_Putc(USART6, ch); /* Return character */ return ch; } |
Project is available on Github, download library below.
STM32 libraries based on STM32Fxxx HAL drivers.
Recent comments