diff options
author | barthess <barthess@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2013-03-27 20:03:40 +0000 |
---|---|---|
committer | barthess <barthess@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2013-03-27 20:03:40 +0000 |
commit | f571b507132cc77e401dee68535c2b9f3370c60c (patch) | |
tree | 396bb2d577e418fdf3424fd1974f28d40ef8c749 | |
parent | ee1eb360863b0dc94fc4a19587d001747c5fb8d5 (diff) | |
download | ChibiOS-f571b507132cc77e401dee68535c2b9f3370c60c.tar.gz ChibiOS-f571b507132cc77e401dee68535c2b9f3370c60c.tar.bz2 ChibiOS-f571b507132cc77e401dee68535c2b9f3370c60c.zip |
STM32. GPT. Added abillity to change interval of running GPT unit on the fly.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@5510 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r-- | os/hal/include/gpt.h | 18 | ||||
-rw-r--r-- | os/hal/platforms/STM32/gpt_lld.h | 16 | ||||
-rw-r--r-- | os/hal/src/gpt.c | 24 |
3 files changed, 58 insertions, 0 deletions
diff --git a/os/hal/include/gpt.h b/os/hal/include/gpt.h index 4a8245df5..379b90be9 100644 --- a/os/hal/include/gpt.h +++ b/os/hal/include/gpt.h @@ -76,6 +76,23 @@ typedef void (*gptcallback_t)(GPTDriver *gptp); /* Driver macros. */
/*===========================================================================*/
+/**
+ * @brief Changes the interval of GPT peripheral.
+ * @details This function changes the interval of a running GPT unit.
+ * @pre The GPT unit must have been activated using @p gptStart().
+ * @pre The GPT unit must have been running in continuous mode using
+ * @p gptStartContinuous().
+ * @post The GPT unit interval is changed to the new value.
+ *
+ * @param[in] gptp pointer to a @p GPTDriver object
+ * @param[in] interval new cycle time in timer ticks
+ *
+ * @iclass
+ */
+#define stm32_gptChangeIntervalI(gptp, interval) { \
+ gpt_lld_change_interval(gptp, interval); \
+}
+
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
@@ -89,6 +106,7 @@ extern "C" { void gptStop(GPTDriver *gptp);
void gptStartContinuous(GPTDriver *gptp, gptcnt_t interval);
void gptStartContinuousI(GPTDriver *gptp, gptcnt_t interval);
+ void stm32_gptChangeInterval(GPTDriver *gptp, gptcnt_t interval);
void gptStartOneShot(GPTDriver *gptp, gptcnt_t interval);
void gptStartOneShotI(GPTDriver *gptp, gptcnt_t interval);
void gptStopTimer(GPTDriver *gptp);
diff --git a/os/hal/platforms/STM32/gpt_lld.h b/os/hal/platforms/STM32/gpt_lld.h index 8a8ec4059..3421edbdd 100644 --- a/os/hal/platforms/STM32/gpt_lld.h +++ b/os/hal/platforms/STM32/gpt_lld.h @@ -267,6 +267,22 @@ struct GPTDriver { /* Driver macros. */
/*===========================================================================*/
+/**
+ * @brief Changes the interval of GPT peripheral.
+ * @details This function changes the interval of a running GPT unit.
+ * @pre The GPT unit must have been activated using @p gptStart().
+ * @pre The GPT unit must have been running in continuous mode using
+ * @p gptStartContinuous().
+ * @post The GPT unit interval is changed to the new value.
+ * @note The function has effect at the next cycle start.
+ *
+ * @param[in] gptp pointer to a @p GPTDriver object
+ * @param[in] interval new cycle time in timer ticks
+ * @notapi
+ */
+#define gpt_lld_change_interval(gptp, interval) \
+ ((gptp)->tim->ARR = (uint16_t)((interval) - 1))
+
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
diff --git a/os/hal/src/gpt.c b/os/hal/src/gpt.c index 48db68174..9b7c0d9a6 100644 --- a/os/hal/src/gpt.c +++ b/os/hal/src/gpt.c @@ -117,6 +117,30 @@ void gptStop(GPTDriver *gptp) { }
/**
+ * @brief Changes the interval of GPT peripheral.
+ * @details This function changes the interval of a running GPT unit.
+ * @pre The GPT unit must have been activated using @p gptStart().
+ * @pre The GPT unit must have been running in continuous mode using
+ * @p gptStartContinuous().
+ * @post The GPT unit interval is changed to the new value.
+ *
+ * @param[in] gptp pointer to a @p GPTDriver object
+ * @param[in] interval new cycle time in timer ticks
+ *
+ * @api
+ */
+void stm32_gptChangeInterval(GPTDriver *gptp, gptcnt_t interval) {
+
+ chDbgCheck(gptp != NULL, "gptChangeInterval");
+
+ chSysLock();
+ chDbgAssert(gptp->state == GPT_CONTINUOUS,
+ "gptChangeInterval(), #1", "invalid state");
+ stm32_gptChangeIntervalI(gptp, interval);
+ chSysUnlock();
+}
+
+/**
* @brief Starts the timer in continuous mode.
*
* @param[in] gptp pointer to the @p GPTDriver object
|