amiro-os / kernel / patches / Introduced-support-for-the-ADC-analog-watchdog.patch @ 3e1a9c79
History | View | Annotate | Download (4.128 KB)
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 |
|