mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Wed Nov 04 16:30:11 2015 +0000
Revision:
15:a81a8d6c1dfe
Child:
18:da299f395b9e
Synchronized with git revision 46af745ef4405614c3fa49abbd9a706a362ea514

Full URL: https://github.com/mbedmicro/mbed/commit/46af745ef4405614c3fa49abbd9a706a362ea514/

Renamed TARGET_SAM_CortexM0+ to TARGET_SAM_CortexM0P for compatiblity with online compiler

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 15:a81a8d6c1dfe 1 /* mbed Microcontroller Library
mbed_official 15:a81a8d6c1dfe 2 * Copyright (c) 2006-2015 ARM Limited
mbed_official 15:a81a8d6c1dfe 3 *
mbed_official 15:a81a8d6c1dfe 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 15:a81a8d6c1dfe 5 * you may not use this file except in compliance with the License.
mbed_official 15:a81a8d6c1dfe 6 * You may obtain a copy of the License at
mbed_official 15:a81a8d6c1dfe 7 *
mbed_official 15:a81a8d6c1dfe 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 15:a81a8d6c1dfe 9 *
mbed_official 15:a81a8d6c1dfe 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 15:a81a8d6c1dfe 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 15:a81a8d6c1dfe 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 15:a81a8d6c1dfe 13 * See the License for the specific language governing permissions and
mbed_official 15:a81a8d6c1dfe 14 * limitations under the License.
mbed_official 15:a81a8d6c1dfe 15 */
mbed_official 15:a81a8d6c1dfe 16 #include "mbed_assert.h"
mbed_official 15:a81a8d6c1dfe 17 #include "analogin_api.h"
mbed_official 15:a81a8d6c1dfe 18
mbed_official 15:a81a8d6c1dfe 19 #include "cmsis.h"
mbed_official 15:a81a8d6c1dfe 20 #include "pinmap.h"
mbed_official 15:a81a8d6c1dfe 21 #include "PeripheralPins.h"
mbed_official 15:a81a8d6c1dfe 22 #include "adc.h"
mbed_official 15:a81a8d6c1dfe 23 #include "status_codes.h"
mbed_official 15:a81a8d6c1dfe 24
mbed_official 15:a81a8d6c1dfe 25 extern uint8_t g_sys_init;
mbed_official 15:a81a8d6c1dfe 26 struct adc_module adc_instance;
mbed_official 15:a81a8d6c1dfe 27
mbed_official 15:a81a8d6c1dfe 28 void adc_configure_ain_pin(uint32_t pin)
mbed_official 15:a81a8d6c1dfe 29 {
mbed_official 15:a81a8d6c1dfe 30 #define PIN_INVALID_ADC_AIN 0xFFFFUL
mbed_official 15:a81a8d6c1dfe 31
mbed_official 15:a81a8d6c1dfe 32 /* Pinmapping table for AINxx -> GPIO pin number */
mbed_official 15:a81a8d6c1dfe 33 const uint32_t pinmapping[] = {
mbed_official 15:a81a8d6c1dfe 34 #if (SAMD20E | SAMD21E)
mbed_official 15:a81a8d6c1dfe 35 PIN_PA02B_ADC_AIN0, PIN_PA03B_ADC_AIN1,
mbed_official 15:a81a8d6c1dfe 36 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 37 PIN_PA04B_ADC_AIN4, PIN_PA05B_ADC_AIN5,
mbed_official 15:a81a8d6c1dfe 38 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 15:a81a8d6c1dfe 39 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 40 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 41 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 42 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 43 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 15:a81a8d6c1dfe 44 PIN_PA10B_ADC_AIN18, PIN_PA11B_ADC_AIN19,
mbed_official 15:a81a8d6c1dfe 45 #elif (SAMD20G | SAMD21G)
mbed_official 15:a81a8d6c1dfe 46 PIN_PA02B_ADC_AIN0, PIN_PA03B_ADC_AIN1,
mbed_official 15:a81a8d6c1dfe 47 PIN_PB08B_ADC_AIN2, PIN_PB09B_ADC_AIN3,
mbed_official 15:a81a8d6c1dfe 48 PIN_PA04B_ADC_AIN4, PIN_PA05B_ADC_AIN5,
mbed_official 15:a81a8d6c1dfe 49 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 15:a81a8d6c1dfe 50 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 51 PIN_PB02B_ADC_AIN10, PIN_PB03B_ADC_AIN11,
mbed_official 15:a81a8d6c1dfe 52 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 53 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 54 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 15:a81a8d6c1dfe 55 PIN_PA10B_ADC_AIN18, PIN_PA11B_ADC_AIN19,
mbed_official 15:a81a8d6c1dfe 56 #elif (SAMD20J | SAMD21J)
mbed_official 15:a81a8d6c1dfe 57 PIN_PA02B_ADC_AIN0, PIN_PA03B_ADC_AIN1,
mbed_official 15:a81a8d6c1dfe 58 PIN_PB08B_ADC_AIN2, PIN_PB09B_ADC_AIN3,
mbed_official 15:a81a8d6c1dfe 59 PIN_PA04B_ADC_AIN4, PIN_PA05B_ADC_AIN5,
mbed_official 15:a81a8d6c1dfe 60 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 15:a81a8d6c1dfe 61 PIN_PB00B_ADC_AIN8, PIN_PB01B_ADC_AIN9,
mbed_official 15:a81a8d6c1dfe 62 PIN_PB02B_ADC_AIN10, PIN_PB03B_ADC_AIN11,
mbed_official 15:a81a8d6c1dfe 63 PIN_PB04B_ADC_AIN12, PIN_PB05B_ADC_AIN13,
mbed_official 15:a81a8d6c1dfe 64 PIN_PB06B_ADC_AIN14, PIN_PB07B_ADC_AIN15,
mbed_official 15:a81a8d6c1dfe 65 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 15:a81a8d6c1dfe 66 PIN_PA10B_ADC_AIN18, PIN_PA11B_ADC_AIN19,
mbed_official 15:a81a8d6c1dfe 67 #elif SAMR21E
mbed_official 15:a81a8d6c1dfe 68 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 69 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 70 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 71 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 15:a81a8d6c1dfe 72 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 73 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 74 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 75 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 76 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 15:a81a8d6c1dfe 77 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 78 #elif SAMR21G
mbed_official 15:a81a8d6c1dfe 79 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 80 PIN_PB08B_ADC_AIN2, PIN_PB09B_ADC_AIN3,
mbed_official 15:a81a8d6c1dfe 81 PIN_PA04B_ADC_AIN4, PIN_PA05B_ADC_AIN5,
mbed_official 15:a81a8d6c1dfe 82 PIN_PA06B_ADC_AIN6, PIN_PA07B_ADC_AIN7,
mbed_official 15:a81a8d6c1dfe 83 PIN_PB00B_ADC_AIN8, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 84 PIN_PB02B_ADC_AIN10, PIN_PB03B_ADC_AIN11,
mbed_official 15:a81a8d6c1dfe 85 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 86 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 87 PIN_PA08B_ADC_AIN16, PIN_PA09B_ADC_AIN17,
mbed_official 15:a81a8d6c1dfe 88 PIN_PA10B_ADC_AIN18, PIN_PA11B_ADC_AIN19,
mbed_official 15:a81a8d6c1dfe 89 #elif (SAMD10C | SAMD11C)
mbed_official 15:a81a8d6c1dfe 90 PIN_PA02B_ADC_AIN0, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 91 PIN_PA04B_ADC_AIN2, PIN_PA05B_ADC_AIN3,
mbed_official 15:a81a8d6c1dfe 92 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 93 PIN_PA14B_ADC_AIN6, PIN_PA15B_ADC_AIN7,
mbed_official 15:a81a8d6c1dfe 94 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 95 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 96 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 97 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 98 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 99 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 100 #elif (SAMD10DS | SAMD11DS)
mbed_official 15:a81a8d6c1dfe 101 PIN_PA02B_ADC_AIN0, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 102 PIN_PA04B_ADC_AIN2, PIN_PA05B_ADC_AIN3,
mbed_official 15:a81a8d6c1dfe 103 PIN_PA06B_ADC_AIN4, PIN_PA07B_ADC_AIN5,
mbed_official 15:a81a8d6c1dfe 104 PIN_PA14B_ADC_AIN6, PIN_PA15B_ADC_AIN7,
mbed_official 15:a81a8d6c1dfe 105 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 106 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 107 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 108 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 109 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 110 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 111 #elif (SAMD10DM | SAMD11DM)
mbed_official 15:a81a8d6c1dfe 112 PIN_PA02B_ADC_AIN0, PIN_PA03B_ADC_AIN1,
mbed_official 15:a81a8d6c1dfe 113 PIN_PA04B_ADC_AIN2, PIN_PA05B_ADC_AIN3,
mbed_official 15:a81a8d6c1dfe 114 PIN_PA06B_ADC_AIN4, PIN_PA07B_ADC_AIN5,
mbed_official 15:a81a8d6c1dfe 115 PIN_PA14B_ADC_AIN6, PIN_PA15B_ADC_AIN7,
mbed_official 15:a81a8d6c1dfe 116 PIN_PA10B_ADC_AIN8, PIN_PA11B_ADC_AIN9,
mbed_official 15:a81a8d6c1dfe 117 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 118 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 119 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 120 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 121 PIN_INVALID_ADC_AIN, PIN_INVALID_ADC_AIN,
mbed_official 15:a81a8d6c1dfe 122 #else
mbed_official 15:a81a8d6c1dfe 123 # error ADC pin mappings are not defined for this device.
mbed_official 15:a81a8d6c1dfe 124 #endif
mbed_official 15:a81a8d6c1dfe 125 };
mbed_official 15:a81a8d6c1dfe 126
mbed_official 15:a81a8d6c1dfe 127 uint32_t pin_map_result = PIN_INVALID_ADC_AIN;
mbed_official 15:a81a8d6c1dfe 128
mbed_official 15:a81a8d6c1dfe 129 if (pin <= ADC_EXTCHANNEL_MSB) {
mbed_official 15:a81a8d6c1dfe 130 pin_map_result = pinmapping[pin >> ADC_INPUTCTRL_MUXPOS_Pos];
mbed_official 15:a81a8d6c1dfe 131
mbed_official 15:a81a8d6c1dfe 132 Assert(pin_map_result != PIN_INVALID_ADC_AIN);
mbed_official 15:a81a8d6c1dfe 133
mbed_official 15:a81a8d6c1dfe 134 struct system_pinmux_config config;
mbed_official 15:a81a8d6c1dfe 135 system_pinmux_get_config_defaults(&config);
mbed_official 15:a81a8d6c1dfe 136
mbed_official 15:a81a8d6c1dfe 137 /* Analog functions are all on MUX setting B */
mbed_official 15:a81a8d6c1dfe 138 config.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
mbed_official 15:a81a8d6c1dfe 139 config.mux_position = 1;
mbed_official 15:a81a8d6c1dfe 140
mbed_official 15:a81a8d6c1dfe 141 system_pinmux_pin_set_config(pin_map_result, &config);
mbed_official 15:a81a8d6c1dfe 142 }
mbed_official 15:a81a8d6c1dfe 143 }
mbed_official 15:a81a8d6c1dfe 144
mbed_official 15:a81a8d6c1dfe 145 void analogin_init(analogin_t *obj, PinName pin)
mbed_official 15:a81a8d6c1dfe 146 {
mbed_official 15:a81a8d6c1dfe 147 MBED_ASSERT(obj);
mbed_official 15:a81a8d6c1dfe 148 if (g_sys_init == 0) {
mbed_official 15:a81a8d6c1dfe 149 system_init();
mbed_official 15:a81a8d6c1dfe 150 g_sys_init = 1;
mbed_official 15:a81a8d6c1dfe 151 }
mbed_official 15:a81a8d6c1dfe 152 uint32_t pos_input;
mbed_official 15:a81a8d6c1dfe 153 static uint8_t init_flag = 0;
mbed_official 15:a81a8d6c1dfe 154
mbed_official 15:a81a8d6c1dfe 155 pos_input = pinmap_find_peripheral(pin, PinMap_ADC);
mbed_official 15:a81a8d6c1dfe 156 MBED_ASSERT(pos_input != NC);
mbed_official 15:a81a8d6c1dfe 157
mbed_official 15:a81a8d6c1dfe 158 adc_get_config_defaults(&(obj->config_adc));
mbed_official 15:a81a8d6c1dfe 159 obj->config_adc.positive_input = pos_input;
mbed_official 15:a81a8d6c1dfe 160 if (init_flag == 0) { // ADC init and enable to be done only once.
mbed_official 15:a81a8d6c1dfe 161 adc_init(&adc_instance, ADC, &(obj->config_adc));
mbed_official 15:a81a8d6c1dfe 162 adc_enable(&adc_instance);
mbed_official 15:a81a8d6c1dfe 163 init_flag = 1;
mbed_official 15:a81a8d6c1dfe 164 }
mbed_official 15:a81a8d6c1dfe 165 adc_configure_ain_pin(obj->config_adc.positive_input);
mbed_official 15:a81a8d6c1dfe 166 adc_configure_ain_pin(obj->config_adc.negative_input);
mbed_official 15:a81a8d6c1dfe 167 }
mbed_official 15:a81a8d6c1dfe 168
mbed_official 15:a81a8d6c1dfe 169 uint16_t analogin_read_u16(analogin_t *obj)
mbed_official 15:a81a8d6c1dfe 170 {
mbed_official 15:a81a8d6c1dfe 171 MBED_ASSERT(obj);
mbed_official 15:a81a8d6c1dfe 172 uint16_t result;
mbed_official 15:a81a8d6c1dfe 173 adc_set_positive_input(&adc_instance, obj->config_adc.positive_input);
mbed_official 15:a81a8d6c1dfe 174 adc_set_negative_input(&adc_instance, obj->config_adc.negative_input);
mbed_official 15:a81a8d6c1dfe 175 adc_start_conversion(&adc_instance);
mbed_official 15:a81a8d6c1dfe 176 do {
mbed_official 15:a81a8d6c1dfe 177 } while(adc_read(&(adc_instance), &result) == STATUS_BUSY); // 12 bit value
mbed_official 15:a81a8d6c1dfe 178
mbed_official 15:a81a8d6c1dfe 179 return (uint16_t)(((uint32_t)result * 0xFFFF) / 0x0FFF); // for normalizing to 16 bit value
mbed_official 15:a81a8d6c1dfe 180 }
mbed_official 15:a81a8d6c1dfe 181
mbed_official 15:a81a8d6c1dfe 182 float analogin_read(analogin_t *obj)
mbed_official 15:a81a8d6c1dfe 183 {
mbed_official 15:a81a8d6c1dfe 184 MBED_ASSERT(obj);
mbed_official 15:a81a8d6c1dfe 185 uint16_t value = analogin_read_u16(obj);
mbed_official 15:a81a8d6c1dfe 186 return (float)value * (1.0f / (float)0xFFFF);
mbed_official 15:a81a8d6c1dfe 187 }
mbed_official 15:a81a8d6c1dfe 188