added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Fri Apr 29 01:15:11 2016 +0100
Revision:
119:3921aeca8633
Synchronized with git revision fe9720f24b1adc71ab6962506ec51290f6afd270

Full URL: https://github.com/mbedmicro/mbed/commit/fe9720f24b1adc71ab6962506ec51290f6afd270/

[Renesas RZ/A1H] Enable asynchronous communications

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 119:3921aeca8633 1 /* mbed Microcontroller Library
mbed_official 119:3921aeca8633 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 119:3921aeca8633 3 *
mbed_official 119:3921aeca8633 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 119:3921aeca8633 5 * you may not use this file except in compliance with the License.
mbed_official 119:3921aeca8633 6 * You may obtain a copy of the License at
mbed_official 119:3921aeca8633 7 *
mbed_official 119:3921aeca8633 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 119:3921aeca8633 9 *
mbed_official 119:3921aeca8633 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 119:3921aeca8633 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 119:3921aeca8633 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 119:3921aeca8633 13 * See the License for the specific language governing permissions and
mbed_official 119:3921aeca8633 14 * limitations under the License.
mbed_official 119:3921aeca8633 15 */
mbed_official 119:3921aeca8633 16 #include "mbed_assert.h"
mbed_official 119:3921aeca8633 17 #include "analogin_api.h"
mbed_official 119:3921aeca8633 18
mbed_official 119:3921aeca8633 19 #include "cmsis.h"
mbed_official 119:3921aeca8633 20 #include "pinmap.h"
mbed_official 119:3921aeca8633 21
mbed_official 119:3921aeca8633 22 #include "adc_iodefine.h"
mbed_official 119:3921aeca8633 23 #include "cpg_iodefine.h"
mbed_official 119:3921aeca8633 24
mbed_official 119:3921aeca8633 25 #define ANALOGIN_MEDIAN_FILTER 0
mbed_official 119:3921aeca8633 26
mbed_official 119:3921aeca8633 27 #ifdef MAX_PERI
mbed_official 119:3921aeca8633 28 static const PinMap PinMap_ADC[] = {
mbed_official 119:3921aeca8633 29 {P1_8, AN0, 1},
mbed_official 119:3921aeca8633 30 {P1_9, AN1, 1},
mbed_official 119:3921aeca8633 31 {P1_10, AN2, 1},
mbed_official 119:3921aeca8633 32 {P1_11, AN3, 1},
mbed_official 119:3921aeca8633 33 {P1_12, AN4, 1},
mbed_official 119:3921aeca8633 34 {P1_13, AN5, 1},
mbed_official 119:3921aeca8633 35 {P1_14, AN6, 1},
mbed_official 119:3921aeca8633 36 {P1_15, AN7, 1},
mbed_official 119:3921aeca8633 37 {NC, NC, 0}
mbed_official 119:3921aeca8633 38 };
mbed_official 119:3921aeca8633 39 #else
mbed_official 119:3921aeca8633 40 static const PinMap PinMap_ADC[] = {
mbed_official 119:3921aeca8633 41 {P1_8, AN0, 1},
mbed_official 119:3921aeca8633 42 {P1_9, AN1, 1},
mbed_official 119:3921aeca8633 43 {P1_10, AN2, 1},
mbed_official 119:3921aeca8633 44 {P1_11, AN3, 1},
mbed_official 119:3921aeca8633 45 {P1_12, AN4, 1},
mbed_official 119:3921aeca8633 46 {P1_13, AN5, 1},
mbed_official 119:3921aeca8633 47 {P1_15, AN7, 1},
mbed_official 119:3921aeca8633 48 {NC, NC, 0}
mbed_official 119:3921aeca8633 49 };
mbed_official 119:3921aeca8633 50 #endif
mbed_official 119:3921aeca8633 51
mbed_official 119:3921aeca8633 52 static volatile uint16_t *ADCDR[] = {
mbed_official 119:3921aeca8633 53 &ADCADDRA,
mbed_official 119:3921aeca8633 54 &ADCADDRB,
mbed_official 119:3921aeca8633 55 &ADCADDRC,
mbed_official 119:3921aeca8633 56 &ADCADDRD,
mbed_official 119:3921aeca8633 57 &ADCADDRE,
mbed_official 119:3921aeca8633 58 &ADCADDRF,
mbed_official 119:3921aeca8633 59 &ADCADDRG,
mbed_official 119:3921aeca8633 60 &ADCADDRH,
mbed_official 119:3921aeca8633 61 };
mbed_official 119:3921aeca8633 62
mbed_official 119:3921aeca8633 63 void analogin_init(analogin_t *obj, PinName pin) {
mbed_official 119:3921aeca8633 64 obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
mbed_official 119:3921aeca8633 65 MBED_ASSERT(obj->adc != (ADCName)NC);
mbed_official 119:3921aeca8633 66
mbed_official 119:3921aeca8633 67 CPGSTBCR3 &= ~(1 << 1);
mbed_official 119:3921aeca8633 68 CPGSTBCR6 &= ~(1 << 7);
mbed_official 119:3921aeca8633 69
mbed_official 119:3921aeca8633 70 // 15: ADF 14: ADIE 13: ADST, [12:9] TRGS..0
mbed_official 119:3921aeca8633 71 // [8:6] CKS 010 :: 340tclk
mbed_official 119:3921aeca8633 72 // [5:3] MDS 000 :: single mode
mbed_official 119:3921aeca8633 73 // [2:0] CH 000 :: AN0
mbed_official 119:3921aeca8633 74 ADCADCSR = 0x0080;
mbed_official 119:3921aeca8633 75
mbed_official 119:3921aeca8633 76 pinmap_pinout(pin, PinMap_ADC);
mbed_official 119:3921aeca8633 77 }
mbed_official 119:3921aeca8633 78
mbed_official 119:3921aeca8633 79 static inline uint32_t adc_read(analogin_t *obj) {
mbed_official 119:3921aeca8633 80 volatile uint16_t data;
mbed_official 119:3921aeca8633 81
mbed_official 119:3921aeca8633 82 // Select the appropriate channel and start conversion
mbed_official 119:3921aeca8633 83 ADCADCSR &= 0xfff8;
mbed_official 119:3921aeca8633 84 ADCADCSR |= (1 << 13 | (obj->adc & 0x7));
mbed_official 119:3921aeca8633 85
mbed_official 119:3921aeca8633 86 // Wait end of conversion
mbed_official 119:3921aeca8633 87 do {
mbed_official 119:3921aeca8633 88 data = ADCADCSR;
mbed_official 119:3921aeca8633 89 } while (((data & (1 << 15)) == 0) || ((data & (1 << 13)) != 0));
mbed_official 119:3921aeca8633 90
mbed_official 119:3921aeca8633 91 // clear flag
mbed_official 119:3921aeca8633 92 ADCADCSR &= ~(1 << 15);
mbed_official 119:3921aeca8633 93
mbed_official 119:3921aeca8633 94 return ((*(ADCDR[obj->adc])) >> 4) & 0x0FFF; // 12 bits range
mbed_official 119:3921aeca8633 95 }
mbed_official 119:3921aeca8633 96
mbed_official 119:3921aeca8633 97 #if ANALOGIN_MEDIAN_FILTER
mbed_official 119:3921aeca8633 98 static inline void order(uint32_t *a, uint32_t *b) {
mbed_official 119:3921aeca8633 99 if (*a > *b) {
mbed_official 119:3921aeca8633 100 uint32_t t = *a;
mbed_official 119:3921aeca8633 101 *a = *b;
mbed_official 119:3921aeca8633 102 *b = t;
mbed_official 119:3921aeca8633 103 }
mbed_official 119:3921aeca8633 104 }
mbed_official 119:3921aeca8633 105 #endif
mbed_official 119:3921aeca8633 106
mbed_official 119:3921aeca8633 107 static inline uint32_t adc_read_u32(analogin_t *obj) {
mbed_official 119:3921aeca8633 108 uint32_t value;
mbed_official 119:3921aeca8633 109 #if ANALOGIN_MEDIAN_FILTER
mbed_official 119:3921aeca8633 110 uint32_t v1 = adc_read(obj);
mbed_official 119:3921aeca8633 111 uint32_t v2 = adc_read(obj);
mbed_official 119:3921aeca8633 112 uint32_t v3 = adc_read(obj);
mbed_official 119:3921aeca8633 113 order(&v1, &v2);
mbed_official 119:3921aeca8633 114 order(&v2, &v3);
mbed_official 119:3921aeca8633 115 order(&v1, &v2);
mbed_official 119:3921aeca8633 116 value = v2;
mbed_official 119:3921aeca8633 117 #else
mbed_official 119:3921aeca8633 118 value = adc_read(obj);
mbed_official 119:3921aeca8633 119 #endif
mbed_official 119:3921aeca8633 120 return value;
mbed_official 119:3921aeca8633 121 }
mbed_official 119:3921aeca8633 122
mbed_official 119:3921aeca8633 123 uint16_t analogin_read_u16(analogin_t *obj) {
mbed_official 119:3921aeca8633 124 uint32_t value = adc_read_u32(obj);
mbed_official 119:3921aeca8633 125
mbed_official 119:3921aeca8633 126 return (value << 4) | ((value >> 8) & 0x000F); // 12-bit to 16-bit conversion
mbed_official 119:3921aeca8633 127 }
mbed_official 119:3921aeca8633 128
mbed_official 119:3921aeca8633 129 float analogin_read(analogin_t *obj) {
mbed_official 119:3921aeca8633 130 uint32_t value = adc_read_u32(obj);
mbed_official 119:3921aeca8633 131
mbed_official 119:3921aeca8633 132 return (float)value * (1.0f / (float)0x0FFF); // 12 bits range
mbed_official 119:3921aeca8633 133 }