mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

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?

UserRevisionLine numberNew 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&reg; | SMART ARM&reg;-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 */