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:
Mon Dec 15 09:00:08 2014 +0000
Revision:
437:0b72c0f86db6
Parent:
417:39e86d6263aa
Child:
441:d2c15dda23c1
Synchronized with git revision f3acd0e7aa3cbba2a6b264dc2e9f596891dea133

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

Tools: changed device name from nRF51822_xxAA -> nRF51xxx on all Nordic boards

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 390:35c2c1cf29cd 1 /* mbed Microcontroller Library
mbed_official 390:35c2c1cf29cd 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 390:35c2c1cf29cd 3 *
mbed_official 390:35c2c1cf29cd 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 390:35c2c1cf29cd 5 * you may not use this file except in compliance with the License.
mbed_official 390:35c2c1cf29cd 6 * You may obtain a copy of the License at
mbed_official 390:35c2c1cf29cd 7 *
mbed_official 390:35c2c1cf29cd 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 390:35c2c1cf29cd 9 *
mbed_official 390:35c2c1cf29cd 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 390:35c2c1cf29cd 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 390:35c2c1cf29cd 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 390:35c2c1cf29cd 13 * See the License for the specific language governing permissions and
mbed_official 390:35c2c1cf29cd 14 * limitations under the License.
mbed_official 390:35c2c1cf29cd 15 */
mbed_official 390:35c2c1cf29cd 16 #include "mbed_assert.h"
mbed_official 390:35c2c1cf29cd 17 #include "pwmout_api.h"
mbed_official 390:35c2c1cf29cd 18 #include "cmsis.h"
mbed_official 390:35c2c1cf29cd 19 #include "pinmap.h"
mbed_official 437:0b72c0f86db6 20 #include "RZ_A1_Init.h"
mbed_official 390:35c2c1cf29cd 21 #include "cpg_iodefine.h"
mbed_official 390:35c2c1cf29cd 22 #include "pwm_iodefine.h"
mbed_official 390:35c2c1cf29cd 23
mbed_official 390:35c2c1cf29cd 24 // PORT ID, PWM ID, Pin function
mbed_official 390:35c2c1cf29cd 25 static const PinMap PinMap_PWM[] = {
mbed_official 437:0b72c0f86db6 26 {P4_4 , PWM0_PIN , 4},
mbed_official 437:0b72c0f86db6 27 {P3_2 , PWM1_PIN , 7},
mbed_official 437:0b72c0f86db6 28 {P4_6 , PWM2_PIN , 4},
mbed_official 437:0b72c0f86db6 29 {P4_7 , PWM3_PIN , 4},
mbed_official 437:0b72c0f86db6 30 {P8_14 , PWM4_PIN , 6},
mbed_official 437:0b72c0f86db6 31 {P8_15 , PWM5_PIN , 6},
mbed_official 437:0b72c0f86db6 32 {P8_13 , PWM6_PIN , 6},
mbed_official 437:0b72c0f86db6 33 {P8_11 , PWM7_PIN , 6},
mbed_official 437:0b72c0f86db6 34 {P8_8 , PWM8_PIN , 6},
mbed_official 437:0b72c0f86db6 35 {P10_0 , PWM9_PIN , 3},
mbed_official 437:0b72c0f86db6 36 {P8_12 , PWM10_PIN, 6},
mbed_official 437:0b72c0f86db6 37 {P8_9 , PWM11_PIN, 6},
mbed_official 437:0b72c0f86db6 38 {P8_10 , PWM12_PIN, 6},
mbed_official 390:35c2c1cf29cd 39 {NC, NC, 0}
mbed_official 390:35c2c1cf29cd 40 };
mbed_official 390:35c2c1cf29cd 41
mbed_official 437:0b72c0f86db6 42 static PWMType PORT[] = {
mbed_official 437:0b72c0f86db6 43 PWM2E, // PWM0_PIN
mbed_official 437:0b72c0f86db6 44 PWM2C, // PWM1_PIN
mbed_official 437:0b72c0f86db6 45 PWM2G, // PWM2_PIN
mbed_official 437:0b72c0f86db6 46 PWM2H, // PWM3_PIN
mbed_official 437:0b72c0f86db6 47 PWM1G, // PWM4_PIN
mbed_official 437:0b72c0f86db6 48 PWM1H, // PWM5_PIN
mbed_official 437:0b72c0f86db6 49 PWM1F, // PWM6_PIN
mbed_official 437:0b72c0f86db6 50 PWM1D, // PWM7_PIN
mbed_official 437:0b72c0f86db6 51 PWM1A, // PWM8_PIN
mbed_official 437:0b72c0f86db6 52 PWM2A, // PWM9_PIN
mbed_official 437:0b72c0f86db6 53 PWM1E, // PWM10_PIN
mbed_official 437:0b72c0f86db6 54 PWM1B, // PWM11_PIN
mbed_official 437:0b72c0f86db6 55 PWM1C, // PWM12_PIN
mbed_official 390:35c2c1cf29cd 56 };
mbed_official 390:35c2c1cf29cd 57
mbed_official 437:0b72c0f86db6 58 static __IO uint16_t *PWM_MATCH[] = {
mbed_official 437:0b72c0f86db6 59 &PWMPWBFR_2E, // PWM0_PIN
mbed_official 437:0b72c0f86db6 60 &PWMPWBFR_2C, // PWM1_PIN
mbed_official 437:0b72c0f86db6 61 &PWMPWBFR_2G, // PWM2_PIN
mbed_official 437:0b72c0f86db6 62 &PWMPWBFR_2G, // PWM3_PIN
mbed_official 437:0b72c0f86db6 63 &PWMPWBFR_1G, // PWM4_PIN
mbed_official 437:0b72c0f86db6 64 &PWMPWBFR_1G, // PWM5_PIN
mbed_official 437:0b72c0f86db6 65 &PWMPWBFR_1E, // PWM6_PIN
mbed_official 437:0b72c0f86db6 66 &PWMPWBFR_1C, // PWM7_PIN
mbed_official 437:0b72c0f86db6 67 &PWMPWBFR_1A, // PWM8_PIN
mbed_official 437:0b72c0f86db6 68 &PWMPWBFR_2A, // PWM9_PIN
mbed_official 437:0b72c0f86db6 69 &PWMPWBFR_1E, // PWM10_PIN
mbed_official 437:0b72c0f86db6 70 &PWMPWBFR_1A, // PWM11_PIN
mbed_official 437:0b72c0f86db6 71 &PWMPWBFR_1C, // PWM12_PIN
mbed_official 437:0b72c0f86db6 72 };
mbed_official 390:35c2c1cf29cd 73
mbed_official 437:0b72c0f86db6 74 static uint16_t init_period_ch1 = 0;
mbed_official 437:0b72c0f86db6 75 static uint16_t init_period_ch2 = 0;
mbed_official 390:35c2c1cf29cd 76
mbed_official 390:35c2c1cf29cd 77 void pwmout_init(pwmout_t* obj, PinName pin) {
mbed_official 390:35c2c1cf29cd 78 // determine the channel
mbed_official 390:35c2c1cf29cd 79 PWMName pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
mbed_official 390:35c2c1cf29cd 80 MBED_ASSERT(pwm != (PWMName)NC);
mbed_official 390:35c2c1cf29cd 81
mbed_official 390:35c2c1cf29cd 82 // power on
mbed_official 390:35c2c1cf29cd 83 CPGSTBCR3 &= ~(1<<0);
mbed_official 390:35c2c1cf29cd 84
mbed_official 437:0b72c0f86db6 85 obj->pwm = pwm;
mbed_official 437:0b72c0f86db6 86 if (((uint32_t)PORT[obj->pwm] & 0x00000010) != 0) {
mbed_official 437:0b72c0f86db6 87 obj->ch = 2;
mbed_official 437:0b72c0f86db6 88 PWMPWPR_2_BYTE_L = 0x00;
mbed_official 437:0b72c0f86db6 89 } else {
mbed_official 437:0b72c0f86db6 90 obj->ch = 1;
mbed_official 437:0b72c0f86db6 91 PWMPWPR_1_BYTE_L = 0x00;
mbed_official 437:0b72c0f86db6 92 }
mbed_official 437:0b72c0f86db6 93
mbed_official 390:35c2c1cf29cd 94 // Wire pinout
mbed_official 390:35c2c1cf29cd 95 pinmap_pinout(pin, PinMap_PWM);
mbed_official 437:0b72c0f86db6 96
mbed_official 437:0b72c0f86db6 97 // default to 491us: standard for servos, and fine for e.g. brightness control
mbed_official 437:0b72c0f86db6 98 pwmout_write(obj, 0);
mbed_official 437:0b72c0f86db6 99 if ((obj->ch == 2) && (init_period_ch2 == 0)) {
mbed_official 437:0b72c0f86db6 100 pwmout_period_us(obj, 491);
mbed_official 437:0b72c0f86db6 101 init_period_ch2 = 1;
mbed_official 437:0b72c0f86db6 102 }
mbed_official 437:0b72c0f86db6 103 if ((obj->ch == 1) && (init_period_ch1 == 0)) {
mbed_official 437:0b72c0f86db6 104 pwmout_period_us(obj, 491);
mbed_official 437:0b72c0f86db6 105 init_period_ch1 = 1;
mbed_official 437:0b72c0f86db6 106 }
mbed_official 390:35c2c1cf29cd 107 }
mbed_official 390:35c2c1cf29cd 108
mbed_official 390:35c2c1cf29cd 109 void pwmout_free(pwmout_t* obj) {
mbed_official 437:0b72c0f86db6 110 pwmout_write(obj, 0);
mbed_official 390:35c2c1cf29cd 111 }
mbed_official 390:35c2c1cf29cd 112
mbed_official 390:35c2c1cf29cd 113 void pwmout_write(pwmout_t* obj, float value) {
mbed_official 437:0b72c0f86db6 114 uint32_t wk_cycle;
mbed_official 437:0b72c0f86db6 115 uint16_t v;
mbed_official 437:0b72c0f86db6 116
mbed_official 390:35c2c1cf29cd 117 if (value < 0.0f) {
mbed_official 437:0b72c0f86db6 118 value = 0.0f;
mbed_official 390:35c2c1cf29cd 119 } else if (value > 1.0f) {
mbed_official 437:0b72c0f86db6 120 value = 1.0f;
mbed_official 437:0b72c0f86db6 121 } else {
mbed_official 437:0b72c0f86db6 122 // Do Nothing
mbed_official 390:35c2c1cf29cd 123 }
mbed_official 437:0b72c0f86db6 124
mbed_official 437:0b72c0f86db6 125 if (obj->ch == 2) {
mbed_official 437:0b72c0f86db6 126 wk_cycle = PWMPWCYR_2 & 0x03ff;
mbed_official 437:0b72c0f86db6 127 } else {
mbed_official 437:0b72c0f86db6 128 wk_cycle = PWMPWCYR_1 & 0x03ff;
mbed_official 437:0b72c0f86db6 129 }
mbed_official 437:0b72c0f86db6 130
mbed_official 390:35c2c1cf29cd 131 // set channel match to percentage
mbed_official 437:0b72c0f86db6 132 v = (uint16_t)((float)wk_cycle * value);
mbed_official 437:0b72c0f86db6 133 *PWM_MATCH[obj->pwm] = (v | ((PORT[obj->pwm] & 1) << 12));
mbed_official 390:35c2c1cf29cd 134 }
mbed_official 390:35c2c1cf29cd 135
mbed_official 390:35c2c1cf29cd 136 float pwmout_read(pwmout_t* obj) {
mbed_official 437:0b72c0f86db6 137 uint32_t wk_cycle;
mbed_official 437:0b72c0f86db6 138 float value;
mbed_official 437:0b72c0f86db6 139
mbed_official 437:0b72c0f86db6 140 if (obj->ch == 2) {
mbed_official 437:0b72c0f86db6 141 wk_cycle = PWMPWCYR_2 & 0x03ff;
mbed_official 437:0b72c0f86db6 142 } else {
mbed_official 437:0b72c0f86db6 143 wk_cycle = PWMPWCYR_1 & 0x03ff;
mbed_official 437:0b72c0f86db6 144 }
mbed_official 437:0b72c0f86db6 145 value = ((float)(*PWM_MATCH[obj->pwm] & 0x03ff) / (float)wk_cycle);
mbed_official 437:0b72c0f86db6 146
mbed_official 437:0b72c0f86db6 147 return (value > 1.0f) ? (1.0f) : (value);
mbed_official 390:35c2c1cf29cd 148 }
mbed_official 390:35c2c1cf29cd 149
mbed_official 390:35c2c1cf29cd 150 void pwmout_period(pwmout_t* obj, float seconds) {
mbed_official 390:35c2c1cf29cd 151 pwmout_period_us(obj, seconds * 1000000.0f);
mbed_official 390:35c2c1cf29cd 152 }
mbed_official 390:35c2c1cf29cd 153
mbed_official 390:35c2c1cf29cd 154 void pwmout_period_ms(pwmout_t* obj, int ms) {
mbed_official 390:35c2c1cf29cd 155 pwmout_period_us(obj, ms * 1000);
mbed_official 390:35c2c1cf29cd 156 }
mbed_official 390:35c2c1cf29cd 157
mbed_official 437:0b72c0f86db6 158 static void set_duty_again(__IO uint16_t *p_pwmpbfr, uint16_t last_cycle, uint16_t new_cycle){
mbed_official 437:0b72c0f86db6 159 uint16_t wk_pwmpbfr;
mbed_official 437:0b72c0f86db6 160 float value;
mbed_official 437:0b72c0f86db6 161 uint16_t v;
mbed_official 437:0b72c0f86db6 162
mbed_official 437:0b72c0f86db6 163 wk_pwmpbfr = *p_pwmpbfr;
mbed_official 437:0b72c0f86db6 164 value = ((float)(wk_pwmpbfr & 0x03ff) / (float)last_cycle);
mbed_official 437:0b72c0f86db6 165 v = (uint16_t)((float)new_cycle * value);
mbed_official 437:0b72c0f86db6 166 *p_pwmpbfr = (v | (wk_pwmpbfr & 0x1000));
mbed_official 437:0b72c0f86db6 167 }
mbed_official 437:0b72c0f86db6 168
mbed_official 390:35c2c1cf29cd 169 // Set the PWM period, keeping the duty cycle the same.
mbed_official 390:35c2c1cf29cd 170 void pwmout_period_us(pwmout_t* obj, int us) {
mbed_official 437:0b72c0f86db6 171 uint32_t pclk_base;
mbed_official 437:0b72c0f86db6 172 uint32_t wk_cycle;
mbed_official 437:0b72c0f86db6 173 uint16_t wk_last_cycle;
mbed_official 437:0b72c0f86db6 174 uint32_t wk_cks = 0;
mbed_official 437:0b72c0f86db6 175
mbed_official 437:0b72c0f86db6 176 if (us > 491) {
mbed_official 437:0b72c0f86db6 177 us = 491;
mbed_official 437:0b72c0f86db6 178 } else if (us < 1) {
mbed_official 437:0b72c0f86db6 179 us = 1;
mbed_official 437:0b72c0f86db6 180 } else {
mbed_official 437:0b72c0f86db6 181 // Do Nothing
mbed_official 437:0b72c0f86db6 182 }
mbed_official 390:35c2c1cf29cd 183
mbed_official 437:0b72c0f86db6 184 if (RZ_A1_IsClockMode0() == false) {
mbed_official 437:0b72c0f86db6 185 pclk_base = (uint32_t)CM1_RENESAS_RZ_A1_P0_CLK / 10000;
mbed_official 437:0b72c0f86db6 186 } else {
mbed_official 437:0b72c0f86db6 187 pclk_base = (uint32_t)CM0_RENESAS_RZ_A1_P0_CLK / 10000;
mbed_official 437:0b72c0f86db6 188 }
mbed_official 437:0b72c0f86db6 189
mbed_official 437:0b72c0f86db6 190 wk_cycle = pclk_base * us;
mbed_official 437:0b72c0f86db6 191 while (wk_cycle >= 102350) {
mbed_official 437:0b72c0f86db6 192 wk_cycle >>= 1;
mbed_official 437:0b72c0f86db6 193 wk_cks++;
mbed_official 437:0b72c0f86db6 194 }
mbed_official 437:0b72c0f86db6 195 wk_cycle = (wk_cycle + 50) / 100;
mbed_official 390:35c2c1cf29cd 196
mbed_official 437:0b72c0f86db6 197 if (obj->ch == 2) {
mbed_official 437:0b72c0f86db6 198 wk_last_cycle = PWMPWCYR_2 & 0x03ff;
mbed_official 437:0b72c0f86db6 199 PWMPWCR_2_BYTE_L = 0xc0 | wk_cks;
mbed_official 437:0b72c0f86db6 200 PWMPWCYR_2 = (uint16_t)wk_cycle;
mbed_official 437:0b72c0f86db6 201
mbed_official 437:0b72c0f86db6 202 // Set duty again
mbed_official 437:0b72c0f86db6 203 set_duty_again(&PWMPWBFR_2A, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 204 set_duty_again(&PWMPWBFR_2C, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 205 set_duty_again(&PWMPWBFR_2E, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 206 set_duty_again(&PWMPWBFR_2G, wk_last_cycle, wk_cycle);
mbed_official 390:35c2c1cf29cd 207
mbed_official 437:0b72c0f86db6 208 // Counter Start
mbed_official 437:0b72c0f86db6 209 PWMPWCR_2_BYTE_L |= 0x08;
mbed_official 437:0b72c0f86db6 210 } else {
mbed_official 437:0b72c0f86db6 211 wk_last_cycle = PWMPWCYR_1 & 0x03ff;
mbed_official 437:0b72c0f86db6 212 PWMPWCR_1_BYTE_L = 0xc0 | wk_cks;
mbed_official 437:0b72c0f86db6 213 PWMPWCYR_1 = (uint16_t)wk_cycle;
mbed_official 390:35c2c1cf29cd 214
mbed_official 437:0b72c0f86db6 215 // Set duty again
mbed_official 437:0b72c0f86db6 216 set_duty_again(&PWMPWBFR_1A, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 217 set_duty_again(&PWMPWBFR_1C, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 218 set_duty_again(&PWMPWBFR_1E, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 219 set_duty_again(&PWMPWBFR_1G, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 220
mbed_official 437:0b72c0f86db6 221 // Counter Start
mbed_official 437:0b72c0f86db6 222 PWMPWCR_1_BYTE_L |= 0x08;
mbed_official 437:0b72c0f86db6 223 }
mbed_official 437:0b72c0f86db6 224
mbed_official 437:0b72c0f86db6 225 // Save for future use
mbed_official 437:0b72c0f86db6 226 obj->period = us;
mbed_official 390:35c2c1cf29cd 227 }
mbed_official 390:35c2c1cf29cd 228
mbed_official 390:35c2c1cf29cd 229 void pwmout_pulsewidth(pwmout_t* obj, float seconds) {
mbed_official 390:35c2c1cf29cd 230 pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
mbed_official 390:35c2c1cf29cd 231 }
mbed_official 390:35c2c1cf29cd 232
mbed_official 390:35c2c1cf29cd 233 void pwmout_pulsewidth_ms(pwmout_t* obj, int ms) {
mbed_official 390:35c2c1cf29cd 234 pwmout_pulsewidth_us(obj, ms * 1000);
mbed_official 390:35c2c1cf29cd 235 }
mbed_official 390:35c2c1cf29cd 236
mbed_official 390:35c2c1cf29cd 237 void pwmout_pulsewidth_us(pwmout_t* obj, int us) {
mbed_official 437:0b72c0f86db6 238 float value = (float)us / (float)obj->period;
mbed_official 437:0b72c0f86db6 239 pwmout_write(obj, value);
mbed_official 390:35c2c1cf29cd 240 }