added prescaler for 16 bit pwm in LPC1347 target
Fork of mbed-dev by
targets/hal/TARGET_Atmel/TARGET_SAM_CortexM4/drivers/adc/adc2.h@147:ba84b7dc41a7, 2016-09-10 (annotated)
- Committer:
- JojoS
- Date:
- Sat Sep 10 15:32:04 2016 +0000
- Revision:
- 147:ba84b7dc41a7
- Parent:
- 107:414e9c822e99
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mbed_official | 107:414e9c822e99 | 1 | /** |
mbed_official | 107:414e9c822e99 | 2 | * \file |
mbed_official | 107:414e9c822e99 | 3 | * |
mbed_official | 107:414e9c822e99 | 4 | * \brief ADC Controller driver. |
mbed_official | 107:414e9c822e99 | 5 | * |
mbed_official | 107:414e9c822e99 | 6 | * Copyright (c) 2013-2015 Atmel Corporation. All rights reserved. |
mbed_official | 107:414e9c822e99 | 7 | * |
mbed_official | 107:414e9c822e99 | 8 | * \asf_license_start |
mbed_official | 107:414e9c822e99 | 9 | * |
mbed_official | 107:414e9c822e99 | 10 | * \page License |
mbed_official | 107:414e9c822e99 | 11 | * |
mbed_official | 107:414e9c822e99 | 12 | * Redistribution and use in source and binary forms, with or without |
mbed_official | 107:414e9c822e99 | 13 | * modification, are permitted provided that the following conditions are met: |
mbed_official | 107:414e9c822e99 | 14 | * |
mbed_official | 107:414e9c822e99 | 15 | * 1. Redistributions of source code must retain the above copyright notice, |
mbed_official | 107:414e9c822e99 | 16 | * this list of conditions and the following disclaimer. |
mbed_official | 107:414e9c822e99 | 17 | * |
mbed_official | 107:414e9c822e99 | 18 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
mbed_official | 107:414e9c822e99 | 19 | * this list of conditions and the following disclaimer in the documentation |
mbed_official | 107:414e9c822e99 | 20 | * and/or other materials provided with the distribution. |
mbed_official | 107:414e9c822e99 | 21 | * |
mbed_official | 107:414e9c822e99 | 22 | * 3. The name of Atmel may not be used to endorse or promote products derived |
mbed_official | 107:414e9c822e99 | 23 | * from this software without specific prior written permission. |
mbed_official | 107:414e9c822e99 | 24 | * |
mbed_official | 107:414e9c822e99 | 25 | * 4. This software may only be redistributed and used in connection with an |
mbed_official | 107:414e9c822e99 | 26 | * Atmel microcontroller product. |
mbed_official | 107:414e9c822e99 | 27 | * |
mbed_official | 107:414e9c822e99 | 28 | * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED |
mbed_official | 107:414e9c822e99 | 29 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
mbed_official | 107:414e9c822e99 | 30 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE |
mbed_official | 107:414e9c822e99 | 31 | * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR |
mbed_official | 107:414e9c822e99 | 32 | * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
mbed_official | 107:414e9c822e99 | 33 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
mbed_official | 107:414e9c822e99 | 34 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
mbed_official | 107:414e9c822e99 | 35 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
mbed_official | 107:414e9c822e99 | 36 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
mbed_official | 107:414e9c822e99 | 37 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
mbed_official | 107:414e9c822e99 | 38 | * POSSIBILITY OF SUCH DAMAGE. |
mbed_official | 107:414e9c822e99 | 39 | * |
mbed_official | 107:414e9c822e99 | 40 | * \asf_license_stop |
mbed_official | 107:414e9c822e99 | 41 | * |
mbed_official | 107:414e9c822e99 | 42 | */ |
mbed_official | 107:414e9c822e99 | 43 | /* |
mbed_official | 107:414e9c822e99 | 44 | * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a> |
mbed_official | 107:414e9c822e99 | 45 | */ |
mbed_official | 107:414e9c822e99 | 46 | |
mbed_official | 107:414e9c822e99 | 47 | #ifndef ADC2_H_INCLUDED |
mbed_official | 107:414e9c822e99 | 48 | #define ADC2_H_INCLUDED |
mbed_official | 107:414e9c822e99 | 49 | |
mbed_official | 107:414e9c822e99 | 50 | #include "compiler.h" |
mbed_official | 107:414e9c822e99 | 51 | #include "status_codes.h" |
mbed_official | 107:414e9c822e99 | 52 | |
mbed_official | 107:414e9c822e99 | 53 | #if (SAM4N) |
mbed_official | 107:414e9c822e99 | 54 | #define TEMP_SENSOR |
mbed_official | 107:414e9c822e99 | 55 | #define SLEEP_MODE_ADC SLEEPMGR_SLEEP_WFI |
mbed_official | 107:414e9c822e99 | 56 | #endif |
mbed_official | 107:414e9c822e99 | 57 | |
mbed_official | 107:414e9c822e99 | 58 | #if (SAMG) |
mbed_official | 107:414e9c822e99 | 59 | #define NO_TEMP_SENSOR |
mbed_official | 107:414e9c822e99 | 60 | #define SLEEP_MODE_ADC SLEEPMGR_ACTIVE |
mbed_official | 107:414e9c822e99 | 61 | #endif |
mbed_official | 107:414e9c822e99 | 62 | |
mbed_official | 107:414e9c822e99 | 63 | /** Write Protect Key */ |
mbed_official | 107:414e9c822e99 | 64 | #ifndef ADC_WPMR_WPKEY_PASSWD |
mbed_official | 107:414e9c822e99 | 65 | #define ADC_WPMR_WPKEY_PASSWD (0x414443u << 8) |
mbed_official | 107:414e9c822e99 | 66 | #endif |
mbed_official | 107:414e9c822e99 | 67 | |
mbed_official | 107:414e9c822e99 | 68 | /** Definitions for ADC resolution */ |
mbed_official | 107:414e9c822e99 | 69 | enum adc_resolution { |
mbed_official | 107:414e9c822e99 | 70 | #if SAMG55 |
mbed_official | 107:414e9c822e99 | 71 | ADC_12_BITS = ADC_EMR_OSR_NO_AVERAGE, /* ADC 12-bit resolution */ |
mbed_official | 107:414e9c822e99 | 72 | ADC_13_BITS = ADC_EMR_OSR_OSR4, /* ADC 13-bit resolution */ |
mbed_official | 107:414e9c822e99 | 73 | ADC_14_BITS = ADC_EMR_OSR_OSR16, /* ADC 14-bit resolution */ |
mbed_official | 107:414e9c822e99 | 74 | ADC_15_BITS = ADC_EMR_OSR_OSR64, /* ADC 15-bit resolution */ |
mbed_official | 107:414e9c822e99 | 75 | ADC_16_BITS = ADC_EMR_OSR_OSR256, /* ADC 16-bit resolution */ |
mbed_official | 107:414e9c822e99 | 76 | #else |
mbed_official | 107:414e9c822e99 | 77 | ADC_8_BITS = ADC_MR_LOWRES_BITS_8, /* ADC 8-bit resolution */ |
mbed_official | 107:414e9c822e99 | 78 | ADC_10_BITS = ADC_MR_LOWRES_BITS_10, /* ADC 10-bit resolution */ |
mbed_official | 107:414e9c822e99 | 79 | ADC_11_BITS = ADC_EMR_OSR_OSR4, /* ADC 11-bit resolution */ |
mbed_official | 107:414e9c822e99 | 80 | ADC_12_BITS = ADC_EMR_OSR_OSR16 /* ADC 12-bit resolution */ |
mbed_official | 107:414e9c822e99 | 81 | #endif |
mbed_official | 107:414e9c822e99 | 82 | }; |
mbed_official | 107:414e9c822e99 | 83 | |
mbed_official | 107:414e9c822e99 | 84 | /** Definitions for ADC power mode */ |
mbed_official | 107:414e9c822e99 | 85 | enum adc_power_mode { |
mbed_official | 107:414e9c822e99 | 86 | /* ADC core on and reference voltage circuitry on */ |
mbed_official | 107:414e9c822e99 | 87 | ADC_POWER_MODE_0 = 0, |
mbed_official | 107:414e9c822e99 | 88 | /* ADC core off and reference voltage circuitry off */ |
mbed_official | 107:414e9c822e99 | 89 | ADC_POWER_MODE_1 |
mbed_official | 107:414e9c822e99 | 90 | }; |
mbed_official | 107:414e9c822e99 | 91 | |
mbed_official | 107:414e9c822e99 | 92 | /** Definitions for ADC trigger */ |
mbed_official | 107:414e9c822e99 | 93 | enum adc_trigger { |
mbed_official | 107:414e9c822e99 | 94 | /* Starting a conversion is only possible by software. */ |
mbed_official | 107:414e9c822e99 | 95 | ADC_TRIG_SW = ADC_MR_TRGEN_DIS, |
mbed_official | 107:414e9c822e99 | 96 | /* External trigger */ |
mbed_official | 107:414e9c822e99 | 97 | ADC_TRIG_EXT = ADC_MR_TRGSEL_ADC_TRIG0 | ADC_MR_TRGEN, |
mbed_official | 107:414e9c822e99 | 98 | /* TIO Output of the Timer Counter Channel 0 */ |
mbed_official | 107:414e9c822e99 | 99 | ADC_TRIG_TIO_CH_0 = ADC_MR_TRGSEL_ADC_TRIG1 | ADC_MR_TRGEN, |
mbed_official | 107:414e9c822e99 | 100 | /* TIO Output of the Timer Counter Channel 1 */ |
mbed_official | 107:414e9c822e99 | 101 | ADC_TRIG_TIO_CH_1 = ADC_MR_TRGSEL_ADC_TRIG2 | ADC_MR_TRGEN, |
mbed_official | 107:414e9c822e99 | 102 | /* TIO Output of the Timer Counter Channel 2 */ |
mbed_official | 107:414e9c822e99 | 103 | ADC_TRIG_TIO_CH_2 = ADC_MR_TRGSEL_ADC_TRIG3 | ADC_MR_TRGEN, |
mbed_official | 107:414e9c822e99 | 104 | #if (SAMG) |
mbed_official | 107:414e9c822e99 | 105 | /* RTCOUT0 */ |
mbed_official | 107:414e9c822e99 | 106 | ADC_TRIG_RTC_0 = ADC_MR_TRGSEL_ADC_TRIG4 | ADC_MR_TRGEN, |
mbed_official | 107:414e9c822e99 | 107 | /* RTTINC */ |
mbed_official | 107:414e9c822e99 | 108 | ADC_TRIG_RTT = ADC_MR_TRGSEL_ADC_TRIG5 | ADC_MR_TRGEN, |
mbed_official | 107:414e9c822e99 | 109 | #endif |
mbed_official | 107:414e9c822e99 | 110 | /* Freerun mode conversion. */ |
mbed_official | 107:414e9c822e99 | 111 | ADC_TRIG_FREERUN = 0xFF |
mbed_official | 107:414e9c822e99 | 112 | }; |
mbed_official | 107:414e9c822e99 | 113 | |
mbed_official | 107:414e9c822e99 | 114 | /** Definitions for ADC channel number */ |
mbed_official | 107:414e9c822e99 | 115 | enum adc_channel_num { |
mbed_official | 107:414e9c822e99 | 116 | ADC_CHANNEL_0 = 0, |
mbed_official | 107:414e9c822e99 | 117 | ADC_CHANNEL_1, |
mbed_official | 107:414e9c822e99 | 118 | ADC_CHANNEL_2, |
mbed_official | 107:414e9c822e99 | 119 | ADC_CHANNEL_3, |
mbed_official | 107:414e9c822e99 | 120 | ADC_CHANNEL_4, |
mbed_official | 107:414e9c822e99 | 121 | ADC_CHANNEL_5, |
mbed_official | 107:414e9c822e99 | 122 | ADC_CHANNEL_6, |
mbed_official | 107:414e9c822e99 | 123 | ADC_CHANNEL_7, |
mbed_official | 107:414e9c822e99 | 124 | #if (SAM4N) |
mbed_official | 107:414e9c822e99 | 125 | ADC_CHANNEL_8, |
mbed_official | 107:414e9c822e99 | 126 | ADC_CHANNEL_9, |
mbed_official | 107:414e9c822e99 | 127 | ADC_CHANNEL_10, |
mbed_official | 107:414e9c822e99 | 128 | ADC_CHANNEL_11, |
mbed_official | 107:414e9c822e99 | 129 | ADC_CHANNEL_12, |
mbed_official | 107:414e9c822e99 | 130 | ADC_CHANNEL_13, |
mbed_official | 107:414e9c822e99 | 131 | ADC_CHANNEL_14, |
mbed_official | 107:414e9c822e99 | 132 | ADC_CHANNEL_15, |
mbed_official | 107:414e9c822e99 | 133 | #endif |
mbed_official | 107:414e9c822e99 | 134 | #ifdef TEMP_SENSOR |
mbed_official | 107:414e9c822e99 | 135 | ADC_TEMPERATURE_SENSOR, |
mbed_official | 107:414e9c822e99 | 136 | #endif |
mbed_official | 107:414e9c822e99 | 137 | ADC_CHANNEL_ALL = 0xFFFF |
mbed_official | 107:414e9c822e99 | 138 | }; |
mbed_official | 107:414e9c822e99 | 139 | |
mbed_official | 107:414e9c822e99 | 140 | /** Definitions for ADC Start Up Time */ |
mbed_official | 107:414e9c822e99 | 141 | enum adc_startup_time { |
mbed_official | 107:414e9c822e99 | 142 | ADC_STARTUP_TIME_0 = ADC_MR_STARTUP_SUT0, |
mbed_official | 107:414e9c822e99 | 143 | ADC_STARTUP_TIME_1 = ADC_MR_STARTUP_SUT8, |
mbed_official | 107:414e9c822e99 | 144 | ADC_STARTUP_TIME_2 = ADC_MR_STARTUP_SUT16, |
mbed_official | 107:414e9c822e99 | 145 | ADC_STARTUP_TIME_3 = ADC_MR_STARTUP_SUT24, |
mbed_official | 107:414e9c822e99 | 146 | ADC_STARTUP_TIME_4 = ADC_MR_STARTUP_SUT64, |
mbed_official | 107:414e9c822e99 | 147 | ADC_STARTUP_TIME_5 = ADC_MR_STARTUP_SUT80, |
mbed_official | 107:414e9c822e99 | 148 | ADC_STARTUP_TIME_6 = ADC_MR_STARTUP_SUT96, |
mbed_official | 107:414e9c822e99 | 149 | ADC_STARTUP_TIME_7 = ADC_MR_STARTUP_SUT112, |
mbed_official | 107:414e9c822e99 | 150 | ADC_STARTUP_TIME_8 = ADC_MR_STARTUP_SUT512, |
mbed_official | 107:414e9c822e99 | 151 | ADC_STARTUP_TIME_9 = ADC_MR_STARTUP_SUT576, |
mbed_official | 107:414e9c822e99 | 152 | ADC_STARTUP_TIME_10 = ADC_MR_STARTUP_SUT640, |
mbed_official | 107:414e9c822e99 | 153 | ADC_STARTUP_TIME_11 = ADC_MR_STARTUP_SUT704, |
mbed_official | 107:414e9c822e99 | 154 | ADC_STARTUP_TIME_12 = ADC_MR_STARTUP_SUT768, |
mbed_official | 107:414e9c822e99 | 155 | ADC_STARTUP_TIME_13 = ADC_MR_STARTUP_SUT832, |
mbed_official | 107:414e9c822e99 | 156 | ADC_STARTUP_TIME_14 = ADC_MR_STARTUP_SUT896, |
mbed_official | 107:414e9c822e99 | 157 | ADC_STARTUP_TIME_15 = ADC_MR_STARTUP_SUT960 |
mbed_official | 107:414e9c822e99 | 158 | }; |
mbed_official | 107:414e9c822e99 | 159 | |
mbed_official | 107:414e9c822e99 | 160 | /** Definitions for Comparison Mode */ |
mbed_official | 107:414e9c822e99 | 161 | enum adc_cmp_mode { |
mbed_official | 107:414e9c822e99 | 162 | ADC_CMP_MODE_0 = ADC_EMR_CMPMODE_LOW, |
mbed_official | 107:414e9c822e99 | 163 | ADC_CMP_MODE_1 = ADC_EMR_CMPMODE_HIGH, |
mbed_official | 107:414e9c822e99 | 164 | ADC_CMP_MODE_2 = ADC_EMR_CMPMODE_IN, |
mbed_official | 107:414e9c822e99 | 165 | ADC_CMP_MODE_3 = ADC_EMR_CMPMODE_OUT |
mbed_official | 107:414e9c822e99 | 166 | }; |
mbed_official | 107:414e9c822e99 | 167 | |
mbed_official | 107:414e9c822e99 | 168 | #ifdef TEMP_SENSOR |
mbed_official | 107:414e9c822e99 | 169 | /** Definitions for Temperature Comparison Mode */ |
mbed_official | 107:414e9c822e99 | 170 | enum adc_temp_cmp_mode { |
mbed_official | 107:414e9c822e99 | 171 | ADC_TEMP_CMP_MODE_0 = ADC_TEMPMR_TEMPCMPMOD_LOW, |
mbed_official | 107:414e9c822e99 | 172 | ADC_TEMP_CMP_MODE_1 = ADC_TEMPMR_TEMPCMPMOD_HIGH, |
mbed_official | 107:414e9c822e99 | 173 | ADC_TEMP_CMP_MODE_2 = ADC_TEMPMR_TEMPCMPMOD_IN, |
mbed_official | 107:414e9c822e99 | 174 | ADC_TEMP_CMP_MODE_3 = ADC_TEMPMR_TEMPCMPMOD_OUT |
mbed_official | 107:414e9c822e99 | 175 | }; |
mbed_official | 107:414e9c822e99 | 176 | #endif |
mbed_official | 107:414e9c822e99 | 177 | #if (SAMG) |
mbed_official | 107:414e9c822e99 | 178 | /** Definitions for Last Channel Specific Measurement Comparison Mode */ |
mbed_official | 107:414e9c822e99 | 179 | enum adc_last_channel_cmp_mode { |
mbed_official | 107:414e9c822e99 | 180 | ADC_LAST_CHANNEL_CMP_MODE_0 = ADC_LCTMR_CMPMOD_LOW, |
mbed_official | 107:414e9c822e99 | 181 | ADC_LAST_CHANNEL_CMP_MODE_1 = ADC_LCTMR_CMPMOD_HIGH, |
mbed_official | 107:414e9c822e99 | 182 | ADC_LAST_CHANNEL_CMP_MODE_2 = ADC_LCTMR_CMPMOD_IN, |
mbed_official | 107:414e9c822e99 | 183 | ADC_LAST_CHANNEL_CMP_MODE_3 = ADC_LCTMR_CMPMOD_OUT |
mbed_official | 107:414e9c822e99 | 184 | }; |
mbed_official | 107:414e9c822e99 | 185 | #endif |
mbed_official | 107:414e9c822e99 | 186 | |
mbed_official | 107:414e9c822e99 | 187 | /** Definitions for Reference Voltage Selection */ |
mbed_official | 107:414e9c822e99 | 188 | enum adc_refer_voltage_source { |
mbed_official | 107:414e9c822e99 | 189 | ADC_REFER_VOL_EXTERNAL = 0, |
mbed_official | 107:414e9c822e99 | 190 | ADC_REFER_VOL_STUCK_AT_MIN, |
mbed_official | 107:414e9c822e99 | 191 | ADC_REFER_VOL_VDDANA, |
mbed_official | 107:414e9c822e99 | 192 | ADC_REFER_VOL_IRVS |
mbed_official | 107:414e9c822e99 | 193 | }; |
mbed_official | 107:414e9c822e99 | 194 | |
mbed_official | 107:414e9c822e99 | 195 | /** |
mbed_official | 107:414e9c822e99 | 196 | * \brief ADC Enhanced configuration structure. |
mbed_official | 107:414e9c822e99 | 197 | * |
mbed_official | 107:414e9c822e99 | 198 | * Configuration structure for a ADC Enhanced instance. |
mbed_official | 107:414e9c822e99 | 199 | * This structure could be initialized by the \ref ADC_get_config_defaults() |
mbed_official | 107:414e9c822e99 | 200 | * function before being modified by the user application. |
mbed_official | 107:414e9c822e99 | 201 | */ |
mbed_official | 107:414e9c822e99 | 202 | struct adc_config { |
mbed_official | 107:414e9c822e99 | 203 | /** Resolution */ |
mbed_official | 107:414e9c822e99 | 204 | enum adc_resolution resolution; |
mbed_official | 107:414e9c822e99 | 205 | /** Master Clock */ |
mbed_official | 107:414e9c822e99 | 206 | uint32_t mck; |
mbed_official | 107:414e9c822e99 | 207 | /** ADC Clock */ |
mbed_official | 107:414e9c822e99 | 208 | uint32_t adc_clock; |
mbed_official | 107:414e9c822e99 | 209 | /** Start Up Time */ |
mbed_official | 107:414e9c822e99 | 210 | enum adc_startup_time startup_time; |
mbed_official | 107:414e9c822e99 | 211 | /** Tracking Time = (tracktim+1) / ADC clock */ |
mbed_official | 107:414e9c822e99 | 212 | uint8_t tracktim; |
mbed_official | 107:414e9c822e99 | 213 | /** Transfer Period */ |
mbed_official | 107:414e9c822e99 | 214 | uint8_t transfer; |
mbed_official | 107:414e9c822e99 | 215 | /** Use Sequence Enable */ |
mbed_official | 107:414e9c822e99 | 216 | bool useq; |
mbed_official | 107:414e9c822e99 | 217 | /** TAG of ADC_LDCR register */ |
mbed_official | 107:414e9c822e99 | 218 | bool tag; |
mbed_official | 107:414e9c822e99 | 219 | /** Averaging on Single Trigger Event */ |
mbed_official | 107:414e9c822e99 | 220 | bool aste; |
mbed_official | 107:414e9c822e99 | 221 | }; |
mbed_official | 107:414e9c822e99 | 222 | |
mbed_official | 107:414e9c822e99 | 223 | #ifdef TEMP_SENSOR |
mbed_official | 107:414e9c822e99 | 224 | /** ADC Temperature Sensor configuration structure.*/ |
mbed_official | 107:414e9c822e99 | 225 | struct adc_temp_sensor_config { |
mbed_official | 107:414e9c822e99 | 226 | /** Temperature Sensor On */ |
mbed_official | 107:414e9c822e99 | 227 | bool tempon; |
mbed_official | 107:414e9c822e99 | 228 | /** Temperature Comparison Mode */ |
mbed_official | 107:414e9c822e99 | 229 | enum adc_temp_cmp_mode mode; |
mbed_official | 107:414e9c822e99 | 230 | /** Temperature Low Threshold */ |
mbed_official | 107:414e9c822e99 | 231 | uint16_t low_threshold; |
mbed_official | 107:414e9c822e99 | 232 | /** Temperature High Threshold */ |
mbed_official | 107:414e9c822e99 | 233 | uint16_t high_threshold; |
mbed_official | 107:414e9c822e99 | 234 | }; |
mbed_official | 107:414e9c822e99 | 235 | #endif |
mbed_official | 107:414e9c822e99 | 236 | |
mbed_official | 107:414e9c822e99 | 237 | #if (SAMG) |
mbed_official | 107:414e9c822e99 | 238 | /** ADC Last Channel Specific Measurement configuration structure.*/ |
mbed_official | 107:414e9c822e99 | 239 | struct adc_last_channel_config { |
mbed_official | 107:414e9c822e99 | 240 | /** Specific Measurement On */ |
mbed_official | 107:414e9c822e99 | 241 | bool dual_trig_on; |
mbed_official | 107:414e9c822e99 | 242 | /** Specific Measurement Comparison Mode */ |
mbed_official | 107:414e9c822e99 | 243 | enum adc_last_channel_cmp_mode mode; |
mbed_official | 107:414e9c822e99 | 244 | /** Specific Measurement Low Threshold */ |
mbed_official | 107:414e9c822e99 | 245 | uint16_t low_threshold; |
mbed_official | 107:414e9c822e99 | 246 | /** Specific Measurement High Threshold */ |
mbed_official | 107:414e9c822e99 | 247 | uint16_t high_threshold; |
mbed_official | 107:414e9c822e99 | 248 | }; |
mbed_official | 107:414e9c822e99 | 249 | #endif |
mbed_official | 107:414e9c822e99 | 250 | |
mbed_official | 107:414e9c822e99 | 251 | /** ADC interrupt source type */ |
mbed_official | 107:414e9c822e99 | 252 | enum adc_interrupt_source { |
mbed_official | 107:414e9c822e99 | 253 | ADC_INTERRUPT_EOC_0 = 0, |
mbed_official | 107:414e9c822e99 | 254 | ADC_INTERRUPT_EOC_1, |
mbed_official | 107:414e9c822e99 | 255 | ADC_INTERRUPT_EOC_2, |
mbed_official | 107:414e9c822e99 | 256 | ADC_INTERRUPT_EOC_3, |
mbed_official | 107:414e9c822e99 | 257 | ADC_INTERRUPT_EOC_4, |
mbed_official | 107:414e9c822e99 | 258 | ADC_INTERRUPT_EOC_5, |
mbed_official | 107:414e9c822e99 | 259 | ADC_INTERRUPT_EOC_6, |
mbed_official | 107:414e9c822e99 | 260 | ADC_INTERRUPT_EOC_7, |
mbed_official | 107:414e9c822e99 | 261 | #if (SAM4N) |
mbed_official | 107:414e9c822e99 | 262 | ADC_INTERRUPT_EOC_8, |
mbed_official | 107:414e9c822e99 | 263 | ADC_INTERRUPT_EOC_9, |
mbed_official | 107:414e9c822e99 | 264 | ADC_INTERRUPT_EOC_10, |
mbed_official | 107:414e9c822e99 | 265 | ADC_INTERRUPT_EOC_11, |
mbed_official | 107:414e9c822e99 | 266 | ADC_INTERRUPT_EOC_12, |
mbed_official | 107:414e9c822e99 | 267 | ADC_INTERRUPT_EOC_13, |
mbed_official | 107:414e9c822e99 | 268 | ADC_INTERRUPT_EOC_14, |
mbed_official | 107:414e9c822e99 | 269 | ADC_INTERRUPT_EOC_15, |
mbed_official | 107:414e9c822e99 | 270 | ADC_INTERRUPT_EOC_16, |
mbed_official | 107:414e9c822e99 | 271 | #endif |
mbed_official | 107:414e9c822e99 | 272 | #ifdef TEMP_SENSOR |
mbed_official | 107:414e9c822e99 | 273 | ADC_INTERRUPT_TEMP_CHANGE, |
mbed_official | 107:414e9c822e99 | 274 | #endif |
mbed_official | 107:414e9c822e99 | 275 | ADC_INTERRUPT_END_CAL, |
mbed_official | 107:414e9c822e99 | 276 | ADC_INTERRUPT_DATA_READY, |
mbed_official | 107:414e9c822e99 | 277 | ADC_INTERRUPT_OVERRUN_ERROR, |
mbed_official | 107:414e9c822e99 | 278 | ADC_INTERRUPT_COMP_ERROR, |
mbed_official | 107:414e9c822e99 | 279 | ADC_INTERRUPT_END_RXBUF, |
mbed_official | 107:414e9c822e99 | 280 | ADC_INTERRUPT_RXBUF_FULL, |
mbed_official | 107:414e9c822e99 | 281 | ADC_INTERRUPT_ALL = 0xFFFFFFFF |
mbed_official | 107:414e9c822e99 | 282 | }; |
mbed_official | 107:414e9c822e99 | 283 | |
mbed_official | 107:414e9c822e99 | 284 | typedef void (*adc_callback_t)(void); |
mbed_official | 107:414e9c822e99 | 285 | |
mbed_official | 107:414e9c822e99 | 286 | void adc_get_config_defaults(struct adc_config *const cfg); |
mbed_official | 107:414e9c822e99 | 287 | enum status_code adc_init(Adc *const adc, struct adc_config *const config); |
mbed_official | 107:414e9c822e99 | 288 | |
mbed_official | 107:414e9c822e99 | 289 | #ifdef TEMP_SENSOR |
mbed_official | 107:414e9c822e99 | 290 | void adc_temp_sensor_get_config_defaults( |
mbed_official | 107:414e9c822e99 | 291 | struct adc_temp_sensor_config *const cfg); |
mbed_official | 107:414e9c822e99 | 292 | void adc_temp_sensor_set_config(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 293 | struct adc_temp_sensor_config *config); |
mbed_official | 107:414e9c822e99 | 294 | #endif |
mbed_official | 107:414e9c822e99 | 295 | #if (SAMG) |
mbed_official | 107:414e9c822e99 | 296 | void adc_last_channel_get_config_defaults( |
mbed_official | 107:414e9c822e99 | 297 | struct adc_last_channel_config *const cfg); |
mbed_official | 107:414e9c822e99 | 298 | void adc_last_channel_set_config(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 299 | struct adc_last_channel_config *config); |
mbed_official | 107:414e9c822e99 | 300 | #endif |
mbed_official | 107:414e9c822e99 | 301 | |
mbed_official | 107:414e9c822e99 | 302 | void adc_configure_sequence(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 303 | const enum adc_channel_num ch_list[], const uint8_t uc_num); |
mbed_official | 107:414e9c822e99 | 304 | void adc_enable(void); |
mbed_official | 107:414e9c822e99 | 305 | void adc_disable(void); |
mbed_official | 107:414e9c822e99 | 306 | void adc_set_callback(Adc *const adc, enum adc_interrupt_source source, |
mbed_official | 107:414e9c822e99 | 307 | adc_callback_t callback, uint8_t irq_level); |
mbed_official | 107:414e9c822e99 | 308 | |
mbed_official | 107:414e9c822e99 | 309 | /** |
mbed_official | 107:414e9c822e99 | 310 | * \internal |
mbed_official | 107:414e9c822e99 | 311 | * \brief ADC channel sanity check |
mbed_official | 107:414e9c822e99 | 312 | * |
mbed_official | 107:414e9c822e99 | 313 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 314 | * \param channel Adc channel number. |
mbed_official | 107:414e9c822e99 | 315 | * |
mbed_official | 107:414e9c822e99 | 316 | */ |
mbed_official | 107:414e9c822e99 | 317 | static inline void adc_ch_sanity_check(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 318 | const enum adc_channel_num channel) |
mbed_official | 107:414e9c822e99 | 319 | { |
mbed_official | 107:414e9c822e99 | 320 | if (adc == ADC) { |
mbed_official | 107:414e9c822e99 | 321 | Assert((channel < NB_CH_ADC) |
mbed_official | 107:414e9c822e99 | 322 | #ifdef TEMP_SENSOR |
mbed_official | 107:414e9c822e99 | 323 | ||(channel == ADC_TEMPERATURE_SENSOR) |
mbed_official | 107:414e9c822e99 | 324 | #endif |
mbed_official | 107:414e9c822e99 | 325 | ); |
mbed_official | 107:414e9c822e99 | 326 | } |
mbed_official | 107:414e9c822e99 | 327 | |
mbed_official | 107:414e9c822e99 | 328 | UNUSED(channel); |
mbed_official | 107:414e9c822e99 | 329 | } |
mbed_official | 107:414e9c822e99 | 330 | |
mbed_official | 107:414e9c822e99 | 331 | #if (SAMG) |
mbed_official | 107:414e9c822e99 | 332 | #if SAMG55 |
mbed_official | 107:414e9c822e99 | 333 | /** |
mbed_official | 107:414e9c822e99 | 334 | * \brief Configure ADC clock to mck. |
mbed_official | 107:414e9c822e99 | 335 | * |
mbed_official | 107:414e9c822e99 | 336 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 337 | * |
mbed_official | 107:414e9c822e99 | 338 | */ |
mbed_official | 107:414e9c822e99 | 339 | static inline void adc_select_clock_source_mck(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 340 | { |
mbed_official | 107:414e9c822e99 | 341 | uint32_t reg; |
mbed_official | 107:414e9c822e99 | 342 | |
mbed_official | 107:414e9c822e99 | 343 | reg = adc->ADC_EMR; |
mbed_official | 107:414e9c822e99 | 344 | |
mbed_official | 107:414e9c822e99 | 345 | reg &= ~ADC_EMR_SRCCLK_PMC_PCK; |
mbed_official | 107:414e9c822e99 | 346 | |
mbed_official | 107:414e9c822e99 | 347 | adc->ADC_EMR = reg; |
mbed_official | 107:414e9c822e99 | 348 | } |
mbed_official | 107:414e9c822e99 | 349 | |
mbed_official | 107:414e9c822e99 | 350 | /** |
mbed_official | 107:414e9c822e99 | 351 | * \brief Configure ADC clock to pck. |
mbed_official | 107:414e9c822e99 | 352 | * |
mbed_official | 107:414e9c822e99 | 353 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 354 | * |
mbed_official | 107:414e9c822e99 | 355 | */ |
mbed_official | 107:414e9c822e99 | 356 | static inline void adc_select_clock_source_pck(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 357 | { |
mbed_official | 107:414e9c822e99 | 358 | uint32_t reg; |
mbed_official | 107:414e9c822e99 | 359 | |
mbed_official | 107:414e9c822e99 | 360 | reg = adc->ADC_EMR; |
mbed_official | 107:414e9c822e99 | 361 | |
mbed_official | 107:414e9c822e99 | 362 | reg |= ADC_EMR_SRCCLK_PMC_PCK; |
mbed_official | 107:414e9c822e99 | 363 | |
mbed_official | 107:414e9c822e99 | 364 | adc->ADC_EMR = reg; |
mbed_official | 107:414e9c822e99 | 365 | } |
mbed_official | 107:414e9c822e99 | 366 | |
mbed_official | 107:414e9c822e99 | 367 | #else |
mbed_official | 107:414e9c822e99 | 368 | /** |
mbed_official | 107:414e9c822e99 | 369 | * \brief Configure ADC clock to MCK. |
mbed_official | 107:414e9c822e99 | 370 | * |
mbed_official | 107:414e9c822e99 | 371 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 372 | * |
mbed_official | 107:414e9c822e99 | 373 | */ |
mbed_official | 107:414e9c822e99 | 374 | static inline void adc_set_clock_mck(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 375 | { |
mbed_official | 107:414e9c822e99 | 376 | uint32_t reg; |
mbed_official | 107:414e9c822e99 | 377 | |
mbed_official | 107:414e9c822e99 | 378 | reg = adc->ADC_EMR; |
mbed_official | 107:414e9c822e99 | 379 | |
mbed_official | 107:414e9c822e99 | 380 | reg |= ADC_MR_DIV1; |
mbed_official | 107:414e9c822e99 | 381 | |
mbed_official | 107:414e9c822e99 | 382 | adc->ADC_MR = reg; |
mbed_official | 107:414e9c822e99 | 383 | } |
mbed_official | 107:414e9c822e99 | 384 | |
mbed_official | 107:414e9c822e99 | 385 | /** |
mbed_official | 107:414e9c822e99 | 386 | * \brief Configure ADC clock to MCK/3. |
mbed_official | 107:414e9c822e99 | 387 | * |
mbed_official | 107:414e9c822e99 | 388 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 389 | * |
mbed_official | 107:414e9c822e99 | 390 | */ |
mbed_official | 107:414e9c822e99 | 391 | static inline void adc_set_clock_mck_div3(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 392 | { |
mbed_official | 107:414e9c822e99 | 393 | uint32_t reg; |
mbed_official | 107:414e9c822e99 | 394 | |
mbed_official | 107:414e9c822e99 | 395 | reg = adc->ADC_MR; |
mbed_official | 107:414e9c822e99 | 396 | |
mbed_official | 107:414e9c822e99 | 397 | reg &= ~ADC_MR_DIV1; |
mbed_official | 107:414e9c822e99 | 398 | reg |= ADC_MR_DIV3; |
mbed_official | 107:414e9c822e99 | 399 | |
mbed_official | 107:414e9c822e99 | 400 | adc->ADC_MR = reg; |
mbed_official | 107:414e9c822e99 | 401 | } |
mbed_official | 107:414e9c822e99 | 402 | #endif |
mbed_official | 107:414e9c822e99 | 403 | #endif |
mbed_official | 107:414e9c822e99 | 404 | |
mbed_official | 107:414e9c822e99 | 405 | /** |
mbed_official | 107:414e9c822e99 | 406 | * \brief Configure conversion trigger and free run mode. |
mbed_official | 107:414e9c822e99 | 407 | * |
mbed_official | 107:414e9c822e99 | 408 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 409 | * \param trigger Conversion trigger. |
mbed_official | 107:414e9c822e99 | 410 | * |
mbed_official | 107:414e9c822e99 | 411 | */ |
mbed_official | 107:414e9c822e99 | 412 | static inline void adc_set_trigger(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 413 | const enum adc_trigger trigger) |
mbed_official | 107:414e9c822e99 | 414 | { |
mbed_official | 107:414e9c822e99 | 415 | uint32_t reg; |
mbed_official | 107:414e9c822e99 | 416 | |
mbed_official | 107:414e9c822e99 | 417 | reg = adc->ADC_MR; |
mbed_official | 107:414e9c822e99 | 418 | |
mbed_official | 107:414e9c822e99 | 419 | if (trigger == ADC_TRIG_FREERUN) { |
mbed_official | 107:414e9c822e99 | 420 | reg |= ADC_MR_FREERUN_ON; |
mbed_official | 107:414e9c822e99 | 421 | } else { |
mbed_official | 107:414e9c822e99 | 422 | reg &= ~(ADC_MR_TRGSEL_Msk | ADC_MR_TRGEN | ADC_MR_FREERUN_ON); |
mbed_official | 107:414e9c822e99 | 423 | reg |= trigger; |
mbed_official | 107:414e9c822e99 | 424 | } |
mbed_official | 107:414e9c822e99 | 425 | |
mbed_official | 107:414e9c822e99 | 426 | adc->ADC_MR = reg; |
mbed_official | 107:414e9c822e99 | 427 | } |
mbed_official | 107:414e9c822e99 | 428 | |
mbed_official | 107:414e9c822e99 | 429 | void adc_set_resolution(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 430 | const enum adc_resolution res); |
mbed_official | 107:414e9c822e99 | 431 | |
mbed_official | 107:414e9c822e99 | 432 | void adc_set_comparison_mode(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 433 | const enum adc_cmp_mode mode, |
mbed_official | 107:414e9c822e99 | 434 | const enum adc_channel_num channel, |
mbed_official | 107:414e9c822e99 | 435 | uint8_t cmp_filter); |
mbed_official | 107:414e9c822e99 | 436 | |
mbed_official | 107:414e9c822e99 | 437 | /** |
mbed_official | 107:414e9c822e99 | 438 | * \brief Get comparison mode. |
mbed_official | 107:414e9c822e99 | 439 | * |
mbed_official | 107:414e9c822e99 | 440 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 441 | * |
mbed_official | 107:414e9c822e99 | 442 | * \retval Compare mode value. |
mbed_official | 107:414e9c822e99 | 443 | */ |
mbed_official | 107:414e9c822e99 | 444 | static inline enum adc_cmp_mode adc_get_comparison_mode(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 445 | { |
mbed_official | 107:414e9c822e99 | 446 | return (enum adc_cmp_mode)(adc->ADC_EMR & ADC_EMR_CMPMODE_Msk); |
mbed_official | 107:414e9c822e99 | 447 | } |
mbed_official | 107:414e9c822e99 | 448 | |
mbed_official | 107:414e9c822e99 | 449 | /** |
mbed_official | 107:414e9c822e99 | 450 | * \brief Configure ADC compare window. |
mbed_official | 107:414e9c822e99 | 451 | * |
mbed_official | 107:414e9c822e99 | 452 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 453 | * \param us_low_threshold Low threshold of compare window. |
mbed_official | 107:414e9c822e99 | 454 | * \param us_high_threshold High threshold of compare window. |
mbed_official | 107:414e9c822e99 | 455 | */ |
mbed_official | 107:414e9c822e99 | 456 | static inline void adc_set_comparison_window(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 457 | const uint16_t us_low_threshold, |
mbed_official | 107:414e9c822e99 | 458 | const uint16_t us_high_threshold) |
mbed_official | 107:414e9c822e99 | 459 | { |
mbed_official | 107:414e9c822e99 | 460 | adc->ADC_CWR = ADC_CWR_LOWTHRES(us_low_threshold) | |
mbed_official | 107:414e9c822e99 | 461 | ADC_CWR_HIGHTHRES(us_high_threshold); |
mbed_official | 107:414e9c822e99 | 462 | } |
mbed_official | 107:414e9c822e99 | 463 | |
mbed_official | 107:414e9c822e99 | 464 | /** |
mbed_official | 107:414e9c822e99 | 465 | * \brief Enable or disable write protection of ADC registers. |
mbed_official | 107:414e9c822e99 | 466 | * |
mbed_official | 107:414e9c822e99 | 467 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 468 | * \param is_enable 1 to enable, 0 to disable. |
mbed_official | 107:414e9c822e99 | 469 | */ |
mbed_official | 107:414e9c822e99 | 470 | static inline void adc_set_writeprotect(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 471 | const bool is_enable) |
mbed_official | 107:414e9c822e99 | 472 | { |
mbed_official | 107:414e9c822e99 | 473 | if (is_enable) { |
mbed_official | 107:414e9c822e99 | 474 | adc->ADC_WPMR = ADC_WPMR_WPEN | ADC_WPMR_WPKEY_PASSWD; |
mbed_official | 107:414e9c822e99 | 475 | } else { |
mbed_official | 107:414e9c822e99 | 476 | adc->ADC_WPMR = ADC_WPMR_WPKEY_PASSWD; |
mbed_official | 107:414e9c822e99 | 477 | } |
mbed_official | 107:414e9c822e99 | 478 | } |
mbed_official | 107:414e9c822e99 | 479 | |
mbed_official | 107:414e9c822e99 | 480 | /** |
mbed_official | 107:414e9c822e99 | 481 | * \brief Indicate write protect status. |
mbed_official | 107:414e9c822e99 | 482 | * |
mbed_official | 107:414e9c822e99 | 483 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 484 | * |
mbed_official | 107:414e9c822e99 | 485 | * \return 0 if no write protect violation occurred, or 16-bit write protect |
mbed_official | 107:414e9c822e99 | 486 | * violation source. |
mbed_official | 107:414e9c822e99 | 487 | */ |
mbed_official | 107:414e9c822e99 | 488 | static inline uint32_t adc_get_writeprotect_status(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 489 | { |
mbed_official | 107:414e9c822e99 | 490 | uint32_t reg_value; |
mbed_official | 107:414e9c822e99 | 491 | |
mbed_official | 107:414e9c822e99 | 492 | reg_value = adc->ADC_WPSR; |
mbed_official | 107:414e9c822e99 | 493 | if (reg_value & ADC_WPSR_WPVS) { |
mbed_official | 107:414e9c822e99 | 494 | return (reg_value & ADC_WPSR_WPVSRC_Msk) >> ADC_WPSR_WPVSRC_Pos; |
mbed_official | 107:414e9c822e99 | 495 | } else { |
mbed_official | 107:414e9c822e99 | 496 | return 0; |
mbed_official | 107:414e9c822e99 | 497 | } |
mbed_official | 107:414e9c822e99 | 498 | } |
mbed_official | 107:414e9c822e99 | 499 | |
mbed_official | 107:414e9c822e99 | 500 | /** |
mbed_official | 107:414e9c822e99 | 501 | * \brief Get ADC overrun error status. |
mbed_official | 107:414e9c822e99 | 502 | * |
mbed_official | 107:414e9c822e99 | 503 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 504 | * |
mbed_official | 107:414e9c822e99 | 505 | * \return ADC overrun error status. |
mbed_official | 107:414e9c822e99 | 506 | */ |
mbed_official | 107:414e9c822e99 | 507 | static inline uint32_t adc_get_overrun_status(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 508 | { |
mbed_official | 107:414e9c822e99 | 509 | return adc->ADC_OVER; |
mbed_official | 107:414e9c822e99 | 510 | } |
mbed_official | 107:414e9c822e99 | 511 | |
mbed_official | 107:414e9c822e99 | 512 | /** |
mbed_official | 107:414e9c822e99 | 513 | * \brief Set ADC averaging on single trigger event |
mbed_official | 107:414e9c822e99 | 514 | * |
mbed_official | 107:414e9c822e99 | 515 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 516 | */ |
mbed_official | 107:414e9c822e99 | 517 | static inline void adc_average_on_single_trigger(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 518 | { |
mbed_official | 107:414e9c822e99 | 519 | adc->ADC_EMR |= ADC_EMR_ASTE_SINGLE_TRIG_AVERAGE; |
mbed_official | 107:414e9c822e99 | 520 | } |
mbed_official | 107:414e9c822e99 | 521 | |
mbed_official | 107:414e9c822e99 | 522 | /** |
mbed_official | 107:414e9c822e99 | 523 | * \brief Set ADC averaging on serval trigger events |
mbed_official | 107:414e9c822e99 | 524 | * |
mbed_official | 107:414e9c822e99 | 525 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 526 | */ |
mbed_official | 107:414e9c822e99 | 527 | static inline void adc_average_on_multi_trigger(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 528 | { |
mbed_official | 107:414e9c822e99 | 529 | adc->ADC_EMR &= ~ADC_EMR_ASTE_SINGLE_TRIG_AVERAGE; |
mbed_official | 107:414e9c822e99 | 530 | } |
mbed_official | 107:414e9c822e99 | 531 | |
mbed_official | 107:414e9c822e99 | 532 | /** |
mbed_official | 107:414e9c822e99 | 533 | * \brief Start analog-to-digital conversion. |
mbed_official | 107:414e9c822e99 | 534 | * |
mbed_official | 107:414e9c822e99 | 535 | * \note If one of the hardware event is selected as ADC trigger, |
mbed_official | 107:414e9c822e99 | 536 | * this function can NOT start analog to digital conversion. |
mbed_official | 107:414e9c822e99 | 537 | * |
mbed_official | 107:414e9c822e99 | 538 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 539 | */ |
mbed_official | 107:414e9c822e99 | 540 | static inline void adc_start_software_conversion(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 541 | { |
mbed_official | 107:414e9c822e99 | 542 | adc->ADC_CR = ADC_CR_START; |
mbed_official | 107:414e9c822e99 | 543 | } |
mbed_official | 107:414e9c822e99 | 544 | |
mbed_official | 107:414e9c822e99 | 545 | void adc_set_power_mode(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 546 | const enum adc_power_mode mode); |
mbed_official | 107:414e9c822e99 | 547 | |
mbed_official | 107:414e9c822e99 | 548 | /** |
mbed_official | 107:414e9c822e99 | 549 | * \brief Enable the specified ADC channel. |
mbed_official | 107:414e9c822e99 | 550 | * |
mbed_official | 107:414e9c822e99 | 551 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 552 | * \param adc_ch Adc channel number. |
mbed_official | 107:414e9c822e99 | 553 | */ |
mbed_official | 107:414e9c822e99 | 554 | static inline void adc_channel_enable(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 555 | const enum adc_channel_num adc_ch) |
mbed_official | 107:414e9c822e99 | 556 | { |
mbed_official | 107:414e9c822e99 | 557 | if (adc_ch != ADC_CHANNEL_ALL) { |
mbed_official | 107:414e9c822e99 | 558 | adc_ch_sanity_check(adc, adc_ch); |
mbed_official | 107:414e9c822e99 | 559 | } |
mbed_official | 107:414e9c822e99 | 560 | |
mbed_official | 107:414e9c822e99 | 561 | adc->ADC_CHER = (adc_ch == ADC_CHANNEL_ALL) ? |
mbed_official | 107:414e9c822e99 | 562 | ADC_CHANNEL_ALL : 1 << adc_ch; |
mbed_official | 107:414e9c822e99 | 563 | } |
mbed_official | 107:414e9c822e99 | 564 | |
mbed_official | 107:414e9c822e99 | 565 | /** |
mbed_official | 107:414e9c822e99 | 566 | * \brief Disable the specified ADC channel. |
mbed_official | 107:414e9c822e99 | 567 | * |
mbed_official | 107:414e9c822e99 | 568 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 569 | * \param adc_ch Adc channel number. |
mbed_official | 107:414e9c822e99 | 570 | */ |
mbed_official | 107:414e9c822e99 | 571 | static inline void adc_channel_disable(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 572 | const enum adc_channel_num adc_ch) |
mbed_official | 107:414e9c822e99 | 573 | { |
mbed_official | 107:414e9c822e99 | 574 | if (adc_ch != ADC_CHANNEL_ALL) { |
mbed_official | 107:414e9c822e99 | 575 | adc_ch_sanity_check(adc, adc_ch); |
mbed_official | 107:414e9c822e99 | 576 | } |
mbed_official | 107:414e9c822e99 | 577 | |
mbed_official | 107:414e9c822e99 | 578 | adc->ADC_CHDR = (adc_ch == ADC_CHANNEL_ALL) ? |
mbed_official | 107:414e9c822e99 | 579 | ADC_CHANNEL_ALL : 1 << adc_ch; |
mbed_official | 107:414e9c822e99 | 580 | } |
mbed_official | 107:414e9c822e99 | 581 | |
mbed_official | 107:414e9c822e99 | 582 | /** |
mbed_official | 107:414e9c822e99 | 583 | * \brief Get the ADC channel status. |
mbed_official | 107:414e9c822e99 | 584 | * |
mbed_official | 107:414e9c822e99 | 585 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 586 | * \param adc_ch Adc channel number. |
mbed_official | 107:414e9c822e99 | 587 | * |
mbed_official | 107:414e9c822e99 | 588 | * \retval 1 if channel is enabled. |
mbed_official | 107:414e9c822e99 | 589 | * \retval 0 if channel is disabled. |
mbed_official | 107:414e9c822e99 | 590 | */ |
mbed_official | 107:414e9c822e99 | 591 | static inline uint32_t adc_channel_get_status(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 592 | const enum adc_channel_num adc_ch) |
mbed_official | 107:414e9c822e99 | 593 | { |
mbed_official | 107:414e9c822e99 | 594 | adc_ch_sanity_check(adc, adc_ch); |
mbed_official | 107:414e9c822e99 | 595 | |
mbed_official | 107:414e9c822e99 | 596 | return adc->ADC_CHSR & (1 << adc_ch); |
mbed_official | 107:414e9c822e99 | 597 | } |
mbed_official | 107:414e9c822e99 | 598 | |
mbed_official | 107:414e9c822e99 | 599 | /** |
mbed_official | 107:414e9c822e99 | 600 | * \brief Read the Converted Data of the selected channel. |
mbed_official | 107:414e9c822e99 | 601 | * |
mbed_official | 107:414e9c822e99 | 602 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 603 | * \param adc_ch Adc channel number. |
mbed_official | 107:414e9c822e99 | 604 | * |
mbed_official | 107:414e9c822e99 | 605 | * \return ADC converted value of the selected channel. |
mbed_official | 107:414e9c822e99 | 606 | */ |
mbed_official | 107:414e9c822e99 | 607 | static inline uint32_t adc_channel_get_value(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 608 | enum adc_channel_num adc_ch) |
mbed_official | 107:414e9c822e99 | 609 | { |
mbed_official | 107:414e9c822e99 | 610 | adc_ch_sanity_check(adc, adc_ch); |
mbed_official | 107:414e9c822e99 | 611 | |
mbed_official | 107:414e9c822e99 | 612 | return adc->ADC_CDR[adc_ch]; |
mbed_official | 107:414e9c822e99 | 613 | } |
mbed_official | 107:414e9c822e99 | 614 | |
mbed_official | 107:414e9c822e99 | 615 | /** |
mbed_official | 107:414e9c822e99 | 616 | * \brief Get the Last Data Converted. |
mbed_official | 107:414e9c822e99 | 617 | * |
mbed_official | 107:414e9c822e99 | 618 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 619 | * |
mbed_official | 107:414e9c822e99 | 620 | * \return ADC latest converted value. |
mbed_official | 107:414e9c822e99 | 621 | */ |
mbed_official | 107:414e9c822e99 | 622 | static inline uint32_t adc_get_latest_value(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 623 | { |
mbed_official | 107:414e9c822e99 | 624 | return adc->ADC_LCDR & ADC_LCDR_LDATA_Msk; |
mbed_official | 107:414e9c822e99 | 625 | } |
mbed_official | 107:414e9c822e99 | 626 | |
mbed_official | 107:414e9c822e99 | 627 | /** |
mbed_official | 107:414e9c822e99 | 628 | * \brief Get the Last Converted Channel Number. |
mbed_official | 107:414e9c822e99 | 629 | * |
mbed_official | 107:414e9c822e99 | 630 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 631 | * |
mbed_official | 107:414e9c822e99 | 632 | * \return ADC Last Converted Channel Number. |
mbed_official | 107:414e9c822e99 | 633 | */ |
mbed_official | 107:414e9c822e99 | 634 | static inline uint32_t adc_get_latest_chan_num(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 635 | { |
mbed_official | 107:414e9c822e99 | 636 | #if SAMG55 |
mbed_official | 107:414e9c822e99 | 637 | return (adc->ADC_LCDR & ADC_LCDR_CHNBOSR_Msk) >> ADC_LCDR_CHNBOSR_Pos; |
mbed_official | 107:414e9c822e99 | 638 | #else |
mbed_official | 107:414e9c822e99 | 639 | return (adc->ADC_LCDR & ADC_LCDR_CHNB_Msk) >> ADC_LCDR_CHNB_Pos; |
mbed_official | 107:414e9c822e99 | 640 | #endif |
mbed_official | 107:414e9c822e99 | 641 | } |
mbed_official | 107:414e9c822e99 | 642 | |
mbed_official | 107:414e9c822e99 | 643 | void adc_enable_interrupt(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 644 | enum adc_interrupt_source interrupt_source); |
mbed_official | 107:414e9c822e99 | 645 | |
mbed_official | 107:414e9c822e99 | 646 | void adc_disable_interrupt(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 647 | enum adc_interrupt_source interrupt_source); |
mbed_official | 107:414e9c822e99 | 648 | |
mbed_official | 107:414e9c822e99 | 649 | /** |
mbed_official | 107:414e9c822e99 | 650 | * \brief Get ADC interrupt status. |
mbed_official | 107:414e9c822e99 | 651 | * |
mbed_official | 107:414e9c822e99 | 652 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 653 | * |
mbed_official | 107:414e9c822e99 | 654 | * \return The interrupt status value. |
mbed_official | 107:414e9c822e99 | 655 | */ |
mbed_official | 107:414e9c822e99 | 656 | static inline uint32_t adc_get_interrupt_status(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 657 | { |
mbed_official | 107:414e9c822e99 | 658 | return adc->ADC_ISR; |
mbed_official | 107:414e9c822e99 | 659 | } |
mbed_official | 107:414e9c822e99 | 660 | |
mbed_official | 107:414e9c822e99 | 661 | /** |
mbed_official | 107:414e9c822e99 | 662 | * \brief Get ADC interrupt mask. |
mbed_official | 107:414e9c822e99 | 663 | * |
mbed_official | 107:414e9c822e99 | 664 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 665 | * |
mbed_official | 107:414e9c822e99 | 666 | * \return The interrupt mask value. |
mbed_official | 107:414e9c822e99 | 667 | */ |
mbed_official | 107:414e9c822e99 | 668 | static inline uint32_t adc_get_interrupt_mask(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 669 | { |
mbed_official | 107:414e9c822e99 | 670 | return adc->ADC_IMR; |
mbed_official | 107:414e9c822e99 | 671 | } |
mbed_official | 107:414e9c822e99 | 672 | |
mbed_official | 107:414e9c822e99 | 673 | /** |
mbed_official | 107:414e9c822e99 | 674 | * \brief Get PDC registers base address. |
mbed_official | 107:414e9c822e99 | 675 | * |
mbed_official | 107:414e9c822e99 | 676 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 677 | * |
mbed_official | 107:414e9c822e99 | 678 | * \return Adc Pdc register base address. |
mbed_official | 107:414e9c822e99 | 679 | */ |
mbed_official | 107:414e9c822e99 | 680 | static inline Pdc *adc_get_pdc_base(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 681 | { |
mbed_official | 107:414e9c822e99 | 682 | Pdc *p_pdc_base = NULL; |
mbed_official | 107:414e9c822e99 | 683 | |
mbed_official | 107:414e9c822e99 | 684 | if (adc == ADC) { |
mbed_official | 107:414e9c822e99 | 685 | p_pdc_base = PDC_ADC; |
mbed_official | 107:414e9c822e99 | 686 | } |
mbed_official | 107:414e9c822e99 | 687 | |
mbed_official | 107:414e9c822e99 | 688 | return p_pdc_base; |
mbed_official | 107:414e9c822e99 | 689 | } |
mbed_official | 107:414e9c822e99 | 690 | |
mbed_official | 107:414e9c822e99 | 691 | /** |
mbed_official | 107:414e9c822e99 | 692 | * \brief Launch an automatic calibration of the ADC on next sequence. |
mbed_official | 107:414e9c822e99 | 693 | * |
mbed_official | 107:414e9c822e99 | 694 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 695 | * |
mbed_official | 107:414e9c822e99 | 696 | * \retval STATUS_OK An automatic calibration is launched. |
mbed_official | 107:414e9c822e99 | 697 | * \retval STATUS_ERR_BUSY Automatic calibration can not be launched because |
mbed_official | 107:414e9c822e99 | 698 | * the ADC is in freerun mode. |
mbed_official | 107:414e9c822e99 | 699 | */ |
mbed_official | 107:414e9c822e99 | 700 | static inline enum status_code adc_start_calibration(Adc *const adc) |
mbed_official | 107:414e9c822e99 | 701 | { |
mbed_official | 107:414e9c822e99 | 702 | if ((adc->ADC_MR & ADC_MR_FREERUN) == ADC_MR_FREERUN_ON) { |
mbed_official | 107:414e9c822e99 | 703 | return STATUS_ERR_BUSY; |
mbed_official | 107:414e9c822e99 | 704 | } |
mbed_official | 107:414e9c822e99 | 705 | |
mbed_official | 107:414e9c822e99 | 706 | adc->ADC_CR = ADC_CR_AUTOCAL; |
mbed_official | 107:414e9c822e99 | 707 | return STATUS_OK; |
mbed_official | 107:414e9c822e99 | 708 | } |
mbed_official | 107:414e9c822e99 | 709 | |
mbed_official | 107:414e9c822e99 | 710 | #if (SAM4N) |
mbed_official | 107:414e9c822e99 | 711 | /** |
mbed_official | 107:414e9c822e99 | 712 | * \brief ADC Reference Voltage Selection |
mbed_official | 107:414e9c822e99 | 713 | * |
mbed_official | 107:414e9c822e99 | 714 | * \param adc Base address of the ADC. |
mbed_official | 107:414e9c822e99 | 715 | * \param adc_ref_src The source selection for ADC reference voltage, |
mbed_official | 107:414e9c822e99 | 716 | * ADC_REFER_VOL_EXTERNAL - the external pin ADVREF defines the voltage reference. |
mbed_official | 107:414e9c822e99 | 717 | * ADC_REFER_VOL_STUCK_AT_MIN - the internal reference voltage is stuck at the minimum value |
mbed_official | 107:414e9c822e99 | 718 | * ADC_REFER_VOL_VDDANA - the internal voltage reference is forced to VDDANA. Effective only if ONREF is 1. |
mbed_official | 107:414e9c822e99 | 719 | * ADC_REFER_VOL_IRVS - the internal reference voltage is defined by field IRVS |
mbed_official | 107:414e9c822e99 | 720 | * See the product electrical characteristics for further details. |
mbed_official | 107:414e9c822e99 | 721 | * \param irvs Internal reference volatage selection, only be effective when |
mbed_official | 107:414e9c822e99 | 722 | * adc_ref_src equals to ADC_REFER_VOL_IRVS |
mbed_official | 107:414e9c822e99 | 723 | */ |
mbed_official | 107:414e9c822e99 | 724 | static inline void adc_ref_vol_sel(Adc *const adc, |
mbed_official | 107:414e9c822e99 | 725 | enum adc_refer_voltage_source adc_ref_src, |
mbed_official | 107:414e9c822e99 | 726 | uint8_t irvs) |
mbed_official | 107:414e9c822e99 | 727 | { |
mbed_official | 107:414e9c822e99 | 728 | if (ADC_REFER_VOL_EXTERNAL == adc_ref_src) { |
mbed_official | 107:414e9c822e99 | 729 | adc->ADC_ACR &= ~ADC_ACR_ONREF_EN; |
mbed_official | 107:414e9c822e99 | 730 | } else if (ADC_REFER_VOL_STUCK_AT_MIN == adc_ref_src) { |
mbed_official | 107:414e9c822e99 | 731 | adc->ADC_ACR |= ADC_ACR_ONREF_EN; |
mbed_official | 107:414e9c822e99 | 732 | adc->ADC_ACR &= ~(ADC_ACR_IRVCE_EN | ADC_ACR_FORCEREF_EN); |
mbed_official | 107:414e9c822e99 | 733 | } else if (ADC_REFER_VOL_VDDANA == adc_ref_src) { |
mbed_official | 107:414e9c822e99 | 734 | adc->ADC_ACR |= ADC_ACR_ONREF_EN | ADC_ACR_FORCEREF_EN; |
mbed_official | 107:414e9c822e99 | 735 | } else if (ADC_REFER_VOL_IRVS == adc_ref_src) { |
mbed_official | 107:414e9c822e99 | 736 | adc->ADC_ACR &= ~ADC_ACR_FORCEREF_EN; |
mbed_official | 107:414e9c822e99 | 737 | adc->ADC_ACR |= ADC_ACR_ONREF_EN | ADC_ACR_IRVCE_EN | |
mbed_official | 107:414e9c822e99 | 738 | (irvs << ADC_ACR_IRVS_Pos); |
mbed_official | 107:414e9c822e99 | 739 | } |
mbed_official | 107:414e9c822e99 | 740 | } |
mbed_official | 107:414e9c822e99 | 741 | #endif |
mbed_official | 107:414e9c822e99 | 742 | |
mbed_official | 107:414e9c822e99 | 743 | /** |
mbed_official | 107:414e9c822e99 | 744 | * \page sam_adc2_quickstart Quickstart guide for ADC driver |
mbed_official | 107:414e9c822e99 | 745 | * |
mbed_official | 107:414e9c822e99 | 746 | * This is the quickstart guide for the \ref sam_drivers_adc2_group |
mbed_official | 107:414e9c822e99 | 747 | * "ADC2 driver" with step-by-step instructions on how to configure and use |
mbed_official | 107:414e9c822e99 | 748 | * the driver in a selection of use cases. |
mbed_official | 107:414e9c822e99 | 749 | * |
mbed_official | 107:414e9c822e99 | 750 | * The use cases contain several code fragments. The code fragments in the |
mbed_official | 107:414e9c822e99 | 751 | * steps for setup can be copied into a custom initialization function, while |
mbed_official | 107:414e9c822e99 | 752 | * the steps for usage can be copied into, e.g., the main application function. |
mbed_official | 107:414e9c822e99 | 753 | * |
mbed_official | 107:414e9c822e99 | 754 | * \section adc_basic_use_case Basic use case |
mbed_official | 107:414e9c822e99 | 755 | * In this basic use case, the ADC module and single channel are configured for: |
mbed_official | 107:414e9c822e99 | 756 | * - 10 -bit resolution |
mbed_official | 107:414e9c822e99 | 757 | * - ADC clock frequency is 6MHz |
mbed_official | 107:414e9c822e99 | 758 | * - Start Up Time is 64 periods ADC clock |
mbed_official | 107:414e9c822e99 | 759 | * - Tracking Time is 3 periods of ADC clock |
mbed_official | 107:414e9c822e99 | 760 | * - Transfer Period field shall be programmed with 2 as datasheet said |
mbed_official | 107:414e9c822e99 | 761 | * - The controller converts channels in a simple numeric order |
mbed_official | 107:414e9c822e99 | 762 | * - Appends the channel number to the conversion result in AFE_LDCR register |
mbed_official | 107:414e9c822e99 | 763 | * - Single Trigger is optional to get an averaged value |
mbed_official | 107:414e9c822e99 | 764 | * - Software triggering of conversions |
mbed_official | 107:414e9c822e99 | 765 | * - Single channel measurement |
mbed_official | 107:414e9c822e99 | 766 | * - ADC_CHANNEL_1 of ADC as input |
mbed_official | 107:414e9c822e99 | 767 | * |
mbed_official | 107:414e9c822e99 | 768 | * \subsection sam_adc2_quickstart_prereq Prerequisites |
mbed_official | 107:414e9c822e99 | 769 | * -# \ref sysclk_group "System Clock Management (Sysclock)" |
mbed_official | 107:414e9c822e99 | 770 | * |
mbed_official | 107:414e9c822e99 | 771 | * \section adc_basic_use_case_setup Setup steps |
mbed_official | 107:414e9c822e99 | 772 | * \subsection adc_basic_use_case_setup_code Example code |
mbed_official | 107:414e9c822e99 | 773 | * Add to application C-file: |
mbed_official | 107:414e9c822e99 | 774 | * \code |
mbed_official | 107:414e9c822e99 | 775 | adc_enable(); |
mbed_official | 107:414e9c822e99 | 776 | adc_get_config_defaults(&adc_cfg); |
mbed_official | 107:414e9c822e99 | 777 | adc_init(ADC, &adc_cfg); |
mbed_official | 107:414e9c822e99 | 778 | adc_set_trigger(ADC, ADC_TRIG_SW); |
mbed_official | 107:414e9c822e99 | 779 | adc_channel_enable(ADC, ADC_CHANNEL_1); |
mbed_official | 107:414e9c822e99 | 780 | \endcode |
mbed_official | 107:414e9c822e99 | 781 | * |
mbed_official | 107:414e9c822e99 | 782 | * \subsection adc_basic_use_case_setup_flow Workflow |
mbed_official | 107:414e9c822e99 | 783 | * -# Enable ADC Module: |
mbed_official | 107:414e9c822e99 | 784 | * - \code adc_enable(); \endcode |
mbed_official | 107:414e9c822e99 | 785 | * -# Get the ADC default configurations: |
mbed_official | 107:414e9c822e99 | 786 | * - \code adc_get_config_defaults(&adc_cfg); \endcode |
mbed_official | 107:414e9c822e99 | 787 | * -# Initialize the ADC Module: |
mbed_official | 107:414e9c822e99 | 788 | * - \code adc_init(ADC, &adc_cfg); \endcode |
mbed_official | 107:414e9c822e99 | 789 | * -# Configure conversion trigger and free run mode: |
mbed_official | 107:414e9c822e99 | 790 | * - \code adc_set_trigger(ADC, ADC_TRIG_SW); \endcode |
mbed_official | 107:414e9c822e99 | 791 | * -# Enable Channel: |
mbed_official | 107:414e9c822e99 | 792 | * - \code adc_channel_enable(ADC, ADC_CHANNEL_1); \endcode |
mbed_official | 107:414e9c822e99 | 793 | * |
mbed_official | 107:414e9c822e99 | 794 | * \section adc_basic_use_case_usage Usage steps |
mbed_official | 107:414e9c822e99 | 795 | * \subsection adc_basic_use_case_usage_code Example code |
mbed_official | 107:414e9c822e99 | 796 | * Add to, e.g., main loop in application C-file: |
mbed_official | 107:414e9c822e99 | 797 | * \code |
mbed_official | 107:414e9c822e99 | 798 | adc_start_software_conversion(ADC); |
mbed_official | 107:414e9c822e99 | 799 | while (adc_get_interrupt_status(ADC) & (1 << ADC_CHANNEL_1)); |
mbed_official | 107:414e9c822e99 | 800 | uint32_t result = adc_channel_get_value(ADC, ADC_CHANNEL_1); |
mbed_official | 107:414e9c822e99 | 801 | \endcode |
mbed_official | 107:414e9c822e99 | 802 | * |
mbed_official | 107:414e9c822e99 | 803 | * \subsection adc_basic_use_case_usage_flow Workflow |
mbed_official | 107:414e9c822e99 | 804 | * -# Start ADC conversion on channel: |
mbed_official | 107:414e9c822e99 | 805 | * - \code adc_start_software_conversion(ADC); \endcode |
mbed_official | 107:414e9c822e99 | 806 | * -# Wait for the conversion over: |
mbed_official | 107:414e9c822e99 | 807 | * - \code while (adc_get_interrupt_status(ADC) & (1 << ADC_CHANNEL_1)); |
mbed_official | 107:414e9c822e99 | 808 | \endcode |
mbed_official | 107:414e9c822e99 | 809 | * -# Get the conversion result: |
mbed_official | 107:414e9c822e99 | 810 | * - \code uint32_t result = adc_channel_get_value(ADC, ADC_CHANNEL_1); |
mbed_official | 107:414e9c822e99 | 811 | \endcode |
mbed_official | 107:414e9c822e99 | 812 | */ |
mbed_official | 107:414e9c822e99 | 813 | #endif /* ADC2_H_INCLUDED */ |