git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6192 35acf78f-673a-0410-8e92-d51de3d6d3f4

master
gdisirio 2013-08-21 13:33:40 +00:00
parent 371ef2afb5
commit 78b866e0a7
6 changed files with 174 additions and 52 deletions

View File

@ -41,7 +41,7 @@
* setting also defines the system tick time unit. * setting also defines the system tick time unit.
*/ */
#if !defined(CH_CFG_ST_FREQUENCY) || defined(__DOXYGEN__) #if !defined(CH_CFG_ST_FREQUENCY) || defined(__DOXYGEN__)
#define CH_CFG_ST_FREQUENCY 1000 #define CH_CFG_ST_FREQUENCY 10000
#endif #endif
/** /**
@ -62,7 +62,7 @@
* this value. * this value.
*/ */
#if !defined(CH_CFG_TIMEDELTA) || defined(__DOXYGEN__) #if !defined(CH_CFG_TIMEDELTA) || defined(__DOXYGEN__)
#define CH_CFG_TIMEDELTA 0 #define CH_CFG_TIMEDELTA 2
#endif #endif
/** /**
@ -441,7 +441,7 @@
* tickless mode. * tickless mode.
*/ */
#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) #if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__)
#define CH_DBG_THREADS_PROFILING TRUE #define CH_DBG_THREADS_PROFILING FALSE
#endif #endif
/** @} */ /** @} */

View File

@ -21,6 +21,8 @@
/** /**
* @file st.h * @file st.h
* @brief ST Driver macros and structures. * @brief ST Driver macros and structures.
* @details This header is designed to be include-able without having to
* include other files from the HAL.
* *
* @addtogroup ST * @addtogroup ST
* @{ * @{
@ -29,8 +31,6 @@
#ifndef _ST_H_ #ifndef _ST_H_
#define _ST_H_ #define _ST_H_
#if (OSAL_ST_MODE != OSAL_ST_MODE_NONE) || defined(__DOXYGEN__)
/*===========================================================================*/ /*===========================================================================*/
/* Driver constants. */ /* Driver constants. */
/*===========================================================================*/ /*===========================================================================*/
@ -53,6 +53,66 @@
/* Driver macros. */ /* Driver macros. */
/*===========================================================================*/ /*===========================================================================*/
/**
* @name Macro Functions
* @{
*/
/**
* @brief Returns the time counter value.
* @note This functionality is only available in free running mode, the
* behavior in periodic mode is undefined.
*
* @return The counter value.
*
* @api
*/
#define stGetCounter() st_lld_get_counter()
/**
* @brief Starts the alarm.
* @note Makes sure that no spurious alarms are triggered after
* this call.
* @note This functionality is only available in free running mode, the
* behavior in periodic mode is undefined.
*
* @param[in] time the time to be set for the first alarm
*
* @api
*/
#define stStartAlarm(time) st_lld_start_alarm(time)
/**
* @brief Stops the alarm interrupt.
* @note This functionality is only available in free running mode, the
* behavior in periodic mode is undefined.
*
* @api
*/
#define stStopAlarm() st_lld_stop_alarm()
/**
* @brief Sets the alarm time.
* @note This functionality is only available in free running mode, the
* behavior in periodic mode is undefined.
*
* @param[in] time the time to be set for the next alarm
*
* @api
*/
#define stSetAlarm(time) st_lld_set_alarm(time)
/**
* @brief Returns the current alarm time.
* @note This functionality is only available in free running mode, the
* behavior in periodic mode is undefined.
*
* @return The currently set alarm time.
*
* @api
*/
#define stGetAlarm() st_lld_get_alarm()
/** @} */
/*===========================================================================*/ /*===========================================================================*/
/* External declarations. */ /* External declarations. */
/*===========================================================================*/ /*===========================================================================*/
@ -65,8 +125,6 @@ extern "C" {
} }
#endif #endif
#endif /* OSAL_ST_MODE != OSAL_ST_MODE_NONE */
#endif /* _ST_H_ */ #endif /* _ST_H_ */
/** @} */ /** @} */

View File

@ -107,6 +107,12 @@
/* Derived constants and error checks. */ /* Derived constants and error checks. */
/*===========================================================================*/ /*===========================================================================*/
#if !(OSAL_ST_MODE == OSAL_ST_MODE_NONE) && \
!(OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC) && \
!(OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING)
#error "invalid OSAL_ST_MODE setting in osal.h"
#endif
/*===========================================================================*/ /*===========================================================================*/
/* Module data structures and types. */ /* Module data structures and types. */
/*===========================================================================*/ /*===========================================================================*/

View File

@ -26,6 +26,29 @@
#if (OSAL_ST_MODE != OSAL_ST_MODE_NONE) || defined(__DOXYGEN__) #if (OSAL_ST_MODE != OSAL_ST_MODE_NONE) || defined(__DOXYGEN__)
/* The following checks and settings are unusually done here because the
file st.h needs to not have external dependencies. In this case there
would be a dependency on osal.h and mcuconf.h.*/
#if (OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING) && !STM32_HAS_TIM2
#error "TIM2 not present in the selected device"
#endif
#if (OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING) && !STM32_TIM2_IS_32BITS
#error "TIM2 is not a 32 bits timer"
#endif
/**
* @name Configuration options
* @{
*/
/**
* @brief SysTick timer IRQ priority.
*/
#if !defined(STM32_ST_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define STM32_ST_IRQ_PRIORITY 8
#endif
/** @} */
/*===========================================================================*/ /*===========================================================================*/
/* Driver local definitions. */ /* Driver local definitions. */
/*===========================================================================*/ /*===========================================================================*/

View File

@ -17,6 +17,8 @@
/** /**
* @file STM32/st_lld.h * @file STM32/st_lld.h
* @brief ST Driver subsystem low level driver header. * @brief ST Driver subsystem low level driver header.
* @details This header is designed to be include-able without having to
* include other files from the HAL.
* *
* @addtogroup ST * @addtogroup ST
* @{ * @{
@ -25,8 +27,7 @@
#ifndef _ST_LLD_H_ #ifndef _ST_LLD_H_
#define _ST_LLD_H_ #define _ST_LLD_H_
#if (OSAL_ST_MODE != OSAL_ST_MODE_NONE) || defined(__DOXYGEN__) #include "stm32_registry.h"
#include "stm32_tim.h" #include "stm32_tim.h"
/*===========================================================================*/ /*===========================================================================*/
@ -37,35 +38,10 @@
/* Driver pre-compile time settings. */ /* Driver pre-compile time settings. */
/*===========================================================================*/ /*===========================================================================*/
/**
* @name Configuration options
* @{
*/
/**
* @brief SysTick timer IRQ priority.
*/
#if !defined(STM32_ST_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define STM32_ST_IRQ_PRIORITY 8
#endif
/** @} */
/*===========================================================================*/ /*===========================================================================*/
/* Derived constants and error checks. */ /* Derived constants and error checks. */
/*===========================================================================*/ /*===========================================================================*/
#if !(OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC) && \
!(OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING)
#error "invalid OSAL_ST_MODE setting in osal.h"
#endif
#if (OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING) && !STM32_HAS_TIM2
#error "TIM2 not present in the selected device"
#endif
#if (OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING) && !STM32_TIM2_IS_32BITS
#error "TIM2 is not a 32 bits timer"
#endif
/*===========================================================================*/ /*===========================================================================*/
/* Driver data structures and types. */ /* Driver data structures and types. */
/*===========================================================================*/ /*===========================================================================*/
@ -90,7 +66,67 @@ extern "C" {
/* Driver inline functions. */ /* Driver inline functions. */
/*===========================================================================*/ /*===========================================================================*/
#endif /* OSAL_ST_MODE != OSAL_ST_MODE_NONE */ /**
* @brief Returns the time counter value.
*
* @return The counter value.
*
* @notapi
*/
static inline systime_t st_lld_get_counter(void) {
return (systime_t)(STM32_TIM2->CNT);
}
/**
* @brief Starts the alarm.
* @note Makes sure that no spurious alarms are triggered after
* this call.
*
* @param[in] time the time to be set for the first alarm
*
* @notapi
*/
static inline void st_lld_start_alarm(systime_t time) {
STM32_TIM2->CCR[0] = time;
STM32_TIM2->SR = 0;
STM32_TIM2->DIER = STM32_TIM_DIER_CC1IE;
}
/**
* @brief Stops the alarm interrupt.
*
* @notapi
*/
static inline void st_lld_stop_alarm(void) {
STM32_TIM2->DIER = 0;
}
/**
* @brief Sets the alarm time.
*
* @param[in] time the time to be set for the next alarm
*
* @notapi
*/
static inline void st_lld_set_alarm(systime_t time) {
STM32_TIM2->CCR[0] = (uint32_t)time;
}
/**
* @brief Returns the current alarm time.
*
* @return The currently set alarm time.
*
* @notapi
*/
static inline systime_t st_lld_get_alarm(void) {
return (systime_t)STM32_TIM2->CCR[0];
}
#endif /* _ST_LLD_H_ */ #endif /* _ST_LLD_H_ */

View File

@ -19,16 +19,23 @@
*/ */
/** /**
* @file STM32F30x/systick.h * @file ARMCMx/systick.h
* @brief System timer header file. * @brief System timer header file.
* *
* @addtogroup STM32F30X_TIMER * @addtogroup ARMCMx_SYSTICK
* @{ * @{
*/ */
#ifndef _SYSTICK_H_ #ifndef _SYSTICK_H_
#define _SYSTICK_H_ #define _SYSTICK_H_
#if defined(CH_PORT_DO_NOT_USE_ST)
#include "systick_ext.h"
#else /* !defined(CH_PORT_DO_NOT_USE_ST) */
#include "st.h"
/*===========================================================================*/ /*===========================================================================*/
/* Module constants. */ /* Module constants. */
/*===========================================================================*/ /*===========================================================================*/
@ -66,7 +73,7 @@
*/ */
static inline systime_t port_timer_get_time(void) { static inline systime_t port_timer_get_time(void) {
return TIM2->CNT; return stGetCounter();
} }
/** /**
@ -80,11 +87,7 @@ static inline systime_t port_timer_get_time(void) {
*/ */
static inline void port_timer_start_alarm(systime_t time) { static inline void port_timer_start_alarm(systime_t time) {
chDbgAssert((TIM2->DIER & 2) == 0, "already started"); stStartAlarm(time);
TIM2->CCR1 = time;
TIM2->SR = 0;
TIM2->DIER = 2; /* CC1IE */
} }
/** /**
@ -94,9 +97,7 @@ static inline void port_timer_start_alarm(systime_t time) {
*/ */
static inline void port_timer_stop_alarm(void) { static inline void port_timer_stop_alarm(void) {
chDbgAssert((TIM2->DIER & 2) != 0, "not started"); stStopAlarm();
TIM2->DIER = 0;
} }
/** /**
@ -108,9 +109,7 @@ static inline void port_timer_stop_alarm(void) {
*/ */
static inline void port_timer_set_alarm(systime_t time) { static inline void port_timer_set_alarm(systime_t time) {
chDbgAssert((TIM2->DIER & 2) != 0, "not started"); stSetAlarm(time);
TIM2->CCR1 = time;
} }
/** /**
@ -122,11 +121,11 @@ static inline void port_timer_set_alarm(systime_t time) {
*/ */
static inline systime_t port_timer_get_alarm(void) { static inline systime_t port_timer_get_alarm(void) {
chDbgAssert((TIM2->DIER & 2) != 0, "not started"); return stGetAlarm();
return TIM2->CCR1;
} }
#endif /* !defined(CH_PORT_DO_NOT_USE_ST) */
#endif /* _SYSTICK_H_ */ #endif /* _SYSTICK_H_ */
/** @} */ /** @} */