aboutsummaryrefslogtreecommitdiffstats
path: root/os
diff options
context:
space:
mode:
Diffstat (limited to 'os')
-rw-r--r--os/hal/include/gpt.h18
-rw-r--r--os/hal/platforms/STM32/gpt_lld.h16
-rw-r--r--os/hal/src/gpt.c24
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