added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

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?

UserRevisionLine numberNew 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 */