mbed library sources. Supersedes mbed-src.
Fork of mbed-dev by
targets/hal/TARGET_Atmel/TARGET_SAM_CortexM0P/drivers/adc/adc.h@15:a81a8d6c1dfe, 2015-11-04 (annotated)
- Committer:
- mbed_official
- Date:
- Wed Nov 04 16:30:11 2015 +0000
- Revision:
- 15:a81a8d6c1dfe
Synchronized with git revision 46af745ef4405614c3fa49abbd9a706a362ea514
Full URL: https://github.com/mbedmicro/mbed/commit/46af745ef4405614c3fa49abbd9a706a362ea514/
Renamed TARGET_SAM_CortexM0+ to TARGET_SAM_CortexM0P for compatiblity with online compiler
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mbed_official | 15:a81a8d6c1dfe | 1 | /** |
mbed_official | 15:a81a8d6c1dfe | 2 | * \file |
mbed_official | 15:a81a8d6c1dfe | 3 | * |
mbed_official | 15:a81a8d6c1dfe | 4 | * \brief SAM Peripheral Analog-to-Digital Converter Driver |
mbed_official | 15:a81a8d6c1dfe | 5 | * |
mbed_official | 15:a81a8d6c1dfe | 6 | * Copyright (C) 2012-2015 Atmel Corporation. All rights reserved. |
mbed_official | 15:a81a8d6c1dfe | 7 | * |
mbed_official | 15:a81a8d6c1dfe | 8 | * \asf_license_start |
mbed_official | 15:a81a8d6c1dfe | 9 | * |
mbed_official | 15:a81a8d6c1dfe | 10 | * \page License |
mbed_official | 15:a81a8d6c1dfe | 11 | * |
mbed_official | 15:a81a8d6c1dfe | 12 | * Redistribution and use in source and binary forms, with or without |
mbed_official | 15:a81a8d6c1dfe | 13 | * modification, are permitted provided that the following conditions are met: |
mbed_official | 15:a81a8d6c1dfe | 14 | * |
mbed_official | 15:a81a8d6c1dfe | 15 | * 1. Redistributions of source code must retain the above copyright notice, |
mbed_official | 15:a81a8d6c1dfe | 16 | * this list of conditions and the following disclaimer. |
mbed_official | 15:a81a8d6c1dfe | 17 | * |
mbed_official | 15:a81a8d6c1dfe | 18 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
mbed_official | 15:a81a8d6c1dfe | 19 | * this list of conditions and the following disclaimer in the documentation |
mbed_official | 15:a81a8d6c1dfe | 20 | * and/or other materials provided with the distribution. |
mbed_official | 15:a81a8d6c1dfe | 21 | * |
mbed_official | 15:a81a8d6c1dfe | 22 | * 3. The name of Atmel may not be used to endorse or promote products derived |
mbed_official | 15:a81a8d6c1dfe | 23 | * from this software without specific prior written permission. |
mbed_official | 15:a81a8d6c1dfe | 24 | * |
mbed_official | 15:a81a8d6c1dfe | 25 | * 4. This software may only be redistributed and used in connection with an |
mbed_official | 15:a81a8d6c1dfe | 26 | * Atmel microcontroller product. |
mbed_official | 15:a81a8d6c1dfe | 27 | * |
mbed_official | 15:a81a8d6c1dfe | 28 | * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED |
mbed_official | 15:a81a8d6c1dfe | 29 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
mbed_official | 15:a81a8d6c1dfe | 30 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE |
mbed_official | 15:a81a8d6c1dfe | 31 | * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR |
mbed_official | 15:a81a8d6c1dfe | 32 | * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
mbed_official | 15:a81a8d6c1dfe | 33 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
mbed_official | 15:a81a8d6c1dfe | 34 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
mbed_official | 15:a81a8d6c1dfe | 35 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
mbed_official | 15:a81a8d6c1dfe | 36 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
mbed_official | 15:a81a8d6c1dfe | 37 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
mbed_official | 15:a81a8d6c1dfe | 38 | * POSSIBILITY OF SUCH DAMAGE. |
mbed_official | 15:a81a8d6c1dfe | 39 | * |
mbed_official | 15:a81a8d6c1dfe | 40 | * \asf_license_stop |
mbed_official | 15:a81a8d6c1dfe | 41 | * |
mbed_official | 15:a81a8d6c1dfe | 42 | */ |
mbed_official | 15:a81a8d6c1dfe | 43 | /* |
mbed_official | 15:a81a8d6c1dfe | 44 | * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a> |
mbed_official | 15:a81a8d6c1dfe | 45 | */ |
mbed_official | 15:a81a8d6c1dfe | 46 | |
mbed_official | 15:a81a8d6c1dfe | 47 | #ifndef ADC_H_INCLUDED |
mbed_official | 15:a81a8d6c1dfe | 48 | #define ADC_H_INCLUDED |
mbed_official | 15:a81a8d6c1dfe | 49 | |
mbed_official | 15:a81a8d6c1dfe | 50 | /** |
mbed_official | 15:a81a8d6c1dfe | 51 | * \defgroup asfdoc_sam0_adc_group SAM Analog-to-Digital Converter (ADC) Driver |
mbed_official | 15:a81a8d6c1dfe | 52 | * |
mbed_official | 15:a81a8d6c1dfe | 53 | * This driver for Atmel® | SMART ARM®-based microcontrollers provides an interface for the configuration |
mbed_official | 15:a81a8d6c1dfe | 54 | * and management of the device's Analog-to-Digital Converter functionality, for |
mbed_official | 15:a81a8d6c1dfe | 55 | * the conversion of analog voltages into a corresponding digital form. |
mbed_official | 15:a81a8d6c1dfe | 56 | * The following driver Application Programming Interface (API) modes are covered by this manual: |
mbed_official | 15:a81a8d6c1dfe | 57 | * - Polled APIs |
mbed_official | 15:a81a8d6c1dfe | 58 | * \if ADC_CALLBACK_MODE |
mbed_official | 15:a81a8d6c1dfe | 59 | * - Callback APIs |
mbed_official | 15:a81a8d6c1dfe | 60 | * \endif |
mbed_official | 15:a81a8d6c1dfe | 61 | * |
mbed_official | 15:a81a8d6c1dfe | 62 | * The following peripheral is used by this module: |
mbed_official | 15:a81a8d6c1dfe | 63 | * - ADC (Analog-to-Digital Converter) |
mbed_official | 15:a81a8d6c1dfe | 64 | * |
mbed_official | 15:a81a8d6c1dfe | 65 | * The following devices can use this module: |
mbed_official | 15:a81a8d6c1dfe | 66 | * \if DEVICE_SAML21_SUPPORT |
mbed_official | 15:a81a8d6c1dfe | 67 | * - Atmel | SMART SAM L21 |
mbed_official | 15:a81a8d6c1dfe | 68 | * - Atmel | SMART SAM C20/C21 |
mbed_official | 15:a81a8d6c1dfe | 69 | * \else |
mbed_official | 15:a81a8d6c1dfe | 70 | * - Atmel | SMART SAM D20/D21 |
mbed_official | 15:a81a8d6c1dfe | 71 | * - Atmel | SMART SAM R21 |
mbed_official | 15:a81a8d6c1dfe | 72 | * - Atmel | SMART SAM D10/D11 |
mbed_official | 15:a81a8d6c1dfe | 73 | * - Atmel | SMART SAM DA0/DA1 |
mbed_official | 15:a81a8d6c1dfe | 74 | * \endif |
mbed_official | 15:a81a8d6c1dfe | 75 | * |
mbed_official | 15:a81a8d6c1dfe | 76 | * The outline of this documentation is as follows: |
mbed_official | 15:a81a8d6c1dfe | 77 | * - \ref asfdoc_sam0_adc_prerequisites |
mbed_official | 15:a81a8d6c1dfe | 78 | * - \ref asfdoc_sam0_adc_module_overview |
mbed_official | 15:a81a8d6c1dfe | 79 | * - \ref asfdoc_sam0_adc_special_considerations |
mbed_official | 15:a81a8d6c1dfe | 80 | * - \ref asfdoc_sam0_adc_extra_info |
mbed_official | 15:a81a8d6c1dfe | 81 | * - \ref asfdoc_sam0_adc_examples |
mbed_official | 15:a81a8d6c1dfe | 82 | * - \ref asfdoc_sam0_adc_api_overview |
mbed_official | 15:a81a8d6c1dfe | 83 | * |
mbed_official | 15:a81a8d6c1dfe | 84 | * |
mbed_official | 15:a81a8d6c1dfe | 85 | * \section asfdoc_sam0_adc_prerequisites Prerequisites |
mbed_official | 15:a81a8d6c1dfe | 86 | * |
mbed_official | 15:a81a8d6c1dfe | 87 | * There are no prerequisites for this module. |
mbed_official | 15:a81a8d6c1dfe | 88 | * |
mbed_official | 15:a81a8d6c1dfe | 89 | * |
mbed_official | 15:a81a8d6c1dfe | 90 | * \section asfdoc_sam0_adc_module_overview Module Overview |
mbed_official | 15:a81a8d6c1dfe | 91 | * |
mbed_official | 15:a81a8d6c1dfe | 92 | * This driver provides an interface for the Analog-to-Digital conversion |
mbed_official | 15:a81a8d6c1dfe | 93 | * functions on the device, to convert analog voltages to a corresponding |
mbed_official | 15:a81a8d6c1dfe | 94 | * digital value. The ADC has up to 12-bit resolution, and is capable of |
mbed_official | 15:a81a8d6c1dfe | 95 | * \if DEVICE_SAML21_SUPPORT |
mbed_official | 15:a81a8d6c1dfe | 96 | * converting up to 1,000,000 samples per second (MSPS). |
mbed_official | 15:a81a8d6c1dfe | 97 | * \else |
mbed_official | 15:a81a8d6c1dfe | 98 | * converting up to 500K samples per second (KSPS). |
mbed_official | 15:a81a8d6c1dfe | 99 | * \endif |
mbed_official | 15:a81a8d6c1dfe | 100 | * |
mbed_official | 15:a81a8d6c1dfe | 101 | * The ADC has a compare function for accurate monitoring of user defined |
mbed_official | 15:a81a8d6c1dfe | 102 | * thresholds with minimum software intervention required. |
mbed_official | 15:a81a8d6c1dfe | 103 | * The ADC may be configured for 8-, 10-, or 12-bit result, reducing the |
mbed_official | 15:a81a8d6c1dfe | 104 | * conversion time. ADC conversion results are provided left or right adjusted |
mbed_official | 15:a81a8d6c1dfe | 105 | * which eases calculation when the result is represented as a signed integer. |
mbed_official | 15:a81a8d6c1dfe | 106 | * |
mbed_official | 15:a81a8d6c1dfe | 107 | * The input selection is flexible, and both single-ended and differential |
mbed_official | 15:a81a8d6c1dfe | 108 | * measurements can be made. For differential measurements, an optional gain |
mbed_official | 15:a81a8d6c1dfe | 109 | * stage is available to increase the dynamic range. In addition, several |
mbed_official | 15:a81a8d6c1dfe | 110 | * internal signal inputs are available. The ADC can provide both signed and |
mbed_official | 15:a81a8d6c1dfe | 111 | * unsigned results. |
mbed_official | 15:a81a8d6c1dfe | 112 | * |
mbed_official | 15:a81a8d6c1dfe | 113 | * The ADC measurements can either be started by application software or an |
mbed_official | 15:a81a8d6c1dfe | 114 | * incoming event from another peripheral in the device, and both internal and |
mbed_official | 15:a81a8d6c1dfe | 115 | * external reference voltages can be selected. |
mbed_official | 15:a81a8d6c1dfe | 116 | * |
mbed_official | 15:a81a8d6c1dfe | 117 | * \note Internal references will be enabled by the driver, but not disabled. |
mbed_official | 15:a81a8d6c1dfe | 118 | * Any reference not used by the application should be disabled by the application. |
mbed_official | 15:a81a8d6c1dfe | 119 | * |
mbed_official | 15:a81a8d6c1dfe | 120 | * A simplified block diagram of the ADC can be seen in |
mbed_official | 15:a81a8d6c1dfe | 121 | * \ref asfdoc_sam0_adc_module_block_diagram "the figure below". |
mbed_official | 15:a81a8d6c1dfe | 122 | * |
mbed_official | 15:a81a8d6c1dfe | 123 | * \anchor asfdoc_sam0_adc_module_block_diagram |
mbed_official | 15:a81a8d6c1dfe | 124 | * \dot |
mbed_official | 15:a81a8d6c1dfe | 125 | * digraph overview { |
mbed_official | 15:a81a8d6c1dfe | 126 | * splines = false; |
mbed_official | 15:a81a8d6c1dfe | 127 | * rankdir=LR; |
mbed_official | 15:a81a8d6c1dfe | 128 | * |
mbed_official | 15:a81a8d6c1dfe | 129 | * mux1 [label="Positive input", shape=box]; |
mbed_official | 15:a81a8d6c1dfe | 130 | * mux2 [label="Negative input", shape=box]; |
mbed_official | 15:a81a8d6c1dfe | 131 | * |
mbed_official | 15:a81a8d6c1dfe | 132 | * |
mbed_official | 15:a81a8d6c1dfe | 133 | * mux3 [label="Reference", shape=box]; |
mbed_official | 15:a81a8d6c1dfe | 134 | * |
mbed_official | 15:a81a8d6c1dfe | 135 | * adc [label="ADC", shape=polygon, sides=5, orientation=90, distortion=-0.6, style=filled, fillcolor=darkolivegreen1, height=1, width=1]; |
mbed_official | 15:a81a8d6c1dfe | 136 | * prescaler [label="PRESCALER", shape=box, style=filled, fillcolor=lightblue]; |
mbed_official | 15:a81a8d6c1dfe | 137 | * |
mbed_official | 15:a81a8d6c1dfe | 138 | * mux1 -> adc; |
mbed_official | 15:a81a8d6c1dfe | 139 | * mux2 -> adc; |
mbed_official | 15:a81a8d6c1dfe | 140 | * mux3 -> adc:sw; |
mbed_official | 15:a81a8d6c1dfe | 141 | * prescaler -> adc; |
mbed_official | 15:a81a8d6c1dfe | 142 | * |
mbed_official | 15:a81a8d6c1dfe | 143 | * postproc [label="Post processing", shape=box]; |
mbed_official | 15:a81a8d6c1dfe | 144 | * result [label="RESULT", shape=box, style=filled, fillcolor=lightblue]; |
mbed_official | 15:a81a8d6c1dfe | 145 | * |
mbed_official | 15:a81a8d6c1dfe | 146 | * adc:e -> postproc:w; |
mbed_official | 15:a81a8d6c1dfe | 147 | * postproc:e -> result:w; |
mbed_official | 15:a81a8d6c1dfe | 148 | * |
mbed_official | 15:a81a8d6c1dfe | 149 | * {rank=same; mux1 mux2} |
mbed_official | 15:a81a8d6c1dfe | 150 | * {rank=same; prescaler adc} |
mbed_official | 15:a81a8d6c1dfe | 151 | * |
mbed_official | 15:a81a8d6c1dfe | 152 | * } |
mbed_official | 15:a81a8d6c1dfe | 153 | * \enddot |
mbed_official | 15:a81a8d6c1dfe | 154 | * |
mbed_official | 15:a81a8d6c1dfe | 155 | * |
mbed_official | 15:a81a8d6c1dfe | 156 | * \subsection asfdoc_sam0_adc_module_overview_prescaler Sample Clock Prescaler |
mbed_official | 15:a81a8d6c1dfe | 157 | * The ADC features a prescaler, which enables conversion at lower clock rates |
mbed_official | 15:a81a8d6c1dfe | 158 | * than the input Generic Clock to the ADC module. This feature can be used to |
mbed_official | 15:a81a8d6c1dfe | 159 | * lower the synchronization time of the digital interface to the ADC module |
mbed_official | 15:a81a8d6c1dfe | 160 | * via a high speed Generic Clock frequency, while still allowing the ADC |
mbed_official | 15:a81a8d6c1dfe | 161 | * sampling rate to be reduced. |
mbed_official | 15:a81a8d6c1dfe | 162 | * |
mbed_official | 15:a81a8d6c1dfe | 163 | * \subsection asfdoc_sam0_adc_module_overview_resolution ADC Resolution |
mbed_official | 15:a81a8d6c1dfe | 164 | * The ADC supports full 8-, 10-, or 12-bit resolution. Hardware |
mbed_official | 15:a81a8d6c1dfe | 165 | * oversampling and decimation can be used to increase the |
mbed_official | 15:a81a8d6c1dfe | 166 | * effective resolution at the expense of throughput. Using oversampling and |
mbed_official | 15:a81a8d6c1dfe | 167 | * decimation mode the ADC resolution is increased from 12-bit to an effective |
mbed_official | 15:a81a8d6c1dfe | 168 | * 13-, 14-, 15-, or 16-bit. In these modes the conversion rate is reduced, as |
mbed_official | 15:a81a8d6c1dfe | 169 | * a greater number of samples is used to achieve the increased resolution. The |
mbed_official | 15:a81a8d6c1dfe | 170 | * available resolutions and effective conversion rate is listed in |
mbed_official | 15:a81a8d6c1dfe | 171 | * \ref asfdoc_sam0_adc_module_conversion_rate "the table below". |
mbed_official | 15:a81a8d6c1dfe | 172 | * |
mbed_official | 15:a81a8d6c1dfe | 173 | * \anchor asfdoc_sam0_adc_module_conversion_rate |
mbed_official | 15:a81a8d6c1dfe | 174 | * <table> |
mbed_official | 15:a81a8d6c1dfe | 175 | * <caption>Effective ADC Conversion Speed Using Oversampling</caption> |
mbed_official | 15:a81a8d6c1dfe | 176 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 177 | * <th>Resolution</th> |
mbed_official | 15:a81a8d6c1dfe | 178 | * <th>Effective conversion rate</th> |
mbed_official | 15:a81a8d6c1dfe | 179 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 180 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 181 | * <td>13-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 182 | * <td>Conversion rate divided by 4</td> |
mbed_official | 15:a81a8d6c1dfe | 183 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 184 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 185 | * <td>14-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 186 | * <td>Conversion rate divided by 16</td> |
mbed_official | 15:a81a8d6c1dfe | 187 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 188 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 189 | * <td>15-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 190 | * <td>Conversion rate divided by 64</td> |
mbed_official | 15:a81a8d6c1dfe | 191 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 192 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 193 | * <td>16-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 194 | * <td>Conversion rate divided by 256</td> |
mbed_official | 15:a81a8d6c1dfe | 195 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 196 | * </table> |
mbed_official | 15:a81a8d6c1dfe | 197 | * |
mbed_official | 15:a81a8d6c1dfe | 198 | * \subsection asfdoc_sam0_adc_module_overview_conversion Conversion Modes |
mbed_official | 15:a81a8d6c1dfe | 199 | * ADC conversions can be software triggered on demand by the user application, |
mbed_official | 15:a81a8d6c1dfe | 200 | * if continuous sampling is not required. It is also possible to configure the |
mbed_official | 15:a81a8d6c1dfe | 201 | * ADC in free running mode, where new conversions are started as soon as the |
mbed_official | 15:a81a8d6c1dfe | 202 | * previous conversion is completed, or configure the ADC to scan across a |
mbed_official | 15:a81a8d6c1dfe | 203 | * number of input pins (see \ref asfdoc_sam0_adc_module_overview_pin_scan). |
mbed_official | 15:a81a8d6c1dfe | 204 | * |
mbed_official | 15:a81a8d6c1dfe | 205 | * \subsection asfdoc_sam0_adc_module_overview_diff_mode Differential and Single-ended Conversion |
mbed_official | 15:a81a8d6c1dfe | 206 | * The ADC has two conversion modes; differential and single-ended. When |
mbed_official | 15:a81a8d6c1dfe | 207 | * measuring signals where the positive input pin is always at a higher voltage |
mbed_official | 15:a81a8d6c1dfe | 208 | * than the negative input pin, the single-ended conversion mode should be used |
mbed_official | 15:a81a8d6c1dfe | 209 | * in order to achieve a full 12-bit output resolution. |
mbed_official | 15:a81a8d6c1dfe | 210 | * |
mbed_official | 15:a81a8d6c1dfe | 211 | * If however the positive input pin voltage may drop below the negative input |
mbed_official | 15:a81a8d6c1dfe | 212 | * pin the signed differential mode should be used. |
mbed_official | 15:a81a8d6c1dfe | 213 | * |
mbed_official | 15:a81a8d6c1dfe | 214 | * \subsection asfdoc_sam0_adc_module_overview_sample_time Sample Time |
mbed_official | 15:a81a8d6c1dfe | 215 | * The sample time for each ADC conversion is configurable as a number of half |
mbed_official | 15:a81a8d6c1dfe | 216 | * prescaled ADC clock cycles (depending on the prescaler value), allowing the |
mbed_official | 15:a81a8d6c1dfe | 217 | * user application to achieve faster or slower sampling depending on the |
mbed_official | 15:a81a8d6c1dfe | 218 | * source impedance of the ADC input channels. For applications with high |
mbed_official | 15:a81a8d6c1dfe | 219 | * impedance inputs the sample time can be increased to give the ADC an adequate |
mbed_official | 15:a81a8d6c1dfe | 220 | * time to sample and convert the input channel. |
mbed_official | 15:a81a8d6c1dfe | 221 | * |
mbed_official | 15:a81a8d6c1dfe | 222 | * The resulting sampling time is given by the following equation: |
mbed_official | 15:a81a8d6c1dfe | 223 | * \f[ |
mbed_official | 15:a81a8d6c1dfe | 224 | * t_{SAMPLE} = (sample\_length+1) \times \frac{ADC_{CLK}} {2} |
mbed_official | 15:a81a8d6c1dfe | 225 | * \f] |
mbed_official | 15:a81a8d6c1dfe | 226 | * |
mbed_official | 15:a81a8d6c1dfe | 227 | * \subsection asfdoc_sam0_adc_module_overview_averaging Averaging |
mbed_official | 15:a81a8d6c1dfe | 228 | * The ADC can be configured to trade conversion speed for accuracy by averaging |
mbed_official | 15:a81a8d6c1dfe | 229 | * multiple samples in hardware. This feature is suitable when operating in |
mbed_official | 15:a81a8d6c1dfe | 230 | * noisy conditions. |
mbed_official | 15:a81a8d6c1dfe | 231 | * |
mbed_official | 15:a81a8d6c1dfe | 232 | * You can specify any number of samples to accumulate (up to 1024) and the |
mbed_official | 15:a81a8d6c1dfe | 233 | * divide ratio to use (up to divide by 128). To modify these settings the |
mbed_official | 15:a81a8d6c1dfe | 234 | * ADC_RESOLUTION_CUSTOM needs to be set as the resolution. When this is set |
mbed_official | 15:a81a8d6c1dfe | 235 | * the number of samples to accumulate and the division ratio can be set by |
mbed_official | 15:a81a8d6c1dfe | 236 | * the configuration struct members \ref adc_config.accumulate_samples and |
mbed_official | 15:a81a8d6c1dfe | 237 | * \ref adc_config.divide_result. When using this mode the ADC result register |
mbed_official | 15:a81a8d6c1dfe | 238 | * will be set to be 16-bit wide to accommodate the larger result sizes |
mbed_official | 15:a81a8d6c1dfe | 239 | * produced by the accumulator. |
mbed_official | 15:a81a8d6c1dfe | 240 | * |
mbed_official | 15:a81a8d6c1dfe | 241 | * The effective ADC conversion rate will be reduced by a factor of the number |
mbed_official | 15:a81a8d6c1dfe | 242 | * of accumulated samples; |
mbed_official | 15:a81a8d6c1dfe | 243 | * however, the effective resolution will be increased according to |
mbed_official | 15:a81a8d6c1dfe | 244 | * \ref asfdoc_sam0_adc_module_hw_av_resolution "the table below". |
mbed_official | 15:a81a8d6c1dfe | 245 | * |
mbed_official | 15:a81a8d6c1dfe | 246 | * \anchor asfdoc_sam0_adc_module_hw_av_resolution |
mbed_official | 15:a81a8d6c1dfe | 247 | * <table> |
mbed_official | 15:a81a8d6c1dfe | 248 | * <caption>Effective ADC Resolution From Various Hardware Averaging Modes</caption> |
mbed_official | 15:a81a8d6c1dfe | 249 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 250 | * <th>Number of samples</tr> |
mbed_official | 15:a81a8d6c1dfe | 251 | * <th>Final result</tr> |
mbed_official | 15:a81a8d6c1dfe | 252 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 253 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 254 | * <td>1</td> |
mbed_official | 15:a81a8d6c1dfe | 255 | * <td>12-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 256 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 257 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 258 | * <td>2</td> |
mbed_official | 15:a81a8d6c1dfe | 259 | * <td>13-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 260 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 261 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 262 | * <td>4</td> |
mbed_official | 15:a81a8d6c1dfe | 263 | * <td>14-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 264 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 265 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 266 | * <td>8</td> |
mbed_official | 15:a81a8d6c1dfe | 267 | * <td>15-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 268 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 269 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 270 | * <td>16</td> |
mbed_official | 15:a81a8d6c1dfe | 271 | * <td>16-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 272 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 273 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 274 | * <td>32</td> |
mbed_official | 15:a81a8d6c1dfe | 275 | * <td>16-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 276 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 277 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 278 | * <td>64</td> |
mbed_official | 15:a81a8d6c1dfe | 279 | * <td>16-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 280 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 281 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 282 | * <td>128</td> |
mbed_official | 15:a81a8d6c1dfe | 283 | * <td>16-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 284 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 285 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 286 | * <td>256</td> |
mbed_official | 15:a81a8d6c1dfe | 287 | * <td>16-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 288 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 289 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 290 | * <td>512</td> |
mbed_official | 15:a81a8d6c1dfe | 291 | * <td>16-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 292 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 293 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 294 | * <td>1024</td> |
mbed_official | 15:a81a8d6c1dfe | 295 | * <td>16-bit</td> |
mbed_official | 15:a81a8d6c1dfe | 296 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 297 | * </table> |
mbed_official | 15:a81a8d6c1dfe | 298 | * |
mbed_official | 15:a81a8d6c1dfe | 299 | * |
mbed_official | 15:a81a8d6c1dfe | 300 | * \subsection asfdoc_sam0_adc_module_overview_offset_corr Offset and Gain Correction |
mbed_official | 15:a81a8d6c1dfe | 301 | * Inherent gain and offset errors affect the absolute accuracy of the ADC. |
mbed_official | 15:a81a8d6c1dfe | 302 | * |
mbed_official | 15:a81a8d6c1dfe | 303 | * The offset error is defined as the deviation of the ADC's actual transfer |
mbed_official | 15:a81a8d6c1dfe | 304 | * function from ideal straight line at zero input voltage. |
mbed_official | 15:a81a8d6c1dfe | 305 | * |
mbed_official | 15:a81a8d6c1dfe | 306 | * The gain error is defined as the deviation of the last output step's |
mbed_official | 15:a81a8d6c1dfe | 307 | * midpoint from the ideal straight line, after compensating for offset error. |
mbed_official | 15:a81a8d6c1dfe | 308 | * |
mbed_official | 15:a81a8d6c1dfe | 309 | * The offset correction value is subtracted from the converted data before the |
mbed_official | 15:a81a8d6c1dfe | 310 | * result is ready. The gain correction value is multiplied with the offset |
mbed_official | 15:a81a8d6c1dfe | 311 | * corrected value. |
mbed_official | 15:a81a8d6c1dfe | 312 | * |
mbed_official | 15:a81a8d6c1dfe | 313 | * The equation for both offset and gain error compensation is shown below: |
mbed_official | 15:a81a8d6c1dfe | 314 | * \f[ |
mbed_official | 15:a81a8d6c1dfe | 315 | * ADC_{RESULT} = (VALUE_{CONV} + CORR_{OFFSET}) \times CORR_{GAIN} |
mbed_official | 15:a81a8d6c1dfe | 316 | * \f] |
mbed_official | 15:a81a8d6c1dfe | 317 | * |
mbed_official | 15:a81a8d6c1dfe | 318 | * When enabled, a given set of offset and gain correction values can be applied |
mbed_official | 15:a81a8d6c1dfe | 319 | * to the sampled data in hardware, giving a corrected stream of sample data to |
mbed_official | 15:a81a8d6c1dfe | 320 | * the user application at the cost of an increased sample latency. |
mbed_official | 15:a81a8d6c1dfe | 321 | * |
mbed_official | 15:a81a8d6c1dfe | 322 | * In single conversion, a latency of 13 ADC Generic Clock cycles is added for |
mbed_official | 15:a81a8d6c1dfe | 323 | * the final sample result availability. As the correction time is always less |
mbed_official | 15:a81a8d6c1dfe | 324 | * than the propagation delay, in free running mode this latency appears only |
mbed_official | 15:a81a8d6c1dfe | 325 | * during the first conversion. After the first conversion is complete, future |
mbed_official | 15:a81a8d6c1dfe | 326 | * conversion results are available at the defined sampling rate. |
mbed_official | 15:a81a8d6c1dfe | 327 | * |
mbed_official | 15:a81a8d6c1dfe | 328 | * \subsection asfdoc_sam0_adc_module_overview_pin_scan Pin Scan |
mbed_official | 15:a81a8d6c1dfe | 329 | * In pin scan mode, the first ADC conversion will begin from the configured |
mbed_official | 15:a81a8d6c1dfe | 330 | * positive channel, plus the requested starting offset. When the first |
mbed_official | 15:a81a8d6c1dfe | 331 | * conversion is completed, the next conversion will start at the next positive |
mbed_official | 15:a81a8d6c1dfe | 332 | * input channel and so on, until all requested pins to scan have been sampled |
mbed_official | 15:a81a8d6c1dfe | 333 | * and converted. |
mbed_official | 15:a81a8d6c1dfe | 334 | * SAM L21 has automatic sequences feature instead of pin scan mode. In automatic |
mbed_official | 15:a81a8d6c1dfe | 335 | * sequence mode, all of 32 positives inputs can be included in a sequence. The |
mbed_official | 15:a81a8d6c1dfe | 336 | * sequence starts from the lowest input, and go to the next enabled input |
mbed_official | 15:a81a8d6c1dfe | 337 | * automatically. |
mbed_official | 15:a81a8d6c1dfe | 338 | * |
mbed_official | 15:a81a8d6c1dfe | 339 | * Pin scanning gives a simple mechanism to sample a large number of physical |
mbed_official | 15:a81a8d6c1dfe | 340 | * input channel samples, using a single physical ADC channel. |
mbed_official | 15:a81a8d6c1dfe | 341 | * |
mbed_official | 15:a81a8d6c1dfe | 342 | * \subsection asfdoc_sam0_adc_module_overview_window_monitor Window Monitor |
mbed_official | 15:a81a8d6c1dfe | 343 | * The ADC module window monitor function can be used to automatically compare |
mbed_official | 15:a81a8d6c1dfe | 344 | * the conversion result against a preconfigured pair of upper and lower |
mbed_official | 15:a81a8d6c1dfe | 345 | * threshold values. |
mbed_official | 15:a81a8d6c1dfe | 346 | * |
mbed_official | 15:a81a8d6c1dfe | 347 | * The threshold values are evaluated differently, depending on whether |
mbed_official | 15:a81a8d6c1dfe | 348 | * differential or single-ended mode is selected. In differential mode, the |
mbed_official | 15:a81a8d6c1dfe | 349 | * upper and lower thresholds are evaluated as signed values for the comparison, |
mbed_official | 15:a81a8d6c1dfe | 350 | * while in single-ended mode the comparisons are made as a set of unsigned |
mbed_official | 15:a81a8d6c1dfe | 351 | * values. |
mbed_official | 15:a81a8d6c1dfe | 352 | * |
mbed_official | 15:a81a8d6c1dfe | 353 | * The significant bits of the lower window monitor threshold and upper window |
mbed_official | 15:a81a8d6c1dfe | 354 | * monitor threshold values are user-configurable, and follow the overall ADC |
mbed_official | 15:a81a8d6c1dfe | 355 | * sampling bit precision set when the ADC is configured by the user application. |
mbed_official | 15:a81a8d6c1dfe | 356 | * For example, only the eight lower bits of the window threshold values will be |
mbed_official | 15:a81a8d6c1dfe | 357 | * compared to the sampled data whilst the ADC is configured in 8-bit mode. |
mbed_official | 15:a81a8d6c1dfe | 358 | * In addition, if using differential mode, the 8<SUP>th</SUP> bit will be considered as |
mbed_official | 15:a81a8d6c1dfe | 359 | * the sign bit even if bit 9 is zero. |
mbed_official | 15:a81a8d6c1dfe | 360 | * |
mbed_official | 15:a81a8d6c1dfe | 361 | * \subsection asfdoc_sam0_adc_module_overview_events Events |
mbed_official | 15:a81a8d6c1dfe | 362 | * Event generation and event actions are configurable in the ADC. |
mbed_official | 15:a81a8d6c1dfe | 363 | * |
mbed_official | 15:a81a8d6c1dfe | 364 | * The ADC has two actions that can be triggered upon event reception: |
mbed_official | 15:a81a8d6c1dfe | 365 | * \li Start conversion |
mbed_official | 15:a81a8d6c1dfe | 366 | * \li Flush pipeline and start conversion |
mbed_official | 15:a81a8d6c1dfe | 367 | * |
mbed_official | 15:a81a8d6c1dfe | 368 | * The ADC can generate two events: |
mbed_official | 15:a81a8d6c1dfe | 369 | * \li Window monitor |
mbed_official | 15:a81a8d6c1dfe | 370 | * \li Result ready |
mbed_official | 15:a81a8d6c1dfe | 371 | * |
mbed_official | 15:a81a8d6c1dfe | 372 | * If the event actions are enabled in the configuration, any incoming event |
mbed_official | 15:a81a8d6c1dfe | 373 | * will trigger the action. |
mbed_official | 15:a81a8d6c1dfe | 374 | * |
mbed_official | 15:a81a8d6c1dfe | 375 | * If the window monitor event is enabled, an event will be generated |
mbed_official | 15:a81a8d6c1dfe | 376 | * when the configured window condition is detected. |
mbed_official | 15:a81a8d6c1dfe | 377 | * |
mbed_official | 15:a81a8d6c1dfe | 378 | * If the result ready event is enabled, an event will be generated when a |
mbed_official | 15:a81a8d6c1dfe | 379 | * conversion is completed. |
mbed_official | 15:a81a8d6c1dfe | 380 | * |
mbed_official | 15:a81a8d6c1dfe | 381 | * \note The connection of events between modules requires the use of the |
mbed_official | 15:a81a8d6c1dfe | 382 | * \ref asfdoc_sam0_events_group "SAM Event System Driver (EVENTS)" |
mbed_official | 15:a81a8d6c1dfe | 383 | * to route output event of one module to the the input event of another. |
mbed_official | 15:a81a8d6c1dfe | 384 | * For more information on event routing, refer to the event driver |
mbed_official | 15:a81a8d6c1dfe | 385 | * documentation. |
mbed_official | 15:a81a8d6c1dfe | 386 | * |
mbed_official | 15:a81a8d6c1dfe | 387 | * |
mbed_official | 15:a81a8d6c1dfe | 388 | * \section asfdoc_sam0_adc_special_considerations Special Considerations |
mbed_official | 15:a81a8d6c1dfe | 389 | * |
mbed_official | 15:a81a8d6c1dfe | 390 | * An integrated analog temperature sensor is available for use with the ADC. |
mbed_official | 15:a81a8d6c1dfe | 391 | * The bandgap voltage, as well as the scaled I/O and core voltages can also be |
mbed_official | 15:a81a8d6c1dfe | 392 | * measured by the ADC. For internal ADC inputs, the internal source(s) may need |
mbed_official | 15:a81a8d6c1dfe | 393 | * to be manually enabled by the user application before they can be measured. |
mbed_official | 15:a81a8d6c1dfe | 394 | * |
mbed_official | 15:a81a8d6c1dfe | 395 | * |
mbed_official | 15:a81a8d6c1dfe | 396 | * \section asfdoc_sam0_adc_extra_info Extra Information |
mbed_official | 15:a81a8d6c1dfe | 397 | * |
mbed_official | 15:a81a8d6c1dfe | 398 | * For extra information, see \ref asfdoc_sam0_adc_extra. This includes: |
mbed_official | 15:a81a8d6c1dfe | 399 | * - \ref asfdoc_sam0_adc_extra_acronyms |
mbed_official | 15:a81a8d6c1dfe | 400 | * - \ref asfdoc_sam0_adc_extra_dependencies |
mbed_official | 15:a81a8d6c1dfe | 401 | * - \ref asfdoc_sam0_adc_extra_errata |
mbed_official | 15:a81a8d6c1dfe | 402 | * - \ref asfdoc_sam0_adc_extra_history |
mbed_official | 15:a81a8d6c1dfe | 403 | * |
mbed_official | 15:a81a8d6c1dfe | 404 | * |
mbed_official | 15:a81a8d6c1dfe | 405 | * \section asfdoc_sam0_adc_examples Examples |
mbed_official | 15:a81a8d6c1dfe | 406 | * |
mbed_official | 15:a81a8d6c1dfe | 407 | * For a list of examples related to this driver, see |
mbed_official | 15:a81a8d6c1dfe | 408 | * \ref asfdoc_sam0_adc_exqsg. |
mbed_official | 15:a81a8d6c1dfe | 409 | * |
mbed_official | 15:a81a8d6c1dfe | 410 | * |
mbed_official | 15:a81a8d6c1dfe | 411 | * \section asfdoc_sam0_adc_api_overview API Overview |
mbed_official | 15:a81a8d6c1dfe | 412 | * @{ |
mbed_official | 15:a81a8d6c1dfe | 413 | */ |
mbed_official | 15:a81a8d6c1dfe | 414 | |
mbed_official | 15:a81a8d6c1dfe | 415 | #ifdef __cplusplus |
mbed_official | 15:a81a8d6c1dfe | 416 | extern "C" { |
mbed_official | 15:a81a8d6c1dfe | 417 | #endif |
mbed_official | 15:a81a8d6c1dfe | 418 | |
mbed_official | 15:a81a8d6c1dfe | 419 | #include <compiler.h> |
mbed_official | 15:a81a8d6c1dfe | 420 | #include <system.h> |
mbed_official | 15:a81a8d6c1dfe | 421 | #include <adc_feature.h> |
mbed_official | 15:a81a8d6c1dfe | 422 | |
mbed_official | 15:a81a8d6c1dfe | 423 | /** |
mbed_official | 15:a81a8d6c1dfe | 424 | * \name Module Status Flags |
mbed_official | 15:a81a8d6c1dfe | 425 | * |
mbed_official | 15:a81a8d6c1dfe | 426 | * ADC status flags, returned by \ref adc_get_status() and cleared by |
mbed_official | 15:a81a8d6c1dfe | 427 | * \ref adc_clear_status(). |
mbed_official | 15:a81a8d6c1dfe | 428 | * |
mbed_official | 15:a81a8d6c1dfe | 429 | * @{ |
mbed_official | 15:a81a8d6c1dfe | 430 | */ |
mbed_official | 15:a81a8d6c1dfe | 431 | |
mbed_official | 15:a81a8d6c1dfe | 432 | /** ADC result ready. */ |
mbed_official | 15:a81a8d6c1dfe | 433 | #define ADC_STATUS_RESULT_READY (1UL << 0) |
mbed_official | 15:a81a8d6c1dfe | 434 | /** Window monitor match. */ |
mbed_official | 15:a81a8d6c1dfe | 435 | #define ADC_STATUS_WINDOW (1UL << 1) |
mbed_official | 15:a81a8d6c1dfe | 436 | /** ADC result overwritten before read. */ |
mbed_official | 15:a81a8d6c1dfe | 437 | #define ADC_STATUS_OVERRUN (1UL << 2) |
mbed_official | 15:a81a8d6c1dfe | 438 | |
mbed_official | 15:a81a8d6c1dfe | 439 | /** @} */ |
mbed_official | 15:a81a8d6c1dfe | 440 | |
mbed_official | 15:a81a8d6c1dfe | 441 | #if ADC_CALLBACK_MODE == true |
mbed_official | 15:a81a8d6c1dfe | 442 | # if (ADC_INST_NUM > 1) |
mbed_official | 15:a81a8d6c1dfe | 443 | # define _ADC_INTERRUPT_VECT_NUM(n, unused) \ |
mbed_official | 15:a81a8d6c1dfe | 444 | SYSTEM_INTERRUPT_MODULE_ADC##n, |
mbed_official | 15:a81a8d6c1dfe | 445 | /** |
mbed_official | 15:a81a8d6c1dfe | 446 | * \internal Get the interrupt vector for the given device instance |
mbed_official | 15:a81a8d6c1dfe | 447 | * |
mbed_official | 15:a81a8d6c1dfe | 448 | * \param[in] The ADC module instance number |
mbed_official | 15:a81a8d6c1dfe | 449 | * |
mbed_official | 15:a81a8d6c1dfe | 450 | * \return Interrupt vector for of the given ADC module instance. |
mbed_official | 15:a81a8d6c1dfe | 451 | */ |
mbed_official | 15:a81a8d6c1dfe | 452 | static enum system_interrupt_vector _adc_interrupt_get_interrupt_vector( |
mbed_official | 15:a81a8d6c1dfe | 453 | uint32_t inst_num) |
mbed_official | 15:a81a8d6c1dfe | 454 | { |
mbed_official | 15:a81a8d6c1dfe | 455 | static uint8_t adc_interrupt_vectors[ADC_INST_NUM] = { |
mbed_official | 15:a81a8d6c1dfe | 456 | MREPEAT(ADC_INST_NUM, _ADC_INTERRUPT_VECT_NUM, 0) |
mbed_official | 15:a81a8d6c1dfe | 457 | }; |
mbed_official | 15:a81a8d6c1dfe | 458 | |
mbed_official | 15:a81a8d6c1dfe | 459 | return (enum system_interrupt_vector)adc_interrupt_vectors[inst_num]; |
mbed_official | 15:a81a8d6c1dfe | 460 | } |
mbed_official | 15:a81a8d6c1dfe | 461 | # endif |
mbed_official | 15:a81a8d6c1dfe | 462 | #endif |
mbed_official | 15:a81a8d6c1dfe | 463 | |
mbed_official | 15:a81a8d6c1dfe | 464 | #if !defined(__DOXYGEN__) |
mbed_official | 15:a81a8d6c1dfe | 465 | uint8_t _adc_get_inst_index( |
mbed_official | 15:a81a8d6c1dfe | 466 | Adc *const hw); |
mbed_official | 15:a81a8d6c1dfe | 467 | #endif |
mbed_official | 15:a81a8d6c1dfe | 468 | |
mbed_official | 15:a81a8d6c1dfe | 469 | /** |
mbed_official | 15:a81a8d6c1dfe | 470 | * \name Driver Initialization and Configuration |
mbed_official | 15:a81a8d6c1dfe | 471 | * @{ |
mbed_official | 15:a81a8d6c1dfe | 472 | */ |
mbed_official | 15:a81a8d6c1dfe | 473 | enum status_code adc_init( |
mbed_official | 15:a81a8d6c1dfe | 474 | struct adc_module *const module_inst, |
mbed_official | 15:a81a8d6c1dfe | 475 | Adc *hw, |
mbed_official | 15:a81a8d6c1dfe | 476 | struct adc_config *config); |
mbed_official | 15:a81a8d6c1dfe | 477 | |
mbed_official | 15:a81a8d6c1dfe | 478 | void adc_get_config_defaults( |
mbed_official | 15:a81a8d6c1dfe | 479 | struct adc_config *const config); |
mbed_official | 15:a81a8d6c1dfe | 480 | |
mbed_official | 15:a81a8d6c1dfe | 481 | #if (SAMD) || (SAMR21) |
mbed_official | 15:a81a8d6c1dfe | 482 | void adc_regular_ain_channel( |
mbed_official | 15:a81a8d6c1dfe | 483 | uint32_t *pin_array, uint8_t size); |
mbed_official | 15:a81a8d6c1dfe | 484 | #endif |
mbed_official | 15:a81a8d6c1dfe | 485 | |
mbed_official | 15:a81a8d6c1dfe | 486 | /** @} */ |
mbed_official | 15:a81a8d6c1dfe | 487 | |
mbed_official | 15:a81a8d6c1dfe | 488 | /** |
mbed_official | 15:a81a8d6c1dfe | 489 | * \name Status Management |
mbed_official | 15:a81a8d6c1dfe | 490 | * @{ |
mbed_official | 15:a81a8d6c1dfe | 491 | */ |
mbed_official | 15:a81a8d6c1dfe | 492 | |
mbed_official | 15:a81a8d6c1dfe | 493 | /** |
mbed_official | 15:a81a8d6c1dfe | 494 | * \brief Retrieves the current module status. |
mbed_official | 15:a81a8d6c1dfe | 495 | * |
mbed_official | 15:a81a8d6c1dfe | 496 | * Retrieves the status of the module, giving overall state information. |
mbed_official | 15:a81a8d6c1dfe | 497 | * |
mbed_official | 15:a81a8d6c1dfe | 498 | * \param[in] module_inst Pointer to the ADC software instance struct |
mbed_official | 15:a81a8d6c1dfe | 499 | * |
mbed_official | 15:a81a8d6c1dfe | 500 | * \return Bitmask of \c ADC_STATUS_* flags. |
mbed_official | 15:a81a8d6c1dfe | 501 | * |
mbed_official | 15:a81a8d6c1dfe | 502 | * \retval ADC_STATUS_RESULT_READY ADC result is ready to be read |
mbed_official | 15:a81a8d6c1dfe | 503 | * \retval ADC_STATUS_WINDOW ADC has detected a value inside the set |
mbed_official | 15:a81a8d6c1dfe | 504 | * window range |
mbed_official | 15:a81a8d6c1dfe | 505 | * \retval ADC_STATUS_OVERRUN ADC result has overrun |
mbed_official | 15:a81a8d6c1dfe | 506 | */ |
mbed_official | 15:a81a8d6c1dfe | 507 | static inline uint32_t adc_get_status( |
mbed_official | 15:a81a8d6c1dfe | 508 | struct adc_module *const module_inst) |
mbed_official | 15:a81a8d6c1dfe | 509 | { |
mbed_official | 15:a81a8d6c1dfe | 510 | /* Sanity check arguments */ |
mbed_official | 15:a81a8d6c1dfe | 511 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 512 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 513 | |
mbed_official | 15:a81a8d6c1dfe | 514 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 515 | |
mbed_official | 15:a81a8d6c1dfe | 516 | uint32_t int_flags = adc_module->INTFLAG.reg; |
mbed_official | 15:a81a8d6c1dfe | 517 | |
mbed_official | 15:a81a8d6c1dfe | 518 | uint32_t status_flags = 0; |
mbed_official | 15:a81a8d6c1dfe | 519 | |
mbed_official | 15:a81a8d6c1dfe | 520 | /* Check for ADC Result Ready */ |
mbed_official | 15:a81a8d6c1dfe | 521 | if (int_flags & ADC_INTFLAG_RESRDY) { |
mbed_official | 15:a81a8d6c1dfe | 522 | status_flags |= ADC_STATUS_RESULT_READY; |
mbed_official | 15:a81a8d6c1dfe | 523 | } |
mbed_official | 15:a81a8d6c1dfe | 524 | |
mbed_official | 15:a81a8d6c1dfe | 525 | /* Check for ADC Window Match */ |
mbed_official | 15:a81a8d6c1dfe | 526 | if (int_flags & ADC_INTFLAG_WINMON) { |
mbed_official | 15:a81a8d6c1dfe | 527 | status_flags |= ADC_STATUS_WINDOW; |
mbed_official | 15:a81a8d6c1dfe | 528 | } |
mbed_official | 15:a81a8d6c1dfe | 529 | |
mbed_official | 15:a81a8d6c1dfe | 530 | /* Check for ADC Overrun */ |
mbed_official | 15:a81a8d6c1dfe | 531 | if (int_flags & ADC_INTFLAG_OVERRUN) { |
mbed_official | 15:a81a8d6c1dfe | 532 | status_flags |= ADC_STATUS_OVERRUN; |
mbed_official | 15:a81a8d6c1dfe | 533 | } |
mbed_official | 15:a81a8d6c1dfe | 534 | |
mbed_official | 15:a81a8d6c1dfe | 535 | return status_flags; |
mbed_official | 15:a81a8d6c1dfe | 536 | } |
mbed_official | 15:a81a8d6c1dfe | 537 | |
mbed_official | 15:a81a8d6c1dfe | 538 | /** |
mbed_official | 15:a81a8d6c1dfe | 539 | * \brief Clears a module status flag. |
mbed_official | 15:a81a8d6c1dfe | 540 | * |
mbed_official | 15:a81a8d6c1dfe | 541 | * Clears the given status flag of the module. |
mbed_official | 15:a81a8d6c1dfe | 542 | * |
mbed_official | 15:a81a8d6c1dfe | 543 | * \param[in] module_inst Pointer to the ADC software instance struct |
mbed_official | 15:a81a8d6c1dfe | 544 | * \param[in] status_flags Bitmask of \c ADC_STATUS_* flags to clear |
mbed_official | 15:a81a8d6c1dfe | 545 | */ |
mbed_official | 15:a81a8d6c1dfe | 546 | static inline void adc_clear_status( |
mbed_official | 15:a81a8d6c1dfe | 547 | struct adc_module *const module_inst, |
mbed_official | 15:a81a8d6c1dfe | 548 | const uint32_t status_flags) |
mbed_official | 15:a81a8d6c1dfe | 549 | { |
mbed_official | 15:a81a8d6c1dfe | 550 | /* Sanity check arguments */ |
mbed_official | 15:a81a8d6c1dfe | 551 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 552 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 553 | |
mbed_official | 15:a81a8d6c1dfe | 554 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 555 | |
mbed_official | 15:a81a8d6c1dfe | 556 | uint32_t int_flags = 0; |
mbed_official | 15:a81a8d6c1dfe | 557 | |
mbed_official | 15:a81a8d6c1dfe | 558 | /* Check for ADC Result Ready */ |
mbed_official | 15:a81a8d6c1dfe | 559 | if (status_flags & ADC_STATUS_RESULT_READY) { |
mbed_official | 15:a81a8d6c1dfe | 560 | int_flags |= ADC_INTFLAG_RESRDY; |
mbed_official | 15:a81a8d6c1dfe | 561 | } |
mbed_official | 15:a81a8d6c1dfe | 562 | |
mbed_official | 15:a81a8d6c1dfe | 563 | /* Check for ADC Window Match */ |
mbed_official | 15:a81a8d6c1dfe | 564 | if (status_flags & ADC_STATUS_WINDOW) { |
mbed_official | 15:a81a8d6c1dfe | 565 | int_flags |= ADC_INTFLAG_WINMON; |
mbed_official | 15:a81a8d6c1dfe | 566 | } |
mbed_official | 15:a81a8d6c1dfe | 567 | |
mbed_official | 15:a81a8d6c1dfe | 568 | /* Check for ADC Overrun */ |
mbed_official | 15:a81a8d6c1dfe | 569 | if (status_flags & ADC_STATUS_OVERRUN) { |
mbed_official | 15:a81a8d6c1dfe | 570 | int_flags |= ADC_INTFLAG_OVERRUN; |
mbed_official | 15:a81a8d6c1dfe | 571 | } |
mbed_official | 15:a81a8d6c1dfe | 572 | |
mbed_official | 15:a81a8d6c1dfe | 573 | /* Clear interrupt flag */ |
mbed_official | 15:a81a8d6c1dfe | 574 | adc_module->INTFLAG.reg = int_flags; |
mbed_official | 15:a81a8d6c1dfe | 575 | } |
mbed_official | 15:a81a8d6c1dfe | 576 | /** @} */ |
mbed_official | 15:a81a8d6c1dfe | 577 | |
mbed_official | 15:a81a8d6c1dfe | 578 | /** |
mbed_official | 15:a81a8d6c1dfe | 579 | * \name Enable, Disable, and Reset ADC Module, Start Conversion and Read Result |
mbed_official | 15:a81a8d6c1dfe | 580 | * @{ |
mbed_official | 15:a81a8d6c1dfe | 581 | */ |
mbed_official | 15:a81a8d6c1dfe | 582 | |
mbed_official | 15:a81a8d6c1dfe | 583 | /** |
mbed_official | 15:a81a8d6c1dfe | 584 | * \brief Enables the ADC module. |
mbed_official | 15:a81a8d6c1dfe | 585 | * |
mbed_official | 15:a81a8d6c1dfe | 586 | * Enables an ADC module that has previously been configured. If any internal reference |
mbed_official | 15:a81a8d6c1dfe | 587 | * is selected it will be enabled. |
mbed_official | 15:a81a8d6c1dfe | 588 | * |
mbed_official | 15:a81a8d6c1dfe | 589 | * \param[in] module_inst Pointer to the ADC software instance struct |
mbed_official | 15:a81a8d6c1dfe | 590 | */ |
mbed_official | 15:a81a8d6c1dfe | 591 | static inline enum status_code adc_enable( |
mbed_official | 15:a81a8d6c1dfe | 592 | struct adc_module *const module_inst) |
mbed_official | 15:a81a8d6c1dfe | 593 | { |
mbed_official | 15:a81a8d6c1dfe | 594 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 595 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 596 | |
mbed_official | 15:a81a8d6c1dfe | 597 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 598 | |
mbed_official | 15:a81a8d6c1dfe | 599 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 600 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 601 | } |
mbed_official | 15:a81a8d6c1dfe | 602 | |
mbed_official | 15:a81a8d6c1dfe | 603 | #if ADC_CALLBACK_MODE == true |
mbed_official | 15:a81a8d6c1dfe | 604 | # if (ADC_INST_NUM > 1) |
mbed_official | 15:a81a8d6c1dfe | 605 | system_interrupt_enable(_adc_interrupt_get_interrupt_vector( |
mbed_official | 15:a81a8d6c1dfe | 606 | _adc_get_inst_index(adc_module))); |
mbed_official | 15:a81a8d6c1dfe | 607 | # elif (SAMC20) |
mbed_official | 15:a81a8d6c1dfe | 608 | system_interrupt_enable(SYSTEM_INTERRUPT_MODULE_ADC0); |
mbed_official | 15:a81a8d6c1dfe | 609 | # else |
mbed_official | 15:a81a8d6c1dfe | 610 | system_interrupt_enable(SYSTEM_INTERRUPT_MODULE_ADC); |
mbed_official | 15:a81a8d6c1dfe | 611 | # endif |
mbed_official | 15:a81a8d6c1dfe | 612 | #endif |
mbed_official | 15:a81a8d6c1dfe | 613 | |
mbed_official | 15:a81a8d6c1dfe | 614 | adc_module->CTRLA.reg |= ADC_CTRLA_ENABLE; |
mbed_official | 15:a81a8d6c1dfe | 615 | |
mbed_official | 15:a81a8d6c1dfe | 616 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 617 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 618 | } |
mbed_official | 15:a81a8d6c1dfe | 619 | return STATUS_OK; |
mbed_official | 15:a81a8d6c1dfe | 620 | } |
mbed_official | 15:a81a8d6c1dfe | 621 | |
mbed_official | 15:a81a8d6c1dfe | 622 | /** |
mbed_official | 15:a81a8d6c1dfe | 623 | * \brief Disables the ADC module. |
mbed_official | 15:a81a8d6c1dfe | 624 | * |
mbed_official | 15:a81a8d6c1dfe | 625 | * Disables an ADC module that was previously enabled. |
mbed_official | 15:a81a8d6c1dfe | 626 | * |
mbed_official | 15:a81a8d6c1dfe | 627 | * \param[in] module_inst Pointer to the ADC software instance struct |
mbed_official | 15:a81a8d6c1dfe | 628 | */ |
mbed_official | 15:a81a8d6c1dfe | 629 | static inline enum status_code adc_disable( |
mbed_official | 15:a81a8d6c1dfe | 630 | struct adc_module *const module_inst) |
mbed_official | 15:a81a8d6c1dfe | 631 | { |
mbed_official | 15:a81a8d6c1dfe | 632 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 633 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 634 | |
mbed_official | 15:a81a8d6c1dfe | 635 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 636 | |
mbed_official | 15:a81a8d6c1dfe | 637 | #if ADC_CALLBACK_MODE == true |
mbed_official | 15:a81a8d6c1dfe | 638 | # if (ADC_INST_NUM > 1) |
mbed_official | 15:a81a8d6c1dfe | 639 | system_interrupt_disable(_adc_interrupt_get_interrupt_vector( |
mbed_official | 15:a81a8d6c1dfe | 640 | _adc_get_inst_index(adc_module))); |
mbed_official | 15:a81a8d6c1dfe | 641 | # elif (SAMC20) |
mbed_official | 15:a81a8d6c1dfe | 642 | system_interrupt_disable(SYSTEM_INTERRUPT_MODULE_ADC0); |
mbed_official | 15:a81a8d6c1dfe | 643 | # else |
mbed_official | 15:a81a8d6c1dfe | 644 | system_interrupt_disable(SYSTEM_INTERRUPT_MODULE_ADC); |
mbed_official | 15:a81a8d6c1dfe | 645 | # endif |
mbed_official | 15:a81a8d6c1dfe | 646 | #endif |
mbed_official | 15:a81a8d6c1dfe | 647 | |
mbed_official | 15:a81a8d6c1dfe | 648 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 649 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 650 | } |
mbed_official | 15:a81a8d6c1dfe | 651 | |
mbed_official | 15:a81a8d6c1dfe | 652 | adc_module->CTRLA.reg &= ~ADC_CTRLA_ENABLE; |
mbed_official | 15:a81a8d6c1dfe | 653 | |
mbed_official | 15:a81a8d6c1dfe | 654 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 655 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 656 | } |
mbed_official | 15:a81a8d6c1dfe | 657 | return STATUS_OK; |
mbed_official | 15:a81a8d6c1dfe | 658 | } |
mbed_official | 15:a81a8d6c1dfe | 659 | |
mbed_official | 15:a81a8d6c1dfe | 660 | /** |
mbed_official | 15:a81a8d6c1dfe | 661 | * \brief Resets the ADC module. |
mbed_official | 15:a81a8d6c1dfe | 662 | * |
mbed_official | 15:a81a8d6c1dfe | 663 | * Resets an ADC module, clearing all module state and registers to their |
mbed_official | 15:a81a8d6c1dfe | 664 | * default values. |
mbed_official | 15:a81a8d6c1dfe | 665 | * |
mbed_official | 15:a81a8d6c1dfe | 666 | * \param[in] module_inst Pointer to the ADC software instance struct |
mbed_official | 15:a81a8d6c1dfe | 667 | */ |
mbed_official | 15:a81a8d6c1dfe | 668 | static inline enum status_code adc_reset( |
mbed_official | 15:a81a8d6c1dfe | 669 | struct adc_module *const module_inst) |
mbed_official | 15:a81a8d6c1dfe | 670 | { |
mbed_official | 15:a81a8d6c1dfe | 671 | /* Sanity check arguments */ |
mbed_official | 15:a81a8d6c1dfe | 672 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 673 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 674 | |
mbed_official | 15:a81a8d6c1dfe | 675 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 676 | |
mbed_official | 15:a81a8d6c1dfe | 677 | /* Disable to make sure the pipeline is flushed before reset */ |
mbed_official | 15:a81a8d6c1dfe | 678 | adc_disable(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 679 | |
mbed_official | 15:a81a8d6c1dfe | 680 | /* Software reset the module */ |
mbed_official | 15:a81a8d6c1dfe | 681 | adc_module->CTRLA.reg |= ADC_CTRLA_SWRST; |
mbed_official | 15:a81a8d6c1dfe | 682 | |
mbed_official | 15:a81a8d6c1dfe | 683 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 684 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 685 | } |
mbed_official | 15:a81a8d6c1dfe | 686 | return STATUS_OK; |
mbed_official | 15:a81a8d6c1dfe | 687 | } |
mbed_official | 15:a81a8d6c1dfe | 688 | |
mbed_official | 15:a81a8d6c1dfe | 689 | |
mbed_official | 15:a81a8d6c1dfe | 690 | /** |
mbed_official | 15:a81a8d6c1dfe | 691 | * \brief Enables an ADC event input or output. |
mbed_official | 15:a81a8d6c1dfe | 692 | * |
mbed_official | 15:a81a8d6c1dfe | 693 | * Enables one or more input or output events to or from the ADC module. See |
mbed_official | 15:a81a8d6c1dfe | 694 | * \ref adc_events "Struct adc_events" for a list of events this module supports. |
mbed_official | 15:a81a8d6c1dfe | 695 | * |
mbed_official | 15:a81a8d6c1dfe | 696 | * \note Events cannot be altered while the module is enabled. |
mbed_official | 15:a81a8d6c1dfe | 697 | * |
mbed_official | 15:a81a8d6c1dfe | 698 | * \param[in] module_inst Software instance for the ADC peripheral |
mbed_official | 15:a81a8d6c1dfe | 699 | * \param[in] events Struct containing flags of events to enable |
mbed_official | 15:a81a8d6c1dfe | 700 | */ |
mbed_official | 15:a81a8d6c1dfe | 701 | static inline void adc_enable_events( |
mbed_official | 15:a81a8d6c1dfe | 702 | struct adc_module *const module_inst, |
mbed_official | 15:a81a8d6c1dfe | 703 | struct adc_events *const events) |
mbed_official | 15:a81a8d6c1dfe | 704 | { |
mbed_official | 15:a81a8d6c1dfe | 705 | /* Sanity check arguments */ |
mbed_official | 15:a81a8d6c1dfe | 706 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 707 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 708 | Assert(events); |
mbed_official | 15:a81a8d6c1dfe | 709 | |
mbed_official | 15:a81a8d6c1dfe | 710 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 711 | |
mbed_official | 15:a81a8d6c1dfe | 712 | uint32_t event_mask = 0; |
mbed_official | 15:a81a8d6c1dfe | 713 | |
mbed_official | 15:a81a8d6c1dfe | 714 | /* Configure Window Monitor event */ |
mbed_official | 15:a81a8d6c1dfe | 715 | if (events->generate_event_on_window_monitor) { |
mbed_official | 15:a81a8d6c1dfe | 716 | event_mask |= ADC_EVCTRL_WINMONEO; |
mbed_official | 15:a81a8d6c1dfe | 717 | } |
mbed_official | 15:a81a8d6c1dfe | 718 | |
mbed_official | 15:a81a8d6c1dfe | 719 | /* Configure Result Ready event */ |
mbed_official | 15:a81a8d6c1dfe | 720 | if (events->generate_event_on_conversion_done) { |
mbed_official | 15:a81a8d6c1dfe | 721 | event_mask |= ADC_EVCTRL_RESRDYEO; |
mbed_official | 15:a81a8d6c1dfe | 722 | } |
mbed_official | 15:a81a8d6c1dfe | 723 | |
mbed_official | 15:a81a8d6c1dfe | 724 | adc_module->EVCTRL.reg |= event_mask; |
mbed_official | 15:a81a8d6c1dfe | 725 | } |
mbed_official | 15:a81a8d6c1dfe | 726 | |
mbed_official | 15:a81a8d6c1dfe | 727 | /** |
mbed_official | 15:a81a8d6c1dfe | 728 | * \brief Disables an ADC event input or output. |
mbed_official | 15:a81a8d6c1dfe | 729 | * |
mbed_official | 15:a81a8d6c1dfe | 730 | * Disables one or more input or output events to or from the ADC module. See |
mbed_official | 15:a81a8d6c1dfe | 731 | * \ref adc_events "Struct adc_events" for a list of events this module supports. |
mbed_official | 15:a81a8d6c1dfe | 732 | * |
mbed_official | 15:a81a8d6c1dfe | 733 | * \note Events cannot be altered while the module is enabled. |
mbed_official | 15:a81a8d6c1dfe | 734 | * |
mbed_official | 15:a81a8d6c1dfe | 735 | * \param[in] module_inst Software instance for the ADC peripheral |
mbed_official | 15:a81a8d6c1dfe | 736 | * \param[in] events Struct containing flags of events to disable |
mbed_official | 15:a81a8d6c1dfe | 737 | */ |
mbed_official | 15:a81a8d6c1dfe | 738 | static inline void adc_disable_events( |
mbed_official | 15:a81a8d6c1dfe | 739 | struct adc_module *const module_inst, |
mbed_official | 15:a81a8d6c1dfe | 740 | struct adc_events *const events) |
mbed_official | 15:a81a8d6c1dfe | 741 | { |
mbed_official | 15:a81a8d6c1dfe | 742 | /* Sanity check arguments */ |
mbed_official | 15:a81a8d6c1dfe | 743 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 744 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 745 | Assert(events); |
mbed_official | 15:a81a8d6c1dfe | 746 | |
mbed_official | 15:a81a8d6c1dfe | 747 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 748 | |
mbed_official | 15:a81a8d6c1dfe | 749 | uint32_t event_mask = 0; |
mbed_official | 15:a81a8d6c1dfe | 750 | |
mbed_official | 15:a81a8d6c1dfe | 751 | /* Configure Window Monitor event */ |
mbed_official | 15:a81a8d6c1dfe | 752 | if (events->generate_event_on_window_monitor) { |
mbed_official | 15:a81a8d6c1dfe | 753 | event_mask |= ADC_EVCTRL_WINMONEO; |
mbed_official | 15:a81a8d6c1dfe | 754 | } |
mbed_official | 15:a81a8d6c1dfe | 755 | |
mbed_official | 15:a81a8d6c1dfe | 756 | /* Configure Result Ready event */ |
mbed_official | 15:a81a8d6c1dfe | 757 | if (events->generate_event_on_conversion_done) { |
mbed_official | 15:a81a8d6c1dfe | 758 | event_mask |= ADC_EVCTRL_RESRDYEO; |
mbed_official | 15:a81a8d6c1dfe | 759 | } |
mbed_official | 15:a81a8d6c1dfe | 760 | |
mbed_official | 15:a81a8d6c1dfe | 761 | adc_module->EVCTRL.reg &= ~event_mask; |
mbed_official | 15:a81a8d6c1dfe | 762 | } |
mbed_official | 15:a81a8d6c1dfe | 763 | |
mbed_official | 15:a81a8d6c1dfe | 764 | /** |
mbed_official | 15:a81a8d6c1dfe | 765 | * \brief Starts an ADC conversion. |
mbed_official | 15:a81a8d6c1dfe | 766 | * |
mbed_official | 15:a81a8d6c1dfe | 767 | * Starts a new ADC conversion. |
mbed_official | 15:a81a8d6c1dfe | 768 | * |
mbed_official | 15:a81a8d6c1dfe | 769 | * \param[in] module_inst Pointer to the ADC software instance struct |
mbed_official | 15:a81a8d6c1dfe | 770 | */ |
mbed_official | 15:a81a8d6c1dfe | 771 | static inline void adc_start_conversion( |
mbed_official | 15:a81a8d6c1dfe | 772 | struct adc_module *const module_inst) |
mbed_official | 15:a81a8d6c1dfe | 773 | { |
mbed_official | 15:a81a8d6c1dfe | 774 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 775 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 776 | |
mbed_official | 15:a81a8d6c1dfe | 777 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 778 | |
mbed_official | 15:a81a8d6c1dfe | 779 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 780 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 781 | } |
mbed_official | 15:a81a8d6c1dfe | 782 | |
mbed_official | 15:a81a8d6c1dfe | 783 | adc_module->SWTRIG.reg |= ADC_SWTRIG_START; |
mbed_official | 15:a81a8d6c1dfe | 784 | |
mbed_official | 15:a81a8d6c1dfe | 785 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 786 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 787 | } |
mbed_official | 15:a81a8d6c1dfe | 788 | } |
mbed_official | 15:a81a8d6c1dfe | 789 | |
mbed_official | 15:a81a8d6c1dfe | 790 | /** |
mbed_official | 15:a81a8d6c1dfe | 791 | * \brief Reads the ADC result. |
mbed_official | 15:a81a8d6c1dfe | 792 | * |
mbed_official | 15:a81a8d6c1dfe | 793 | * Reads the result from an ADC conversion that was previously started. |
mbed_official | 15:a81a8d6c1dfe | 794 | * |
mbed_official | 15:a81a8d6c1dfe | 795 | * \param[in] module_inst Pointer to the ADC software instance struct |
mbed_official | 15:a81a8d6c1dfe | 796 | * \param[out] result Pointer to store the result value in |
mbed_official | 15:a81a8d6c1dfe | 797 | * |
mbed_official | 15:a81a8d6c1dfe | 798 | * \return Status of the ADC read request. |
mbed_official | 15:a81a8d6c1dfe | 799 | * \retval STATUS_OK The result was retrieved successfully |
mbed_official | 15:a81a8d6c1dfe | 800 | * \retval STATUS_BUSY A conversion result was not ready |
mbed_official | 15:a81a8d6c1dfe | 801 | * \retval STATUS_ERR_OVERFLOW The result register has been overwritten by the |
mbed_official | 15:a81a8d6c1dfe | 802 | * ADC module before the result was read by the software |
mbed_official | 15:a81a8d6c1dfe | 803 | */ |
mbed_official | 15:a81a8d6c1dfe | 804 | static inline enum status_code adc_read( |
mbed_official | 15:a81a8d6c1dfe | 805 | struct adc_module *const module_inst, |
mbed_official | 15:a81a8d6c1dfe | 806 | uint16_t *result) |
mbed_official | 15:a81a8d6c1dfe | 807 | { |
mbed_official | 15:a81a8d6c1dfe | 808 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 809 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 810 | Assert(result); |
mbed_official | 15:a81a8d6c1dfe | 811 | |
mbed_official | 15:a81a8d6c1dfe | 812 | if (!(adc_get_status(module_inst) & ADC_STATUS_RESULT_READY)) { |
mbed_official | 15:a81a8d6c1dfe | 813 | /* Result not ready */ |
mbed_official | 15:a81a8d6c1dfe | 814 | return STATUS_BUSY; |
mbed_official | 15:a81a8d6c1dfe | 815 | } |
mbed_official | 15:a81a8d6c1dfe | 816 | |
mbed_official | 15:a81a8d6c1dfe | 817 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 818 | |
mbed_official | 15:a81a8d6c1dfe | 819 | #if (SAMD) || (SAMR21) |
mbed_official | 15:a81a8d6c1dfe | 820 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 821 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 822 | } |
mbed_official | 15:a81a8d6c1dfe | 823 | #endif |
mbed_official | 15:a81a8d6c1dfe | 824 | |
mbed_official | 15:a81a8d6c1dfe | 825 | /* Get ADC result */ |
mbed_official | 15:a81a8d6c1dfe | 826 | *result = adc_module->RESULT.reg; |
mbed_official | 15:a81a8d6c1dfe | 827 | |
mbed_official | 15:a81a8d6c1dfe | 828 | /* Reset ready flag */ |
mbed_official | 15:a81a8d6c1dfe | 829 | adc_clear_status(module_inst, ADC_STATUS_RESULT_READY); |
mbed_official | 15:a81a8d6c1dfe | 830 | |
mbed_official | 15:a81a8d6c1dfe | 831 | if (adc_get_status(module_inst) & ADC_STATUS_OVERRUN) { |
mbed_official | 15:a81a8d6c1dfe | 832 | adc_clear_status(module_inst, ADC_STATUS_OVERRUN); |
mbed_official | 15:a81a8d6c1dfe | 833 | return STATUS_ERR_OVERFLOW; |
mbed_official | 15:a81a8d6c1dfe | 834 | } |
mbed_official | 15:a81a8d6c1dfe | 835 | |
mbed_official | 15:a81a8d6c1dfe | 836 | return STATUS_OK; |
mbed_official | 15:a81a8d6c1dfe | 837 | } |
mbed_official | 15:a81a8d6c1dfe | 838 | |
mbed_official | 15:a81a8d6c1dfe | 839 | /** @} */ |
mbed_official | 15:a81a8d6c1dfe | 840 | |
mbed_official | 15:a81a8d6c1dfe | 841 | /** |
mbed_official | 15:a81a8d6c1dfe | 842 | * \name Runtime Changes of ADC Module |
mbed_official | 15:a81a8d6c1dfe | 843 | * @{ |
mbed_official | 15:a81a8d6c1dfe | 844 | */ |
mbed_official | 15:a81a8d6c1dfe | 845 | |
mbed_official | 15:a81a8d6c1dfe | 846 | /** |
mbed_official | 15:a81a8d6c1dfe | 847 | * \brief Flushes the ADC pipeline. |
mbed_official | 15:a81a8d6c1dfe | 848 | * |
mbed_official | 15:a81a8d6c1dfe | 849 | * Flushes the pipeline and restarts the ADC clock on the next peripheral clock |
mbed_official | 15:a81a8d6c1dfe | 850 | * edge. All conversions in progress will be lost. When flush is complete, the |
mbed_official | 15:a81a8d6c1dfe | 851 | * module will resume where it left off. |
mbed_official | 15:a81a8d6c1dfe | 852 | * |
mbed_official | 15:a81a8d6c1dfe | 853 | * \param[in] module_inst Pointer to the ADC software instance struct |
mbed_official | 15:a81a8d6c1dfe | 854 | */ |
mbed_official | 15:a81a8d6c1dfe | 855 | static inline void adc_flush( |
mbed_official | 15:a81a8d6c1dfe | 856 | struct adc_module *const module_inst) |
mbed_official | 15:a81a8d6c1dfe | 857 | { |
mbed_official | 15:a81a8d6c1dfe | 858 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 859 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 860 | |
mbed_official | 15:a81a8d6c1dfe | 861 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 862 | |
mbed_official | 15:a81a8d6c1dfe | 863 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 864 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 865 | } |
mbed_official | 15:a81a8d6c1dfe | 866 | |
mbed_official | 15:a81a8d6c1dfe | 867 | adc_module->SWTRIG.reg |= ADC_SWTRIG_FLUSH; |
mbed_official | 15:a81a8d6c1dfe | 868 | |
mbed_official | 15:a81a8d6c1dfe | 869 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 870 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 871 | } |
mbed_official | 15:a81a8d6c1dfe | 872 | } |
mbed_official | 15:a81a8d6c1dfe | 873 | void adc_set_window_mode( |
mbed_official | 15:a81a8d6c1dfe | 874 | struct adc_module *const module_inst, |
mbed_official | 15:a81a8d6c1dfe | 875 | const enum adc_window_mode window_mode, |
mbed_official | 15:a81a8d6c1dfe | 876 | const int16_t window_lower_value, |
mbed_official | 15:a81a8d6c1dfe | 877 | const int16_t window_upper_value); |
mbed_official | 15:a81a8d6c1dfe | 878 | |
mbed_official | 15:a81a8d6c1dfe | 879 | /** |
mbed_official | 15:a81a8d6c1dfe | 880 | * \brief Sets positive ADC input pin. |
mbed_official | 15:a81a8d6c1dfe | 881 | * |
mbed_official | 15:a81a8d6c1dfe | 882 | * Sets the positive ADC input pin selection. |
mbed_official | 15:a81a8d6c1dfe | 883 | * |
mbed_official | 15:a81a8d6c1dfe | 884 | * \param[in] module_inst Pointer to the ADC software instance struct |
mbed_official | 15:a81a8d6c1dfe | 885 | * \param[in] positive_input Positive input pin |
mbed_official | 15:a81a8d6c1dfe | 886 | */ |
mbed_official | 15:a81a8d6c1dfe | 887 | static inline void adc_set_positive_input( |
mbed_official | 15:a81a8d6c1dfe | 888 | struct adc_module *const module_inst, |
mbed_official | 15:a81a8d6c1dfe | 889 | const enum adc_positive_input positive_input) |
mbed_official | 15:a81a8d6c1dfe | 890 | { |
mbed_official | 15:a81a8d6c1dfe | 891 | /* Sanity check arguments */ |
mbed_official | 15:a81a8d6c1dfe | 892 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 893 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 894 | |
mbed_official | 15:a81a8d6c1dfe | 895 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 896 | |
mbed_official | 15:a81a8d6c1dfe | 897 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 898 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 899 | } |
mbed_official | 15:a81a8d6c1dfe | 900 | |
mbed_official | 15:a81a8d6c1dfe | 901 | /* Set positive input pin */ |
mbed_official | 15:a81a8d6c1dfe | 902 | adc_module->INPUTCTRL.reg = |
mbed_official | 15:a81a8d6c1dfe | 903 | (adc_module->INPUTCTRL.reg & ~ADC_INPUTCTRL_MUXPOS_Msk) | |
mbed_official | 15:a81a8d6c1dfe | 904 | (positive_input); |
mbed_official | 15:a81a8d6c1dfe | 905 | |
mbed_official | 15:a81a8d6c1dfe | 906 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 907 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 908 | } |
mbed_official | 15:a81a8d6c1dfe | 909 | } |
mbed_official | 15:a81a8d6c1dfe | 910 | |
mbed_official | 15:a81a8d6c1dfe | 911 | |
mbed_official | 15:a81a8d6c1dfe | 912 | /** |
mbed_official | 15:a81a8d6c1dfe | 913 | * \brief Sets negative ADC input pin for differential mode. |
mbed_official | 15:a81a8d6c1dfe | 914 | * |
mbed_official | 15:a81a8d6c1dfe | 915 | * Sets the negative ADC input pin, when the ADC is configured in differential |
mbed_official | 15:a81a8d6c1dfe | 916 | * mode. |
mbed_official | 15:a81a8d6c1dfe | 917 | * |
mbed_official | 15:a81a8d6c1dfe | 918 | * \param[in] module_inst Pointer to the ADC software instance struct |
mbed_official | 15:a81a8d6c1dfe | 919 | * \param[in] negative_input Negative input pin |
mbed_official | 15:a81a8d6c1dfe | 920 | */ |
mbed_official | 15:a81a8d6c1dfe | 921 | static inline void adc_set_negative_input( |
mbed_official | 15:a81a8d6c1dfe | 922 | struct adc_module *const module_inst, |
mbed_official | 15:a81a8d6c1dfe | 923 | const enum adc_negative_input negative_input) |
mbed_official | 15:a81a8d6c1dfe | 924 | { |
mbed_official | 15:a81a8d6c1dfe | 925 | /* Sanity check arguments */ |
mbed_official | 15:a81a8d6c1dfe | 926 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 927 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 928 | |
mbed_official | 15:a81a8d6c1dfe | 929 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 930 | |
mbed_official | 15:a81a8d6c1dfe | 931 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 932 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 933 | } |
mbed_official | 15:a81a8d6c1dfe | 934 | |
mbed_official | 15:a81a8d6c1dfe | 935 | /* Set negative input pin */ |
mbed_official | 15:a81a8d6c1dfe | 936 | adc_module->INPUTCTRL.reg = |
mbed_official | 15:a81a8d6c1dfe | 937 | (adc_module->INPUTCTRL.reg & ~ADC_INPUTCTRL_MUXNEG_Msk) | |
mbed_official | 15:a81a8d6c1dfe | 938 | (negative_input); |
mbed_official | 15:a81a8d6c1dfe | 939 | |
mbed_official | 15:a81a8d6c1dfe | 940 | while (adc_is_syncing(module_inst)) { |
mbed_official | 15:a81a8d6c1dfe | 941 | /* Wait for synchronization */ |
mbed_official | 15:a81a8d6c1dfe | 942 | } |
mbed_official | 15:a81a8d6c1dfe | 943 | } |
mbed_official | 15:a81a8d6c1dfe | 944 | |
mbed_official | 15:a81a8d6c1dfe | 945 | /** @} */ |
mbed_official | 15:a81a8d6c1dfe | 946 | |
mbed_official | 15:a81a8d6c1dfe | 947 | #if ADC_CALLBACK_MODE == true |
mbed_official | 15:a81a8d6c1dfe | 948 | /** |
mbed_official | 15:a81a8d6c1dfe | 949 | * \name Enable and Disable Interrupts |
mbed_official | 15:a81a8d6c1dfe | 950 | * @{ |
mbed_official | 15:a81a8d6c1dfe | 951 | */ |
mbed_official | 15:a81a8d6c1dfe | 952 | |
mbed_official | 15:a81a8d6c1dfe | 953 | /** |
mbed_official | 15:a81a8d6c1dfe | 954 | * \brief Enable interrupt. |
mbed_official | 15:a81a8d6c1dfe | 955 | * |
mbed_official | 15:a81a8d6c1dfe | 956 | * Enable the given interrupt request from the ADC module. |
mbed_official | 15:a81a8d6c1dfe | 957 | * |
mbed_official | 15:a81a8d6c1dfe | 958 | * \param[in] module_inst Pointer to the ADC software instance struct |
mbed_official | 15:a81a8d6c1dfe | 959 | * \param[in] interrupt Interrupt to enable |
mbed_official | 15:a81a8d6c1dfe | 960 | */ |
mbed_official | 15:a81a8d6c1dfe | 961 | static inline void adc_enable_interrupt(struct adc_module *const module_inst, |
mbed_official | 15:a81a8d6c1dfe | 962 | enum adc_interrupt_flag interrupt) |
mbed_official | 15:a81a8d6c1dfe | 963 | { |
mbed_official | 15:a81a8d6c1dfe | 964 | /* Sanity check arguments */ |
mbed_official | 15:a81a8d6c1dfe | 965 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 966 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 967 | |
mbed_official | 15:a81a8d6c1dfe | 968 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 969 | /* Enable interrupt */ |
mbed_official | 15:a81a8d6c1dfe | 970 | adc_module->INTENSET.reg = interrupt; |
mbed_official | 15:a81a8d6c1dfe | 971 | } |
mbed_official | 15:a81a8d6c1dfe | 972 | |
mbed_official | 15:a81a8d6c1dfe | 973 | /** |
mbed_official | 15:a81a8d6c1dfe | 974 | * \brief Disable interrupt. |
mbed_official | 15:a81a8d6c1dfe | 975 | * |
mbed_official | 15:a81a8d6c1dfe | 976 | * Disable the given interrupt request from the ADC module. |
mbed_official | 15:a81a8d6c1dfe | 977 | * |
mbed_official | 15:a81a8d6c1dfe | 978 | * \param[in] module_inst Pointer to the ADC software instance struct |
mbed_official | 15:a81a8d6c1dfe | 979 | * \param[in] interrupt Interrupt to disable |
mbed_official | 15:a81a8d6c1dfe | 980 | */ |
mbed_official | 15:a81a8d6c1dfe | 981 | static inline void adc_disable_interrupt(struct adc_module *const module_inst, |
mbed_official | 15:a81a8d6c1dfe | 982 | enum adc_interrupt_flag interrupt) |
mbed_official | 15:a81a8d6c1dfe | 983 | { |
mbed_official | 15:a81a8d6c1dfe | 984 | /* Sanity check arguments */ |
mbed_official | 15:a81a8d6c1dfe | 985 | Assert(module_inst); |
mbed_official | 15:a81a8d6c1dfe | 986 | Assert(module_inst->hw); |
mbed_official | 15:a81a8d6c1dfe | 987 | |
mbed_official | 15:a81a8d6c1dfe | 988 | Adc *const adc_module = module_inst->hw; |
mbed_official | 15:a81a8d6c1dfe | 989 | /* Enable interrupt */ |
mbed_official | 15:a81a8d6c1dfe | 990 | adc_module->INTENCLR.reg = interrupt; |
mbed_official | 15:a81a8d6c1dfe | 991 | } |
mbed_official | 15:a81a8d6c1dfe | 992 | |
mbed_official | 15:a81a8d6c1dfe | 993 | /** @} */ |
mbed_official | 15:a81a8d6c1dfe | 994 | #endif /* ADC_CALLBACK_MODE == true */ |
mbed_official | 15:a81a8d6c1dfe | 995 | |
mbed_official | 15:a81a8d6c1dfe | 996 | #ifdef __cplusplus |
mbed_official | 15:a81a8d6c1dfe | 997 | } |
mbed_official | 15:a81a8d6c1dfe | 998 | #endif |
mbed_official | 15:a81a8d6c1dfe | 999 | |
mbed_official | 15:a81a8d6c1dfe | 1000 | /** @} */ |
mbed_official | 15:a81a8d6c1dfe | 1001 | |
mbed_official | 15:a81a8d6c1dfe | 1002 | |
mbed_official | 15:a81a8d6c1dfe | 1003 | /** |
mbed_official | 15:a81a8d6c1dfe | 1004 | * \page asfdoc_sam0_adc_extra Extra Information for ADC Driver |
mbed_official | 15:a81a8d6c1dfe | 1005 | * |
mbed_official | 15:a81a8d6c1dfe | 1006 | * \section asfdoc_sam0_adc_extra_acronyms Acronyms |
mbed_official | 15:a81a8d6c1dfe | 1007 | * Below is a table listing the acronyms used in this module, along with their |
mbed_official | 15:a81a8d6c1dfe | 1008 | * intended meanings. |
mbed_official | 15:a81a8d6c1dfe | 1009 | * |
mbed_official | 15:a81a8d6c1dfe | 1010 | * <table> |
mbed_official | 15:a81a8d6c1dfe | 1011 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1012 | * <th>Acronym</th> |
mbed_official | 15:a81a8d6c1dfe | 1013 | * <th>Description</th> |
mbed_official | 15:a81a8d6c1dfe | 1014 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1015 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1016 | * <td>ADC</td> |
mbed_official | 15:a81a8d6c1dfe | 1017 | * <td>Analog-to-Digital Converter</td> |
mbed_official | 15:a81a8d6c1dfe | 1018 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1019 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1020 | * <td>DAC</td> |
mbed_official | 15:a81a8d6c1dfe | 1021 | * <td>Digital-to-Analog Converter</td> |
mbed_official | 15:a81a8d6c1dfe | 1022 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1023 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1024 | * <td>LSB</td> |
mbed_official | 15:a81a8d6c1dfe | 1025 | * <td>Least Significant Bit</td> |
mbed_official | 15:a81a8d6c1dfe | 1026 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1027 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1028 | * <td>MSB</td> |
mbed_official | 15:a81a8d6c1dfe | 1029 | * <td>Most Significant Bit</td> |
mbed_official | 15:a81a8d6c1dfe | 1030 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1031 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1032 | * <td>DMA</td> |
mbed_official | 15:a81a8d6c1dfe | 1033 | * <td>Direct Memory Access</td> |
mbed_official | 15:a81a8d6c1dfe | 1034 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1035 | * </table> |
mbed_official | 15:a81a8d6c1dfe | 1036 | * |
mbed_official | 15:a81a8d6c1dfe | 1037 | * |
mbed_official | 15:a81a8d6c1dfe | 1038 | * \section asfdoc_sam0_adc_extra_dependencies Dependencies |
mbed_official | 15:a81a8d6c1dfe | 1039 | * This driver has the following dependencies: |
mbed_official | 15:a81a8d6c1dfe | 1040 | * |
mbed_official | 15:a81a8d6c1dfe | 1041 | * - \ref asfdoc_sam0_system_pinmux_group "System Pin Multiplexer Driver" |
mbed_official | 15:a81a8d6c1dfe | 1042 | * |
mbed_official | 15:a81a8d6c1dfe | 1043 | * |
mbed_official | 15:a81a8d6c1dfe | 1044 | * \section asfdoc_sam0_adc_extra_errata Errata |
mbed_official | 15:a81a8d6c1dfe | 1045 | * There are no errata related to this driver. |
mbed_official | 15:a81a8d6c1dfe | 1046 | * |
mbed_official | 15:a81a8d6c1dfe | 1047 | * |
mbed_official | 15:a81a8d6c1dfe | 1048 | * \section asfdoc_sam0_adc_extra_history Module History |
mbed_official | 15:a81a8d6c1dfe | 1049 | * An overview of the module history is presented in the table below, with |
mbed_official | 15:a81a8d6c1dfe | 1050 | * details on the enhancements and fixes made to the module since its first |
mbed_official | 15:a81a8d6c1dfe | 1051 | * release. The current version of this corresponds to the newest version in |
mbed_official | 15:a81a8d6c1dfe | 1052 | * the table. |
mbed_official | 15:a81a8d6c1dfe | 1053 | * |
mbed_official | 15:a81a8d6c1dfe | 1054 | * <table> |
mbed_official | 15:a81a8d6c1dfe | 1055 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1056 | * <th>Changelog</th> |
mbed_official | 15:a81a8d6c1dfe | 1057 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1058 | * \if DEVICE_SAML21_SUPPORT |
mbed_official | 15:a81a8d6c1dfe | 1059 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1060 | * <td>Initial Release</td> |
mbed_official | 15:a81a8d6c1dfe | 1061 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1062 | * \else |
mbed_official | 15:a81a8d6c1dfe | 1063 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1064 | * <td>Added support for SAMR21</td> |
mbed_official | 15:a81a8d6c1dfe | 1065 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1066 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1067 | * <td>Added support for SAMD21 and new DMA quick start guide</td> |
mbed_official | 15:a81a8d6c1dfe | 1068 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1069 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1070 | * <td>Added ADC calibration constant loading from the device signature |
mbed_official | 15:a81a8d6c1dfe | 1071 | * row when the module is initialized</td> |
mbed_official | 15:a81a8d6c1dfe | 1072 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1073 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1074 | * <td>Initial Release</td> |
mbed_official | 15:a81a8d6c1dfe | 1075 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1076 | * \endif |
mbed_official | 15:a81a8d6c1dfe | 1077 | * </table> |
mbed_official | 15:a81a8d6c1dfe | 1078 | */ |
mbed_official | 15:a81a8d6c1dfe | 1079 | |
mbed_official | 15:a81a8d6c1dfe | 1080 | /** |
mbed_official | 15:a81a8d6c1dfe | 1081 | * \page asfdoc_sam0_adc_exqsg Examples for ADC Driver |
mbed_official | 15:a81a8d6c1dfe | 1082 | * |
mbed_official | 15:a81a8d6c1dfe | 1083 | * This is a list of the available Quick Start guides (QSGs) and example |
mbed_official | 15:a81a8d6c1dfe | 1084 | * applications for \ref asfdoc_sam0_adc_group. QSGs are simple examples with |
mbed_official | 15:a81a8d6c1dfe | 1085 | * step-by-step instructions to configure and use this driver in a selection of |
mbed_official | 15:a81a8d6c1dfe | 1086 | * use cases. Note that a QSG can be compiled as a standalone application or be |
mbed_official | 15:a81a8d6c1dfe | 1087 | * added to the user application. |
mbed_official | 15:a81a8d6c1dfe | 1088 | * |
mbed_official | 15:a81a8d6c1dfe | 1089 | * - \subpage asfdoc_sam0_adc_basic_use_case |
mbed_official | 15:a81a8d6c1dfe | 1090 | * \if ADC_CALLBACK_MODE |
mbed_official | 15:a81a8d6c1dfe | 1091 | * - \subpage asfdoc_sam0_adc_basic_use_case_callback |
mbed_official | 15:a81a8d6c1dfe | 1092 | * \endif |
mbed_official | 15:a81a8d6c1dfe | 1093 | * - \subpage asfdoc_sam0_adc_dma_use_case |
mbed_official | 15:a81a8d6c1dfe | 1094 | * |
mbed_official | 15:a81a8d6c1dfe | 1095 | * \page asfdoc_sam0_adc_document_revision_history Document Revision History |
mbed_official | 15:a81a8d6c1dfe | 1096 | * |
mbed_official | 15:a81a8d6c1dfe | 1097 | * <table> |
mbed_official | 15:a81a8d6c1dfe | 1098 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1099 | * <th>Doc. Rev.</td> |
mbed_official | 15:a81a8d6c1dfe | 1100 | * <th>Date</td> |
mbed_official | 15:a81a8d6c1dfe | 1101 | * <th>Comments</td> |
mbed_official | 15:a81a8d6c1dfe | 1102 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1103 | * \if DEVICE_SAML21_SUPPORT |
mbed_official | 15:a81a8d6c1dfe | 1104 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1105 | * <td>42451A</td> |
mbed_official | 15:a81a8d6c1dfe | 1106 | * <td>07/2015</td> |
mbed_official | 15:a81a8d6c1dfe | 1107 | * <td>Initial document release</td> |
mbed_official | 15:a81a8d6c1dfe | 1108 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1109 | * \else |
mbed_official | 15:a81a8d6c1dfe | 1110 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1111 | * <td>42109E</td> |
mbed_official | 15:a81a8d6c1dfe | 1112 | * <td>04/2015</td> |
mbed_official | 15:a81a8d6c1dfe | 1113 | * <td>Added support for SAMDAx.</td> |
mbed_official | 15:a81a8d6c1dfe | 1114 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1115 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1116 | * <td>42109D</td> |
mbed_official | 15:a81a8d6c1dfe | 1117 | * <td>12/2014</td> |
mbed_official | 15:a81a8d6c1dfe | 1118 | * <td>Added support for SAMR21 and SAMD10/D11</td> |
mbed_official | 15:a81a8d6c1dfe | 1119 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1120 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1121 | * <td>42109C</td> |
mbed_official | 15:a81a8d6c1dfe | 1122 | * <td>01/2014</td> |
mbed_official | 15:a81a8d6c1dfe | 1123 | * <td>Added support for SAMD21</td> |
mbed_official | 15:a81a8d6c1dfe | 1124 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1125 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1126 | * <td>42109B</td> |
mbed_official | 15:a81a8d6c1dfe | 1127 | * <td>06/2013</td> |
mbed_official | 15:a81a8d6c1dfe | 1128 | * <td>Added additional documentation on the event system. Corrected |
mbed_official | 15:a81a8d6c1dfe | 1129 | * documentation typos.</td> |
mbed_official | 15:a81a8d6c1dfe | 1130 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1131 | * <tr> |
mbed_official | 15:a81a8d6c1dfe | 1132 | * <td>42109A</td> |
mbed_official | 15:a81a8d6c1dfe | 1133 | * <td>06/2013</td> |
mbed_official | 15:a81a8d6c1dfe | 1134 | * <td>Initial release</td> |
mbed_official | 15:a81a8d6c1dfe | 1135 | * </tr> |
mbed_official | 15:a81a8d6c1dfe | 1136 | * \endif |
mbed_official | 15:a81a8d6c1dfe | 1137 | * </table> |
mbed_official | 15:a81a8d6c1dfe | 1138 | */ |
mbed_official | 15:a81a8d6c1dfe | 1139 | |
mbed_official | 15:a81a8d6c1dfe | 1140 | #endif /* ADC_H_INCLUDED */ |