| 1 |
|
From d5e13e540dec58ece6de3d246a166185418f3fd3 Mon Sep 17 00:00:00 2001
|
| 2 |
|
From: =?UTF-8?q?Thomas=20Sch=C3=B6pping?= <tschoepp@cit-ec.uni-bielefeld.de>
|
| 3 |
|
Date: Mon, 12 Jun 2017 17:27:13 +0200
|
| 4 |
|
Subject: [PATCH] Introduced support for the ADC analog watchdog (ADCv2 only).
|
| 5 |
|
|
| 6 |
|
---
|
| 7 |
|
os/hal/ports/STM32/LLD/ADCv2/hal_adc_lld.c | 20 +++++++++++++++++---
|
| 8 |
|
os/hal/ports/STM32/LLD/ADCv2/hal_adc_lld.h | 21 ++++++++++++++++++++-
|
| 9 |
|
2 files changed, 37 insertions(+), 4 deletions(-)
|
| 10 |
|
|
| 11 |
|
diff --git a/os/hal/ports/STM32/LLD/ADCv2/hal_adc_lld.c b/os/hal/ports/STM32/LLD/ADCv2/hal_adc_lld.c
|
| 12 |
|
index b2e651e..d5875ee 100644
|
| 13 |
|
--- a/os/hal/ports/STM32/LLD/ADCv2/hal_adc_lld.c
|
| 14 |
|
+++ b/os/hal/ports/STM32/LLD/ADCv2/hal_adc_lld.c
|
| 15 |
|
@@ -124,7 +124,11 @@ OSAL_IRQ_HANDLER(STM32_ADC_HANDLER) {
|
| 16 |
|
if (ADCD1.grpp != NULL)
|
| 17 |
|
_adc_isr_error_code(&ADCD1, ADC_ERR_OVERFLOW);
|
| 18 |
|
}
|
| 19 |
|
- /* TODO: Add here analog watchdog handling.*/
|
| 20 |
|
+ if (sr & ADC_SR_AWD) {
|
| 21 |
|
+ if (ADCD1.grpp != NULL) {
|
| 22 |
|
+ _adc_isr_error_code(&ADCD1, ADC_ERR_WATCHDOG);
|
| 23 |
|
+ }
|
| 24 |
|
+ }
|
| 25 |
|
#if defined(STM32_ADC_ADC1_IRQ_HOOK)
|
| 26 |
|
STM32_ADC_ADC1_IRQ_HOOK
|
| 27 |
|
#endif
|
| 28 |
|
@@ -141,7 +145,11 @@ OSAL_IRQ_HANDLER(STM32_ADC_HANDLER) {
|
| 29 |
|
if (ADCD2.grpp != NULL)
|
| 30 |
|
_adc_isr_error_code(&ADCD2, ADC_ERR_OVERFLOW);
|
| 31 |
|
}
|
| 32 |
|
- /* TODO: Add here analog watchdog handling.*/
|
| 33 |
|
+ if (sr & ADC_SR_AWD) {
|
| 34 |
|
+ if (ADCD2.grpp != NULL) {
|
| 35 |
|
+ _adc_isr_error_code(&ADCD2, ADC_ERR_WATCHDOG);
|
| 36 |
|
+ }
|
| 37 |
|
+ }
|
| 38 |
|
#if defined(STM32_ADC_ADC2_IRQ_HOOK)
|
| 39 |
|
STM32_ADC_ADC2_IRQ_HOOK
|
| 40 |
|
#endif
|
| 41 |
|
@@ -158,7 +166,11 @@ OSAL_IRQ_HANDLER(STM32_ADC_HANDLER) {
|
| 42 |
|
if (ADCD3.grpp != NULL)
|
| 43 |
|
_adc_isr_error_code(&ADCD3, ADC_ERR_OVERFLOW);
|
| 44 |
|
}
|
| 45 |
|
- /* TODO: Add here analog watchdog handling.*/
|
| 46 |
|
+ if (sr & ADC_SR_AWD) {
|
| 47 |
|
+ if (ADCD3.grpp != NULL) {
|
| 48 |
|
+ _adc_isr_error_code(&ADCD3, ADC_ERR_WATCHDOG);
|
| 49 |
|
+ }
|
| 50 |
|
+ }
|
| 51 |
|
#if defined(STM32_ADC_ADC3_IRQ_HOOK)
|
| 52 |
|
STM32_ADC_ADC3_IRQ_HOOK
|
| 53 |
|
#endif
|
| 54 |
|
@@ -350,6 +362,8 @@ void adc_lld_start_conversion(ADCDriver *adcp) {
|
| 55 |
|
adcp->adc->SR = 0;
|
| 56 |
|
adcp->adc->SMPR1 = grpp->smpr1;
|
| 57 |
|
adcp->adc->SMPR2 = grpp->smpr2;
|
| 58 |
|
+ adcp->adc->HTR = grpp->htr;
|
| 59 |
|
+ adcp->adc->LTR = grpp->ltr;
|
| 60 |
|
adcp->adc->SQR1 = grpp->sqr1 | ADC_SQR1_NUM_CH(grpp->num_channels);
|
| 61 |
|
adcp->adc->SQR2 = grpp->sqr2;
|
| 62 |
|
adcp->adc->SQR3 = grpp->sqr3;
|
| 63 |
|
diff --git a/os/hal/ports/STM32/LLD/ADCv2/hal_adc_lld.h b/os/hal/ports/STM32/LLD/ADCv2/hal_adc_lld.h
|
| 64 |
|
index 13df506..fa266f0 100644
|
| 65 |
|
--- a/os/hal/ports/STM32/LLD/ADCv2/hal_adc_lld.h
|
| 66 |
|
+++ b/os/hal/ports/STM32/LLD/ADCv2/hal_adc_lld.h
|
| 67 |
|
@@ -313,7 +313,8 @@ typedef uint16_t adc_channels_num_t;
|
| 68 |
|
*/
|
| 69 |
|
typedef enum {
|
| 70 |
|
ADC_ERR_DMAFAILURE = 0, /**< DMA operations failure. */
|
| 71 |
|
- ADC_ERR_OVERFLOW = 1 /**< ADC overflow condition. */
|
| 72 |
|
+ ADC_ERR_OVERFLOW = 1, /**< ADC overflow condition. */
|
| 73 |
|
+ ADC_ERR_WATCHDOG = 2 /**< ADC watchdog condition. */
|
| 74 |
|
} adcerror_t;
|
| 75 |
|
|
| 76 |
|
/**
|
| 77 |
|
@@ -392,6 +393,16 @@ typedef struct {
|
| 78 |
|
*/
|
| 79 |
|
uint32_t smpr2;
|
| 80 |
|
/**
|
| 81 |
|
+ * @brief ADC watchdog high threshold register.
|
| 82 |
|
+ * @details This field defines the high threshold of the analog watchdog.
|
| 83 |
|
+ */
|
| 84 |
|
+ uint16_t htr;
|
| 85 |
|
+ /**
|
| 86 |
|
+ * @brief ADC watchdog low threshold register.
|
| 87 |
|
+ * @details This field defines the low threshold of the analog watchdog.
|
| 88 |
|
+ */
|
| 89 |
|
+ uint16_t ltr;
|
| 90 |
|
+ /**
|
| 91 |
|
* @brief ADC SQR1 register initialization data.
|
| 92 |
|
* @details Conversion group sequence 13...16 + sequence length.
|
| 93 |
|
*/
|
| 94 |
|
@@ -531,6 +542,14 @@ struct ADCDriver {
|
| 95 |
|
#define ADC_SMPR1_SMP_VBAT(n) ((n) << 24) /**< @brief VBAT sampling time. */
|
| 96 |
|
/** @} */
|
| 97 |
|
|
| 98 |
|
+/**
|
| 99 |
|
+ * @name Threshold settings helper macros
|
| 100 |
|
+ * @{
|
| 101 |
|
+ */
|
| 102 |
|
+#define ADC_HTR(n) ((n > ADC_HTR_HT) ? ADC_HTR_HT : n) /**< @brief High threshold limitation. */
|
| 103 |
|
+#define ADC_LTR(n) ((n > ADC_LTR_LT) ? ADC_LTR_LT : n) /**< @brief Low threshold limitation. */
|
| 104 |
|
+/** @} */
|
| 105 |
|
+
|
| 106 |
|
/*===========================================================================*/
|
| 107 |
|
/* External declarations. */
|
| 108 |
|
/*===========================================================================*/
|
| 109 |
|
--
|
| 110 |
|
2.7.4
|
| 111 |
|
|