mbed library sources: Modified to operate FRDM-KL25Z at 48MHz from internal 32kHz oscillator (nothing else changed).

Fork of mbed-src by mbed official

The only file that changed is: mbed-src-FLL48/targets/cmsis/TARGET_Freescale/TARGET_KL25Z/system_MKL25Z4.h

Committer:
icenyne
Date:
Sat Oct 26 13:59:14 2013 +0000
Revision:
30:7ca55132b805
Parent:
20:4263a77256ae
mbed library source for KL25Z updated to operate using internal oscillator at 48MHz as the default.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 20:4263a77256ae 1 /* mbed Microcontroller Library
bogdanm 20:4263a77256ae 2 * Copyright (c) 2006-2013 ARM Limited
bogdanm 20:4263a77256ae 3 *
bogdanm 20:4263a77256ae 4 * Licensed under the Apache License, Version 2.0 (the "License");
bogdanm 20:4263a77256ae 5 * you may not use this file except in compliance with the License.
bogdanm 20:4263a77256ae 6 * You may obtain a copy of the License at
bogdanm 20:4263a77256ae 7 *
bogdanm 20:4263a77256ae 8 * http://www.apache.org/licenses/LICENSE-2.0
bogdanm 20:4263a77256ae 9 *
bogdanm 20:4263a77256ae 10 * Unless required by applicable law or agreed to in writing, software
bogdanm 20:4263a77256ae 11 * distributed under the License is distributed on an "AS IS" BASIS,
bogdanm 20:4263a77256ae 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
bogdanm 20:4263a77256ae 13 * See the License for the specific language governing permissions and
bogdanm 20:4263a77256ae 14 * limitations under the License.
bogdanm 20:4263a77256ae 15 */
bogdanm 20:4263a77256ae 16 #include "pwmout_api.h"
bogdanm 20:4263a77256ae 17
bogdanm 20:4263a77256ae 18 #include "cmsis.h"
bogdanm 20:4263a77256ae 19 #include "pinmap.h"
bogdanm 20:4263a77256ae 20 #include "error.h"
bogdanm 20:4263a77256ae 21
bogdanm 20:4263a77256ae 22 static const PinMap PinMap_PWM[] = {
bogdanm 20:4263a77256ae 23 // LEDs
bogdanm 20:4263a77256ae 24 {LED_RED , PWM_4 , 2}, // PTB8 , TPM0 CH3
bogdanm 20:4263a77256ae 25 {LED_GREEN, PWM_3, 2}, // PTB9 , TPM0 CH2
bogdanm 20:4263a77256ae 26 {LED_BLUE , PWM_2 , 2}, // PTB10, TPM0 CH1
bogdanm 20:4263a77256ae 27
bogdanm 20:4263a77256ae 28 // Arduino digital pinout
bogdanm 20:4263a77256ae 29 {D3, PWM_8 , 2}, // PTB5 , TPM1 CH1
bogdanm 20:4263a77256ae 30 {D5, PWM_7 , 2}, // PTA12, TPM1 CH0
bogdanm 20:4263a77256ae 31 {D6, PWM_4 , 2}, // PTB6 , TPM0 CH3
bogdanm 20:4263a77256ae 32 {D7, PWM_3 , 2}, // PTB7 , TPM0 CH2
bogdanm 20:4263a77256ae 33 {D8, PWM_2 , 2}, // PTB10, TPM0 CH1
bogdanm 20:4263a77256ae 34 {D9, PWM_1 , 2}, // PTB11, TPM0 CH0
bogdanm 20:4263a77256ae 35 {D10, PWM_6 , 2}, // PTA5 , TPM0 CH5
bogdanm 20:4263a77256ae 36 {D12, PWM_5 , 2}, // PTA6 , TPM0 CH4
bogdanm 20:4263a77256ae 37 {NC , NC , 0}
bogdanm 20:4263a77256ae 38 };
bogdanm 20:4263a77256ae 39
bogdanm 20:4263a77256ae 40 #define PWM_CLOCK_MHZ (0.75) // (48)MHz / 64 = (0.75)MHz
bogdanm 20:4263a77256ae 41
bogdanm 20:4263a77256ae 42 void pwmout_init(pwmout_t* obj, PinName pin) {
bogdanm 20:4263a77256ae 43 // determine the channel
bogdanm 20:4263a77256ae 44 PWMName pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
bogdanm 20:4263a77256ae 45 if (pwm == (uint32_t)NC) {
bogdanm 20:4263a77256ae 46 error("PwmOut pin mapping failed");
bogdanm 20:4263a77256ae 47 }
bogdanm 20:4263a77256ae 48
bogdanm 20:4263a77256ae 49 unsigned int port = (unsigned int)pin >> PORT_SHIFT;
bogdanm 20:4263a77256ae 50 unsigned int tpm_n = (pwm >> TPM_SHIFT);
bogdanm 20:4263a77256ae 51 unsigned int ch_n = (pwm & 0xFF);
bogdanm 20:4263a77256ae 52
bogdanm 20:4263a77256ae 53 SIM->SCGC5 |= 1 << (SIM_SCGC5_PORTA_SHIFT + port);
bogdanm 20:4263a77256ae 54 SIM->SCGC6 |= 1 << (SIM_SCGC6_TPM0_SHIFT + tpm_n);
bogdanm 20:4263a77256ae 55 SIM->SOPT2 |= SIM_SOPT2_TPMSRC(1); // Clock source: MCGFLLCLK or MCGPLLCLK
bogdanm 20:4263a77256ae 56
bogdanm 20:4263a77256ae 57 TPM_Type *tpm = (TPM_Type *)(TPM0_BASE + 0x1000 * tpm_n);
bogdanm 20:4263a77256ae 58 tpm->SC = TPM_SC_CMOD(1) | TPM_SC_PS(6); // (48)MHz / 64 = (0.75)MHz
bogdanm 20:4263a77256ae 59 tpm->CONTROLS[ch_n].CnSC = (TPM_CnSC_MSB_MASK | TPM_CnSC_ELSB_MASK); // No Interrupts; High True pulses on Edge Aligned PWM
bogdanm 20:4263a77256ae 60
bogdanm 20:4263a77256ae 61 obj->CnV = &tpm->CONTROLS[ch_n].CnV;
bogdanm 20:4263a77256ae 62 obj->MOD = &tpm->MOD;
bogdanm 20:4263a77256ae 63 obj->CNT = &tpm->CNT;
bogdanm 20:4263a77256ae 64
bogdanm 20:4263a77256ae 65 // default to 20ms: standard for servos, and fine for e.g. brightness control
bogdanm 20:4263a77256ae 66 pwmout_period_ms(obj, 20);
bogdanm 20:4263a77256ae 67 pwmout_write(obj, 0);
bogdanm 20:4263a77256ae 68
bogdanm 20:4263a77256ae 69 // Wire pinout
bogdanm 20:4263a77256ae 70 pinmap_pinout(pin, PinMap_PWM);
bogdanm 20:4263a77256ae 71 }
bogdanm 20:4263a77256ae 72
bogdanm 20:4263a77256ae 73 void pwmout_free(pwmout_t* obj) {
bogdanm 20:4263a77256ae 74
bogdanm 20:4263a77256ae 75 }
bogdanm 20:4263a77256ae 76
bogdanm 20:4263a77256ae 77 void pwmout_write(pwmout_t* obj, float value) {
bogdanm 20:4263a77256ae 78 if (value < 0.0) {
bogdanm 20:4263a77256ae 79 value = 0.0;
bogdanm 20:4263a77256ae 80 } else if (value > 1.0) {
bogdanm 20:4263a77256ae 81 value = 1.0;
bogdanm 20:4263a77256ae 82 }
bogdanm 20:4263a77256ae 83
bogdanm 20:4263a77256ae 84 *obj->CnV = (uint32_t)((float)(*obj->MOD) * value);
bogdanm 20:4263a77256ae 85 *obj->CNT = 0;
bogdanm 20:4263a77256ae 86 }
bogdanm 20:4263a77256ae 87
bogdanm 20:4263a77256ae 88 float pwmout_read(pwmout_t* obj) {
bogdanm 20:4263a77256ae 89 float v = (float)(*obj->CnV) / (float)(*obj->MOD);
bogdanm 20:4263a77256ae 90 return (v > 1.0) ? (1.0) : (v);
bogdanm 20:4263a77256ae 91 }
bogdanm 20:4263a77256ae 92
bogdanm 20:4263a77256ae 93 void pwmout_period(pwmout_t* obj, float seconds) {
bogdanm 20:4263a77256ae 94 pwmout_period_us(obj, seconds * 1000000.0f);
bogdanm 20:4263a77256ae 95 }
bogdanm 20:4263a77256ae 96
bogdanm 20:4263a77256ae 97 void pwmout_period_ms(pwmout_t* obj, int ms) {
bogdanm 20:4263a77256ae 98 pwmout_period_us(obj, ms * 1000);
bogdanm 20:4263a77256ae 99 }
bogdanm 20:4263a77256ae 100
bogdanm 20:4263a77256ae 101 // Set the PWM period, keeping the duty cycle the same.
bogdanm 20:4263a77256ae 102 void pwmout_period_us(pwmout_t* obj, int us) {
bogdanm 20:4263a77256ae 103 float dc = pwmout_read(obj);
bogdanm 20:4263a77256ae 104 *obj->MOD = PWM_CLOCK_MHZ * us;
bogdanm 20:4263a77256ae 105 pwmout_write(obj, dc);
bogdanm 20:4263a77256ae 106 }
bogdanm 20:4263a77256ae 107
bogdanm 20:4263a77256ae 108 void pwmout_pulsewidth(pwmout_t* obj, float seconds) {
bogdanm 20:4263a77256ae 109 pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
bogdanm 20:4263a77256ae 110 }
bogdanm 20:4263a77256ae 111
bogdanm 20:4263a77256ae 112 void pwmout_pulsewidth_ms(pwmout_t* obj, int ms) {
bogdanm 20:4263a77256ae 113 pwmout_pulsewidth_us(obj, ms * 1000);
bogdanm 20:4263a77256ae 114 }
bogdanm 20:4263a77256ae 115
bogdanm 20:4263a77256ae 116 void pwmout_pulsewidth_us(pwmout_t* obj, int us) {
bogdanm 20:4263a77256ae 117 *obj->CnV = PWM_CLOCK_MHZ * us;
bogdanm 20:4263a77256ae 118 }