mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Fri Sep 11 09:30:09 2015 +0100
Revision:
621:9c82b0f79f3d
Parent:
554:edd95c0879f8
Synchronized with git revision 6c1d63e069ab9bd86de92e8296ca783681257538

Full URL: https://github.com/mbedmicro/mbed/commit/6c1d63e069ab9bd86de92e8296ca783681257538/

ignore target files not supported by the yotta module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 554:edd95c0879f8 1 /* mbed Microcontroller Library
mbed_official 554:edd95c0879f8 2 * Copyright (c) 2006-2015 ARM Limited
mbed_official 554:edd95c0879f8 3 *
mbed_official 554:edd95c0879f8 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 554:edd95c0879f8 5 * you may not use this file except in compliance with the License.
mbed_official 554:edd95c0879f8 6 * You may obtain a copy of the License at
mbed_official 554:edd95c0879f8 7 *
mbed_official 554:edd95c0879f8 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 554:edd95c0879f8 9 *
mbed_official 554:edd95c0879f8 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 554:edd95c0879f8 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 554:edd95c0879f8 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 554:edd95c0879f8 13 * See the License for the specific language governing permissions and
mbed_official 554:edd95c0879f8 14 * limitations under the License.
mbed_official 554:edd95c0879f8 15 */
mbed_official 554:edd95c0879f8 16 #include "mbed_assert.h"
mbed_official 554:edd95c0879f8 17 #include "pwmout_api.h"
mbed_official 554:edd95c0879f8 18 #include "cmsis.h"
mbed_official 554:edd95c0879f8 19 #include "pinmap.h"
mbed_official 554:edd95c0879f8 20
mbed_official 554:edd95c0879f8 21 #define TCR_CNT_EN 0x00000001
mbed_official 554:edd95c0879f8 22 #define TCR_RESET 0x00000002
mbed_official 554:edd95c0879f8 23
mbed_official 554:edd95c0879f8 24 // PORT ID, PWM ID, Pin function
mbed_official 554:edd95c0879f8 25 static const PinMap PinMap_PWM[] = {
mbed_official 554:edd95c0879f8 26 {P1_18, PWM_1, 2},
mbed_official 554:edd95c0879f8 27 {P1_20, PWM_2, 2},
mbed_official 554:edd95c0879f8 28 {P1_21, PWM_3, 2},
mbed_official 554:edd95c0879f8 29 {P1_23, PWM_4, 2},
mbed_official 554:edd95c0879f8 30 {P1_24, PWM_5, 2},
mbed_official 554:edd95c0879f8 31 {P1_26, PWM_6, 2},
mbed_official 554:edd95c0879f8 32 {P2_0 , PWM_1, 1},
mbed_official 554:edd95c0879f8 33 {P2_1 , PWM_2, 1},
mbed_official 554:edd95c0879f8 34 {P2_2 , PWM_3, 1},
mbed_official 554:edd95c0879f8 35 {P2_3 , PWM_4, 1},
mbed_official 554:edd95c0879f8 36 {P2_4 , PWM_5, 1},
mbed_official 554:edd95c0879f8 37 {P2_5 , PWM_6, 1},
mbed_official 554:edd95c0879f8 38 {P3_24, PWM_1, 3},
mbed_official 554:edd95c0879f8 39 {P3_25, PWM_2, 3},
mbed_official 554:edd95c0879f8 40 {P3_26, PWM_3, 3},
mbed_official 554:edd95c0879f8 41 {P3_27, PWM_4, 3},
mbed_official 554:edd95c0879f8 42 {P3_28, PWM_5, 3},
mbed_official 554:edd95c0879f8 43 {P3_29, PWM_6, 3},
mbed_official 554:edd95c0879f8 44 {NC, NC, 0}
mbed_official 554:edd95c0879f8 45 };
mbed_official 554:edd95c0879f8 46
mbed_official 554:edd95c0879f8 47 __IO uint32_t *PWM_MATCH[] = {
mbed_official 554:edd95c0879f8 48 &(LPC_PWM1->MR0),
mbed_official 554:edd95c0879f8 49 &(LPC_PWM1->MR1),
mbed_official 554:edd95c0879f8 50 &(LPC_PWM1->MR2),
mbed_official 554:edd95c0879f8 51 &(LPC_PWM1->MR3),
mbed_official 554:edd95c0879f8 52 &(LPC_PWM1->MR4),
mbed_official 554:edd95c0879f8 53 &(LPC_PWM1->MR5),
mbed_official 554:edd95c0879f8 54 &(LPC_PWM1->MR6)
mbed_official 554:edd95c0879f8 55 };
mbed_official 554:edd95c0879f8 56
mbed_official 554:edd95c0879f8 57 #define TCR_PWM_EN 0x00000008
mbed_official 554:edd95c0879f8 58
mbed_official 554:edd95c0879f8 59 static unsigned int pwm_clock_mhz;
mbed_official 554:edd95c0879f8 60
mbed_official 554:edd95c0879f8 61 void pwmout_init(pwmout_t* obj, PinName pin) {
mbed_official 554:edd95c0879f8 62 // determine the channel
mbed_official 554:edd95c0879f8 63 PWMName pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
mbed_official 554:edd95c0879f8 64 MBED_ASSERT(pwm != (PWMName)NC);
mbed_official 554:edd95c0879f8 65
mbed_official 554:edd95c0879f8 66 obj->pwm = pwm;
mbed_official 554:edd95c0879f8 67 obj->MR = PWM_MATCH[pwm];
mbed_official 554:edd95c0879f8 68
mbed_official 554:edd95c0879f8 69 // ensure the power is on
mbed_official 554:edd95c0879f8 70 LPC_SC->PCONP |= 1 << 6;
mbed_official 554:edd95c0879f8 71
mbed_official 554:edd95c0879f8 72 // ensure clock to /4
mbed_official 554:edd95c0879f8 73 LPC_SC->PCLKSEL0 &= ~(0x3 << 12); // pclk = /4
mbed_official 554:edd95c0879f8 74 LPC_PWM1->PR = 0; // no pre-scale
mbed_official 554:edd95c0879f8 75
mbed_official 554:edd95c0879f8 76 // ensure single PWM mode
mbed_official 554:edd95c0879f8 77 LPC_PWM1->MCR = 1 << 1; // reset TC on match 0
mbed_official 554:edd95c0879f8 78
mbed_official 554:edd95c0879f8 79 // enable the specific PWM output
mbed_official 554:edd95c0879f8 80 LPC_PWM1->PCR |= 1 << (8 + pwm);
mbed_official 554:edd95c0879f8 81
mbed_official 554:edd95c0879f8 82 pwm_clock_mhz = SystemCoreClock / 4000000;
mbed_official 554:edd95c0879f8 83
mbed_official 554:edd95c0879f8 84 // default to 20ms: standard for servos, and fine for e.g. brightness control
mbed_official 554:edd95c0879f8 85 pwmout_period_ms(obj, 20);
mbed_official 554:edd95c0879f8 86 pwmout_write (obj, 0);
mbed_official 554:edd95c0879f8 87
mbed_official 554:edd95c0879f8 88 // Wire pinout
mbed_official 554:edd95c0879f8 89 pinmap_pinout(pin, PinMap_PWM);
mbed_official 554:edd95c0879f8 90 }
mbed_official 554:edd95c0879f8 91
mbed_official 554:edd95c0879f8 92 void pwmout_free(pwmout_t* obj) {
mbed_official 554:edd95c0879f8 93 // [TODO]
mbed_official 554:edd95c0879f8 94 }
mbed_official 554:edd95c0879f8 95
mbed_official 554:edd95c0879f8 96 void pwmout_write(pwmout_t* obj, float value) {
mbed_official 554:edd95c0879f8 97 if (value < 0.0f) {
mbed_official 554:edd95c0879f8 98 value = 0.0;
mbed_official 554:edd95c0879f8 99 } else if (value > 1.0f) {
mbed_official 554:edd95c0879f8 100 value = 1.0;
mbed_official 554:edd95c0879f8 101 }
mbed_official 554:edd95c0879f8 102
mbed_official 554:edd95c0879f8 103 // set channel match to percentage
mbed_official 554:edd95c0879f8 104 uint32_t v = (uint32_t)((float)(LPC_PWM1->MR0) * value);
mbed_official 554:edd95c0879f8 105
mbed_official 554:edd95c0879f8 106 // workaround for PWM1[1] - Never make it equal MR0, else we get 1 cycle dropout
mbed_official 554:edd95c0879f8 107 if (v == LPC_PWM1->MR0) {
mbed_official 554:edd95c0879f8 108 v++;
mbed_official 554:edd95c0879f8 109 }
mbed_official 554:edd95c0879f8 110
mbed_official 554:edd95c0879f8 111 *obj->MR = v;
mbed_official 554:edd95c0879f8 112
mbed_official 554:edd95c0879f8 113 // accept on next period start
mbed_official 554:edd95c0879f8 114 LPC_PWM1->LER |= 1 << obj->pwm;
mbed_official 554:edd95c0879f8 115 }
mbed_official 554:edd95c0879f8 116
mbed_official 554:edd95c0879f8 117 float pwmout_read(pwmout_t* obj) {
mbed_official 554:edd95c0879f8 118 float v = (float)(*obj->MR) / (float)(LPC_PWM1->MR0);
mbed_official 554:edd95c0879f8 119 return (v > 1.0f) ? (1.0f) : (v);
mbed_official 554:edd95c0879f8 120 }
mbed_official 554:edd95c0879f8 121
mbed_official 554:edd95c0879f8 122 void pwmout_period(pwmout_t* obj, float seconds) {
mbed_official 554:edd95c0879f8 123 pwmout_period_us(obj, seconds * 1000000.0f);
mbed_official 554:edd95c0879f8 124 }
mbed_official 554:edd95c0879f8 125
mbed_official 554:edd95c0879f8 126 void pwmout_period_ms(pwmout_t* obj, int ms) {
mbed_official 554:edd95c0879f8 127 pwmout_period_us(obj, ms * 1000);
mbed_official 554:edd95c0879f8 128 }
mbed_official 554:edd95c0879f8 129
mbed_official 554:edd95c0879f8 130 // Set the PWM period, keeping the duty cycle the same.
mbed_official 554:edd95c0879f8 131 void pwmout_period_us(pwmout_t* obj, int us) {
mbed_official 554:edd95c0879f8 132 // calculate number of ticks
mbed_official 554:edd95c0879f8 133 uint32_t ticks = pwm_clock_mhz * us;
mbed_official 554:edd95c0879f8 134
mbed_official 554:edd95c0879f8 135 // set reset
mbed_official 554:edd95c0879f8 136 LPC_PWM1->TCR = TCR_RESET;
mbed_official 554:edd95c0879f8 137
mbed_official 554:edd95c0879f8 138 // set the global match register
mbed_official 554:edd95c0879f8 139 LPC_PWM1->MR0 = ticks;
mbed_official 554:edd95c0879f8 140
mbed_official 554:edd95c0879f8 141 // Scale the pulse width to preserve the duty ratio
mbed_official 554:edd95c0879f8 142 if (LPC_PWM1->MR0 > 0) {
mbed_official 554:edd95c0879f8 143 *obj->MR = (*obj->MR * ticks) / LPC_PWM1->MR0;
mbed_official 554:edd95c0879f8 144 }
mbed_official 554:edd95c0879f8 145
mbed_official 554:edd95c0879f8 146 // set the channel latch to update value at next period start
mbed_official 554:edd95c0879f8 147 LPC_PWM1->LER |= 1 << 0;
mbed_official 554:edd95c0879f8 148
mbed_official 554:edd95c0879f8 149 // enable counter and pwm, clear reset
mbed_official 554:edd95c0879f8 150 LPC_PWM1->TCR = TCR_CNT_EN | TCR_PWM_EN;
mbed_official 554:edd95c0879f8 151 }
mbed_official 554:edd95c0879f8 152
mbed_official 554:edd95c0879f8 153 void pwmout_pulsewidth(pwmout_t* obj, float seconds) {
mbed_official 554:edd95c0879f8 154 pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
mbed_official 554:edd95c0879f8 155 }
mbed_official 554:edd95c0879f8 156
mbed_official 554:edd95c0879f8 157 void pwmout_pulsewidth_ms(pwmout_t* obj, int ms) {
mbed_official 554:edd95c0879f8 158 pwmout_pulsewidth_us(obj, ms * 1000);
mbed_official 554:edd95c0879f8 159 }
mbed_official 554:edd95c0879f8 160
mbed_official 554:edd95c0879f8 161 void pwmout_pulsewidth_us(pwmout_t* obj, int us) {
mbed_official 554:edd95c0879f8 162 // calculate number of ticks
mbed_official 554:edd95c0879f8 163 uint32_t v = pwm_clock_mhz * us;
mbed_official 554:edd95c0879f8 164
mbed_official 554:edd95c0879f8 165 // workaround for PWM1[1] - Never make it equal MR0, else we get 1 cycle dropout
mbed_official 554:edd95c0879f8 166 if (v == LPC_PWM1->MR0) {
mbed_official 554:edd95c0879f8 167 v++;
mbed_official 554:edd95c0879f8 168 }
mbed_official 554:edd95c0879f8 169
mbed_official 554:edd95c0879f8 170 // set the match register value
mbed_official 554:edd95c0879f8 171 *obj->MR = v;
mbed_official 554:edd95c0879f8 172
mbed_official 554:edd95c0879f8 173 // set the channel latch to update value at next period start
mbed_official 554:edd95c0879f8 174 LPC_PWM1->LER |= 1 << obj->pwm;
mbed_official 554:edd95c0879f8 175 }