diff options
-rw-r--r-- | os/hal/include/hal.h | 40 | ||||
-rw-r--r-- | os/hal/platforms/STM32F1xx/hal_lld.c | 3 | ||||
-rw-r--r-- | os/hal/platforms/STM32F1xx/hal_lld.h | 33 | ||||
-rw-r--r-- | os/hal/platforms/STM32F2xx/hal_lld.c | 3 | ||||
-rw-r--r-- | os/hal/platforms/STM32F2xx/hal_lld.h | 33 | ||||
-rw-r--r-- | os/hal/platforms/STM32F4xx/hal_lld.c | 3 | ||||
-rw-r--r-- | os/hal/platforms/STM32F4xx/hal_lld.h | 33 | ||||
-rw-r--r-- | os/hal/platforms/STM32L1xx/hal_lld.c | 3 | ||||
-rw-r--r-- | os/hal/platforms/STM32L1xx/hal_lld.h | 33 | ||||
-rw-r--r-- | os/ports/common/ARMCMx/nvic.h | 32 | ||||
-rw-r--r-- | readme.txt | 2 |
11 files changed, 218 insertions, 0 deletions
diff --git a/os/hal/include/hal.h b/os/hal/include/hal.h index 8d7214325..6c49e2c5c 100644 --- a/os/hal/include/hal.h +++ b/os/hal/include/hal.h @@ -53,6 +53,46 @@ #include "rtc.h"
/*===========================================================================*/
+/* Driver constants. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver pre-compile time settings. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Derived constants and error checks. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver data structures and types. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver macros. */
+/*===========================================================================*/
+
+/**
+ * @brief Returns the current value of the system free running counter.
+ * @note This is an optional service that could not be implemented in
+ * all HAL implementations.
+ *
+ * @return The value of the system free running counter.
+ *
+ * @api
+ */
+#define halGetCounterValue() hal_lld_get_counter_value()
+
+/**
+ * @brief Realtime counter frequency.
+ *
+ * @return The realtime counter frequency of type halclock_t.
+ *
+ * @api
+ */
+#define halGetCounterFrequency() hal_lld_get_counter_frequency()
+
+/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
diff --git a/os/hal/platforms/STM32F1xx/hal_lld.c b/os/hal/platforms/STM32F1xx/hal_lld.c index 1be870fcd..0f2d490d6 100644 --- a/os/hal/platforms/STM32F1xx/hal_lld.c +++ b/os/hal/platforms/STM32F1xx/hal_lld.c @@ -67,6 +67,9 @@ void hal_lld_init(void) { SysTick_CTRL_ENABLE_Msk |
SysTick_CTRL_TICKINT_Msk;
+ /* DWT cycle counter enable.*/
+ DWT_CTRL |= DWT_CTRL_CYCCNTENA;
+
#if defined(STM32_DMA_REQUIRED)
dmaInit();
#endif
diff --git a/os/hal/platforms/STM32F1xx/hal_lld.h b/os/hal/platforms/STM32F1xx/hal_lld.h index 64cf0165c..4e1ca3f35 100644 --- a/os/hal/platforms/STM32F1xx/hal_lld.h +++ b/os/hal/platforms/STM32F1xx/hal_lld.h @@ -102,10 +102,43 @@ /* Driver data structures and types. */
/*===========================================================================*/
+/**
+ * @brief Type representing a system clock frequency.
+ */
+typedef uint32_t halclock_t;
+
+/**
+ * @brief Type of the realtime free counter value.
+ */
+typedef uint32_t halrtcnt_t;
+
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
+/**
+ * @brief Returns the current value of the system free running counter.
+ * @note This service is implemented by returning the content of the
+ * DWT_CYCCNT register.
+ *
+ * @return The value of the system free running counter of
+ * type halrtcnt_t.
+ *
+ * @notapi
+ */
+#define hal_lld_get_counter_value() DWT_CYCCNT
+
+/**
+ * @brief Realtime counter frequency.
+ * @note The DWT_CYCCNT register is incremented directly by the system
+ * clock so this function returns STM32_SYSCLK.
+ *
+ * @return The realtime counter frequency of type halclock_t.
+ *
+ * @notapi
+ */
+#define hal_lld_get_counter_frequency() STM32_SYSCLK
+
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
diff --git a/os/hal/platforms/STM32F2xx/hal_lld.c b/os/hal/platforms/STM32F2xx/hal_lld.c index 2b3894bdd..2344d161f 100644 --- a/os/hal/platforms/STM32F2xx/hal_lld.c +++ b/os/hal/platforms/STM32F2xx/hal_lld.c @@ -71,6 +71,9 @@ void hal_lld_init(void) { SysTick_CTRL_ENABLE_Msk |
SysTick_CTRL_TICKINT_Msk;
+ /* DWT cycle counter enable.*/
+ DWT_CTRL |= DWT_CTRL_CYCCNTENA;
+
#if STM32_PVD_ENABLE
/* Programmable voltage detector initialization */
PWR->CR |= PWR_CR_PVDE | (STM32_PLS & STM32_PLS_MASK);
diff --git a/os/hal/platforms/STM32F2xx/hal_lld.h b/os/hal/platforms/STM32F2xx/hal_lld.h index 528d4dec2..280cbea43 100644 --- a/os/hal/platforms/STM32F2xx/hal_lld.h +++ b/os/hal/platforms/STM32F2xx/hal_lld.h @@ -1320,10 +1320,43 @@ /* Driver data structures and types. */
/*===========================================================================*/
+/**
+ * @brief Type representing a system clock frequency.
+ */
+typedef uint32_t halclock_t;
+
+/**
+ * @brief Type of the realtime free counter value.
+ */
+typedef uint32_t halrtcnt_t;
+
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
+/**
+ * @brief Returns the current value of the system free running counter.
+ * @note This service is implemented by returning the content of the
+ * DWT_CYCCNT register.
+ *
+ * @return The value of the system free running counter of
+ * type halrtcnt_t.
+ *
+ * @notapi
+ */
+#define hal_lld_get_counter_value() DWT_CYCCNT
+
+/**
+ * @brief Realtime counter frequency.
+ * @note The DWT_CYCCNT register is incremented directly by the system
+ * clock so this function returns STM32_SYSCLK.
+ *
+ * @return The realtime counter frequency of type halclock_t.
+ *
+ * @notapi
+ */
+#define hal_lld_get_counter_frequency() STM32_SYSCLK
+
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
diff --git a/os/hal/platforms/STM32F4xx/hal_lld.c b/os/hal/platforms/STM32F4xx/hal_lld.c index 38d46177e..d9bf8374e 100644 --- a/os/hal/platforms/STM32F4xx/hal_lld.c +++ b/os/hal/platforms/STM32F4xx/hal_lld.c @@ -71,6 +71,9 @@ void hal_lld_init(void) { SysTick_CTRL_ENABLE_Msk |
SysTick_CTRL_TICKINT_Msk;
+ /* DWT cycle counter enable.*/
+ DWT_CTRL |= DWT_CTRL_CYCCNTENA;
+
#if STM32_PVD_ENABLE
/* Programmable voltage detector initialization */
PWR->CR |= PWR_CR_PVDE | (STM32_PLS & STM32_PLS_MASK);
diff --git a/os/hal/platforms/STM32F4xx/hal_lld.h b/os/hal/platforms/STM32F4xx/hal_lld.h index b43122936..953a7af45 100644 --- a/os/hal/platforms/STM32F4xx/hal_lld.h +++ b/os/hal/platforms/STM32F4xx/hal_lld.h @@ -1340,10 +1340,43 @@ /* Driver data structures and types. */
/*===========================================================================*/
+/**
+ * @brief Type representing a system clock frequency.
+ */
+typedef uint32_t halclock_t;
+
+/**
+ * @brief Type of the realtime free counter value.
+ */
+typedef uint32_t halrtcnt_t;
+
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
+/**
+ * @brief Returns the current value of the system free running counter.
+ * @note This service is implemented by returning the content of the
+ * DWT_CYCCNT register.
+ *
+ * @return The value of the system free running counter of
+ * type halrtcnt_t.
+ *
+ * @notapi
+ */
+#define hal_lld_get_counter_value() DWT_CYCCNT
+
+/**
+ * @brief Realtime counter frequency.
+ * @note The DWT_CYCCNT register is incremented directly by the system
+ * clock so this function returns STM32_SYSCLK.
+ *
+ * @return The realtime counter frequency of type halclock_t.
+ *
+ * @notapi
+ */
+#define hal_lld_get_counter_frequency() STM32_SYSCLK
+
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
diff --git a/os/hal/platforms/STM32L1xx/hal_lld.c b/os/hal/platforms/STM32L1xx/hal_lld.c index aecff7be1..54d67b9d0 100644 --- a/os/hal/platforms/STM32L1xx/hal_lld.c +++ b/os/hal/platforms/STM32L1xx/hal_lld.c @@ -68,6 +68,9 @@ void hal_lld_init(void) { SysTick_CTRL_ENABLE_Msk |
SysTick_CTRL_TICKINT_Msk;
+ /* DWT cycle counter enable.*/
+ DWT_CTRL |= DWT_CTRL_CYCCNTENA;
+
#if defined(STM32_DMA_REQUIRED)
dmaInit();
#endif
diff --git a/os/hal/platforms/STM32L1xx/hal_lld.h b/os/hal/platforms/STM32L1xx/hal_lld.h index fce1a80f6..4bbe2fe76 100644 --- a/os/hal/platforms/STM32L1xx/hal_lld.h +++ b/os/hal/platforms/STM32L1xx/hal_lld.h @@ -971,10 +971,43 @@ /* Driver data structures and types. */
/*===========================================================================*/
+/**
+ * @brief Type representing a system clock frequency.
+ */
+typedef uint32_t halclock_t;
+
+/**
+ * @brief Type of the realtime free counter value.
+ */
+typedef uint32_t halrtcnt_t;
+
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
+/**
+ * @brief Returns the current value of the system free running counter.
+ * @note This service is implemented by returning the content of the
+ * DWT_CYCCNT register.
+ *
+ * @return The value of the system free running counter of
+ * type halrtcnt_t.
+ *
+ * @notapi
+ */
+#define hal_lld_get_counter_value() DWT_CYCCNT
+
+/**
+ * @brief Realtime counter frequency.
+ * @note The DWT_CYCCNT register is incremented directly by the system
+ * clock so this function returns STM32_SYSCLK.
+ *
+ * @return The realtime counter frequency of type halclock_t.
+ *
+ * @notapi
+ */
+#define hal_lld_get_counter_frequency() STM32_SYSCLK
+
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
diff --git a/os/ports/common/ARMCMx/nvic.h b/os/ports/common/ARMCMx/nvic.h index cce2029d7..5d310c81c 100644 --- a/os/ports/common/ARMCMx/nvic.h +++ b/os/ports/common/ARMCMx/nvic.h @@ -191,6 +191,9 @@ typedef struct { #define AIRCR_PRIGROUP_MASK (0x7U << 8)
#define AIRCR_PRIGROUP(n) ((n##U) << 8)
+/**
+ * @brief Structure representing the FPU I/O space.
+ */
typedef struct {
IOREG32 unused1[1];
IOREG32 FPCCR;
@@ -225,6 +228,35 @@ typedef struct { #define FPDSCR_FZ (0x1U << 24)
#define FPDSCR_RMODE(n) ((n##U) << 22)
+/**
+ * @brief Structure representing the DWT I/O space.
+ */
+typedef struct {
+ IOREG32 CTRL;
+ IOREG32 CYCCNT;
+ IOREG32 CPICNT;
+ IOREG32 EXCCNT;
+ IOREG32 SLEEPCNT;
+ IOREG32 LSUCNT;
+ IOREG32 FOLDCNT;
+ IOREG32 PCSR;
+} CMx_DWT;
+
+/**
+ * @brief DWT peripheral base address.
+ */
+#define DWTBase ((CMx_DWT *)0xE0001000U)
+#define DWT_CTRL (DWTBase->CTRL)
+#define DWT_CYCCNT (DWTBase->CYCCNT)
+#define DWT_CPICNT (DWTBase->CPICNT)
+#define DWT_EXCCNT (DWTBase->EXCCNT)
+#define DWT_SLEEPCNT (DWTBase->SLEEPCNT)
+#define DWT_LSUCNT (DWTBase->LSUCNT)
+#define DWT_FOLDCNT (DWTBase->FOLDCNT)
+#define DWT_PCSR (DWTBase->PCSR)
+
+#define DWT_CTRL_CYCCNTENA (0x1U << 0)
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/readme.txt b/readme.txt index 2304434ab..7d818161a 100644 --- a/readme.txt +++ b/readme.txt @@ -79,6 +79,8 @@ - FIX: Fixed SYSCFG clock not started in STM32L1/F4 HALs (bug 3449139).
- FIX: Fixed wrong definitions in STM32L-Discovery board file (bug 3449076).
- OPT: Improved the exception exit code in the GCC Cortex-Mx ports.
+- NEW: Addred to the HAL driver the handling of an abstract realtime free
+ running counter, added the capability to all the STM32 HALs.
- NEW: Modified ARM and ARMCMx build rules to allow parallel build. Now the
log outputs one dummy compilation command in order to allow paths discovery
by Eclipse.
|