mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
187:0387e8f68319
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 187:0387e8f68319 1 /* mbed Microcontroller Library
AnnaBridge 187:0387e8f68319 2 * Copyright (c) 2017-2018 Nuvoton
AnnaBridge 187:0387e8f68319 3 *
AnnaBridge 187:0387e8f68319 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 187:0387e8f68319 5 * you may not use this file except in compliance with the License.
AnnaBridge 187:0387e8f68319 6 * You may obtain a copy of the License at
AnnaBridge 187:0387e8f68319 7 *
AnnaBridge 187:0387e8f68319 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 187:0387e8f68319 9 *
AnnaBridge 187:0387e8f68319 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 187:0387e8f68319 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 187:0387e8f68319 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 187:0387e8f68319 13 * See the License for the specific language governing permissions and
AnnaBridge 187:0387e8f68319 14 * limitations under the License.
AnnaBridge 187:0387e8f68319 15 */
AnnaBridge 187:0387e8f68319 16
AnnaBridge 187:0387e8f68319 17 #include "analogin_api.h"
AnnaBridge 187:0387e8f68319 18
AnnaBridge 187:0387e8f68319 19 #if DEVICE_ANALOGIN
AnnaBridge 187:0387e8f68319 20
AnnaBridge 187:0387e8f68319 21 #include "cmsis.h"
AnnaBridge 187:0387e8f68319 22 #include "pinmap.h"
AnnaBridge 187:0387e8f68319 23 #include "PeripheralPins.h"
AnnaBridge 187:0387e8f68319 24 #include "nu_modutil.h"
AnnaBridge 187:0387e8f68319 25
AnnaBridge 187:0387e8f68319 26 static uint32_t eadc_modinit_mask = 0;
AnnaBridge 187:0387e8f68319 27
AnnaBridge 187:0387e8f68319 28 static const struct nu_modinit_s adc_modinit_tab[] = {
AnnaBridge 187:0387e8f68319 29 {ADC_0_0, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 30 {ADC_0_1, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 31 {ADC_0_2, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 32 {ADC_0_3, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 33 {ADC_0_4, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 34 {ADC_0_5, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 35 {ADC_0_6, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 36 {ADC_0_7, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 37 {ADC_0_8, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 38 {ADC_0_9, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 39 {ADC_0_10, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 40 {ADC_0_11, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 41 {ADC_0_12, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 42 {ADC_0_13, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 43 {ADC_0_14, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 44 {ADC_0_15, EADC_MODULE, 0, CLK_CLKDIV0_EADC(8), EADC_RST, EADC0_IRQn, NULL},
AnnaBridge 187:0387e8f68319 45 };
AnnaBridge 187:0387e8f68319 46
AnnaBridge 187:0387e8f68319 47 void analogin_init(analogin_t *obj, PinName pin)
AnnaBridge 187:0387e8f68319 48 {
AnnaBridge 187:0387e8f68319 49 obj->adc = (ADCName) pinmap_peripheral(pin, PinMap_ADC);
AnnaBridge 187:0387e8f68319 50 MBED_ASSERT(obj->adc != (ADCName) NC);
AnnaBridge 187:0387e8f68319 51
AnnaBridge 187:0387e8f68319 52 const struct nu_modinit_s *modinit = get_modinit(obj->adc, adc_modinit_tab);
AnnaBridge 187:0387e8f68319 53 MBED_ASSERT(modinit != NULL);
AnnaBridge 187:0387e8f68319 54 MBED_ASSERT(modinit->modname == (int) obj->adc);
AnnaBridge 187:0387e8f68319 55
AnnaBridge 187:0387e8f68319 56 EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);
AnnaBridge 187:0387e8f68319 57
AnnaBridge 187:0387e8f68319 58 // NOTE: All channels (identified by ADCName) share a ADC module. This reset will also affect other channels of the same ADC module.
AnnaBridge 187:0387e8f68319 59 if (! eadc_modinit_mask) {
AnnaBridge 187:0387e8f68319 60 /* Reset module
AnnaBridge 187:0387e8f68319 61 *
AnnaBridge 187:0387e8f68319 62 * NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
AnnaBridge 187:0387e8f68319 63 */
AnnaBridge 187:0387e8f68319 64 SYS_ResetModule_S(modinit->rsetidx);
AnnaBridge 187:0387e8f68319 65
AnnaBridge 187:0387e8f68319 66 /* Select IP clock source
AnnaBridge 187:0387e8f68319 67 *
AnnaBridge 187:0387e8f68319 68 * NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
AnnaBridge 187:0387e8f68319 69 */
AnnaBridge 187:0387e8f68319 70 CLK_SetModuleClock_S(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
AnnaBridge 187:0387e8f68319 71
AnnaBridge 187:0387e8f68319 72 /* Enable IP clock
AnnaBridge 187:0387e8f68319 73 *
AnnaBridge 187:0387e8f68319 74 * NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
AnnaBridge 187:0387e8f68319 75 */
AnnaBridge 187:0387e8f68319 76 CLK_EnableModuleClock_S(modinit->clkidx);
AnnaBridge 187:0387e8f68319 77
AnnaBridge 187:0387e8f68319 78 // Set the ADC internal sampling time, input mode as single-end and enable the A/D converter
AnnaBridge 187:0387e8f68319 79 EADC_Open(eadc_base, EADC_CTL_DIFFEN_SINGLE_END);
AnnaBridge 187:0387e8f68319 80 }
AnnaBridge 187:0387e8f68319 81
AnnaBridge 187:0387e8f68319 82 uint32_t chn = NU_MODSUBINDEX(obj->adc);
AnnaBridge 187:0387e8f68319 83
AnnaBridge 187:0387e8f68319 84 // Wire pinout
AnnaBridge 187:0387e8f68319 85 pinmap_pinout(pin, PinMap_ADC);
AnnaBridge 187:0387e8f68319 86
AnnaBridge 187:0387e8f68319 87 // Configure the sample module Nmod for analog input channel Nch and software trigger source
AnnaBridge 187:0387e8f68319 88 EADC_ConfigSampleModule(eadc_base, chn, EADC_SOFTWARE_TRIGGER, chn);
AnnaBridge 187:0387e8f68319 89
AnnaBridge 187:0387e8f68319 90 eadc_modinit_mask |= 1 << chn;
AnnaBridge 187:0387e8f68319 91 }
AnnaBridge 187:0387e8f68319 92
AnnaBridge 187:0387e8f68319 93 uint16_t analogin_read_u16(analogin_t *obj)
AnnaBridge 187:0387e8f68319 94 {
AnnaBridge 187:0387e8f68319 95 EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);
AnnaBridge 187:0387e8f68319 96 uint32_t chn = NU_MODSUBINDEX(obj->adc);
AnnaBridge 187:0387e8f68319 97
AnnaBridge 187:0387e8f68319 98 EADC_START_CONV(eadc_base, 1 << chn);
AnnaBridge 187:0387e8f68319 99 while (EADC_GET_DATA_VALID_FLAG(eadc_base, 1 << chn) != ((uint32_t) (1 << chn)));
AnnaBridge 187:0387e8f68319 100 uint16_t conv_res_12 = EADC_GET_CONV_DATA(eadc_base, chn);
AnnaBridge 187:0387e8f68319 101 // Just 12 bits are effective. Convert to 16 bits.
AnnaBridge 187:0387e8f68319 102 // conv_res_12: 0000 b11b10b9b8 b7b6b5b4 b3b2b1b0
AnnaBridge 187:0387e8f68319 103 // conv_res_16: b11b10b9b8 b7b6b5b4 b3b2b1b0 b11b10b9b8
AnnaBridge 187:0387e8f68319 104 uint16_t conv_res_16 = (conv_res_12 << 4) | (conv_res_12 >> 8);
AnnaBridge 187:0387e8f68319 105
AnnaBridge 187:0387e8f68319 106 return conv_res_16;
AnnaBridge 187:0387e8f68319 107 }
AnnaBridge 187:0387e8f68319 108
AnnaBridge 187:0387e8f68319 109 float analogin_read(analogin_t *obj)
AnnaBridge 187:0387e8f68319 110 {
AnnaBridge 187:0387e8f68319 111 uint16_t value = analogin_read_u16(obj);
AnnaBridge 187:0387e8f68319 112 return (float) value * (1.0f / (float) 0xFFFF);
AnnaBridge 187:0387e8f68319 113 }
AnnaBridge 187:0387e8f68319 114
AnnaBridge 187:0387e8f68319 115 #endif