Realtime counter support in the generic HAL driver and implementations for al STM32 devices, others will follow.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3723 35acf78f-673a-0410-8e92-d51de3d6d3f4master
parent
b799bdc5c5
commit
efa92aaed2
|
@ -52,6 +52,46 @@
|
|||
#include "serial_usb.h"
|
||||
#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. */
|
||||
/*===========================================================================*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
/*===========================================================================*/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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. */
|
||||
/*===========================================================================*/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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. */
|
||||
/*===========================================================================*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
/*===========================================================================*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue