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

This commit is contained in:
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.
*/
#if !defined(CH_CFG_ST_FREQUENCY) || defined(__DOXYGEN__)
#define CH_CFG_ST_FREQUENCY 1000
#define CH_CFG_ST_FREQUENCY 10000
#endif
/**
@ -62,7 +62,7 @@
* this value.
*/
#if !defined(CH_CFG_TIMEDELTA) || defined(__DOXYGEN__)
#define CH_CFG_TIMEDELTA 0
#define CH_CFG_TIMEDELTA 2
#endif
/**
@ -441,7 +441,7 @@
* tickless mode.
*/
#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__)
#define CH_DBG_THREADS_PROFILING TRUE
#define CH_DBG_THREADS_PROFILING FALSE
#endif
/** @} */

View File

@ -21,6 +21,8 @@
/**
* @file st.h
* @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
* @{
@ -29,8 +31,6 @@
#ifndef _ST_H_
#define _ST_H_
#if (OSAL_ST_MODE != OSAL_ST_MODE_NONE) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver constants. */
/*===========================================================================*/
@ -53,6 +53,66 @@
/* 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. */
/*===========================================================================*/
@ -65,8 +125,6 @@ extern "C" {
}
#endif
#endif /* OSAL_ST_MODE != OSAL_ST_MODE_NONE */
#endif /* _ST_H_ */
/** @} */

View File

@ -107,6 +107,12 @@
/* 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. */
/*===========================================================================*/

View File

@ -26,6 +26,29 @@
#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. */
/*===========================================================================*/

View File

@ -17,6 +17,8 @@
/**
* @file STM32/st_lld.h
* @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
* @{
@ -25,8 +27,7 @@
#ifndef _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"
/*===========================================================================*/
@ -37,35 +38,10 @@
/* 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. */
/*===========================================================================*/
#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. */
/*===========================================================================*/
@ -90,7 +66,67 @@ extern "C" {
/* 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_ */

View File

@ -19,16 +19,23 @@
*/
/**
* @file STM32F30x/systick.h
* @file ARMCMx/systick.h
* @brief System timer header file.
*
* @addtogroup STM32F30X_TIMER
* @addtogroup ARMCMx_SYSTICK
* @{
*/
#ifndef _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. */
/*===========================================================================*/
@ -66,7 +73,7 @@
*/
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) {
chDbgAssert((TIM2->DIER & 2) == 0, "already started");
TIM2->CCR1 = time;
TIM2->SR = 0;
TIM2->DIER = 2; /* CC1IE */
stStartAlarm(time);
}
/**
@ -94,9 +97,7 @@ static inline void port_timer_start_alarm(systime_t time) {
*/
static inline void port_timer_stop_alarm(void) {
chDbgAssert((TIM2->DIER & 2) != 0, "not started");
TIM2->DIER = 0;
stStopAlarm();
}
/**
@ -108,9 +109,7 @@ static inline void port_timer_stop_alarm(void) {
*/
static inline void port_timer_set_alarm(systime_t time) {
chDbgAssert((TIM2->DIER & 2) != 0, "not started");
TIM2->CCR1 = time;
stSetAlarm(time);
}
/**
@ -122,11 +121,11 @@ static inline void port_timer_set_alarm(systime_t time) {
*/
static inline systime_t port_timer_get_alarm(void) {
chDbgAssert((TIM2->DIER & 2) != 0, "not started");
return TIM2->CCR1;
return stGetAlarm();
}
#endif /* !defined(CH_PORT_DO_NOT_USE_ST) */
#endif /* _SYSTICK_H_ */
/** @} */