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:
119:3921aeca8633
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 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 }