diff options
Diffstat (limited to 'os')
-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
|