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:
Tue Mar 31 16:15:13 2015 +0100
Revision:
500:04797f1feae2
Parent:
441:d2c15dda23c1
Child:
591:474d026f7d79
Synchronized with git revision 251f3f8b55a4dc98b831c80e032464ed45cce309

Full URL: https://github.com/mbedmicro/mbed/commit/251f3f8b55a4dc98b831c80e032464ed45cce309/

[RZ/A1H]Add some function(USB 2port, NVIC wrapper) and modify some settings(OS, Terminal).

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 500:04797f1feae2 39 {P4_5 , PWM13_PIN, 4},
mbed_official 390:35c2c1cf29cd 40 {NC, NC, 0}
mbed_official 390:35c2c1cf29cd 41 };
mbed_official 390:35c2c1cf29cd 42
mbed_official 437:0b72c0f86db6 43 static PWMType PORT[] = {
mbed_official 437:0b72c0f86db6 44 PWM2E, // PWM0_PIN
mbed_official 437:0b72c0f86db6 45 PWM2C, // PWM1_PIN
mbed_official 437:0b72c0f86db6 46 PWM2G, // PWM2_PIN
mbed_official 437:0b72c0f86db6 47 PWM2H, // PWM3_PIN
mbed_official 437:0b72c0f86db6 48 PWM1G, // PWM4_PIN
mbed_official 437:0b72c0f86db6 49 PWM1H, // PWM5_PIN
mbed_official 437:0b72c0f86db6 50 PWM1F, // PWM6_PIN
mbed_official 437:0b72c0f86db6 51 PWM1D, // PWM7_PIN
mbed_official 437:0b72c0f86db6 52 PWM1A, // PWM8_PIN
mbed_official 437:0b72c0f86db6 53 PWM2A, // PWM9_PIN
mbed_official 437:0b72c0f86db6 54 PWM1E, // PWM10_PIN
mbed_official 437:0b72c0f86db6 55 PWM1B, // PWM11_PIN
mbed_official 437:0b72c0f86db6 56 PWM1C, // PWM12_PIN
mbed_official 500:04797f1feae2 57 PWM2F, // PWM13_PIN
mbed_official 390:35c2c1cf29cd 58 };
mbed_official 390:35c2c1cf29cd 59
mbed_official 437:0b72c0f86db6 60 static __IO uint16_t *PWM_MATCH[] = {
mbed_official 437:0b72c0f86db6 61 &PWMPWBFR_2E, // PWM0_PIN
mbed_official 437:0b72c0f86db6 62 &PWMPWBFR_2C, // PWM1_PIN
mbed_official 437:0b72c0f86db6 63 &PWMPWBFR_2G, // PWM2_PIN
mbed_official 437:0b72c0f86db6 64 &PWMPWBFR_2G, // PWM3_PIN
mbed_official 437:0b72c0f86db6 65 &PWMPWBFR_1G, // PWM4_PIN
mbed_official 437:0b72c0f86db6 66 &PWMPWBFR_1G, // PWM5_PIN
mbed_official 437:0b72c0f86db6 67 &PWMPWBFR_1E, // PWM6_PIN
mbed_official 437:0b72c0f86db6 68 &PWMPWBFR_1C, // PWM7_PIN
mbed_official 437:0b72c0f86db6 69 &PWMPWBFR_1A, // PWM8_PIN
mbed_official 437:0b72c0f86db6 70 &PWMPWBFR_2A, // PWM9_PIN
mbed_official 437:0b72c0f86db6 71 &PWMPWBFR_1E, // PWM10_PIN
mbed_official 437:0b72c0f86db6 72 &PWMPWBFR_1A, // PWM11_PIN
mbed_official 437:0b72c0f86db6 73 &PWMPWBFR_1C, // PWM12_PIN
mbed_official 500:04797f1feae2 74 &PWMPWBFR_2E, // PWM13_PIN
mbed_official 437:0b72c0f86db6 75 };
mbed_official 390:35c2c1cf29cd 76
mbed_official 437:0b72c0f86db6 77 static uint16_t init_period_ch1 = 0;
mbed_official 437:0b72c0f86db6 78 static uint16_t init_period_ch2 = 0;
mbed_official 441:d2c15dda23c1 79 static int32_t period_ch1 = 1;
mbed_official 441:d2c15dda23c1 80 static int32_t period_ch2 = 1;
mbed_official 390:35c2c1cf29cd 81
mbed_official 390:35c2c1cf29cd 82 void pwmout_init(pwmout_t* obj, PinName pin) {
mbed_official 390:35c2c1cf29cd 83 // determine the channel
mbed_official 390:35c2c1cf29cd 84 PWMName pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
mbed_official 390:35c2c1cf29cd 85 MBED_ASSERT(pwm != (PWMName)NC);
mbed_official 390:35c2c1cf29cd 86
mbed_official 390:35c2c1cf29cd 87 // power on
mbed_official 390:35c2c1cf29cd 88 CPGSTBCR3 &= ~(1<<0);
mbed_official 390:35c2c1cf29cd 89
mbed_official 437:0b72c0f86db6 90 obj->pwm = pwm;
mbed_official 437:0b72c0f86db6 91 if (((uint32_t)PORT[obj->pwm] & 0x00000010) != 0) {
mbed_official 437:0b72c0f86db6 92 obj->ch = 2;
mbed_official 437:0b72c0f86db6 93 PWMPWPR_2_BYTE_L = 0x00;
mbed_official 437:0b72c0f86db6 94 } else {
mbed_official 437:0b72c0f86db6 95 obj->ch = 1;
mbed_official 437:0b72c0f86db6 96 PWMPWPR_1_BYTE_L = 0x00;
mbed_official 437:0b72c0f86db6 97 }
mbed_official 437:0b72c0f86db6 98
mbed_official 390:35c2c1cf29cd 99 // Wire pinout
mbed_official 390:35c2c1cf29cd 100 pinmap_pinout(pin, PinMap_PWM);
mbed_official 437:0b72c0f86db6 101
mbed_official 437:0b72c0f86db6 102 // default to 491us: standard for servos, and fine for e.g. brightness control
mbed_official 437:0b72c0f86db6 103 pwmout_write(obj, 0);
mbed_official 437:0b72c0f86db6 104 if ((obj->ch == 2) && (init_period_ch2 == 0)) {
mbed_official 437:0b72c0f86db6 105 pwmout_period_us(obj, 491);
mbed_official 437:0b72c0f86db6 106 init_period_ch2 = 1;
mbed_official 437:0b72c0f86db6 107 }
mbed_official 437:0b72c0f86db6 108 if ((obj->ch == 1) && (init_period_ch1 == 0)) {
mbed_official 437:0b72c0f86db6 109 pwmout_period_us(obj, 491);
mbed_official 437:0b72c0f86db6 110 init_period_ch1 = 1;
mbed_official 437:0b72c0f86db6 111 }
mbed_official 390:35c2c1cf29cd 112 }
mbed_official 390:35c2c1cf29cd 113
mbed_official 390:35c2c1cf29cd 114 void pwmout_free(pwmout_t* obj) {
mbed_official 437:0b72c0f86db6 115 pwmout_write(obj, 0);
mbed_official 390:35c2c1cf29cd 116 }
mbed_official 390:35c2c1cf29cd 117
mbed_official 390:35c2c1cf29cd 118 void pwmout_write(pwmout_t* obj, float value) {
mbed_official 437:0b72c0f86db6 119 uint32_t wk_cycle;
mbed_official 437:0b72c0f86db6 120 uint16_t v;
mbed_official 437:0b72c0f86db6 121
mbed_official 390:35c2c1cf29cd 122 if (value < 0.0f) {
mbed_official 437:0b72c0f86db6 123 value = 0.0f;
mbed_official 390:35c2c1cf29cd 124 } else if (value > 1.0f) {
mbed_official 437:0b72c0f86db6 125 value = 1.0f;
mbed_official 437:0b72c0f86db6 126 } else {
mbed_official 437:0b72c0f86db6 127 // Do Nothing
mbed_official 390:35c2c1cf29cd 128 }
mbed_official 437:0b72c0f86db6 129
mbed_official 437:0b72c0f86db6 130 if (obj->ch == 2) {
mbed_official 437:0b72c0f86db6 131 wk_cycle = PWMPWCYR_2 & 0x03ff;
mbed_official 437:0b72c0f86db6 132 } else {
mbed_official 437:0b72c0f86db6 133 wk_cycle = PWMPWCYR_1 & 0x03ff;
mbed_official 437:0b72c0f86db6 134 }
mbed_official 437:0b72c0f86db6 135
mbed_official 390:35c2c1cf29cd 136 // set channel match to percentage
mbed_official 437:0b72c0f86db6 137 v = (uint16_t)((float)wk_cycle * value);
mbed_official 437:0b72c0f86db6 138 *PWM_MATCH[obj->pwm] = (v | ((PORT[obj->pwm] & 1) << 12));
mbed_official 390:35c2c1cf29cd 139 }
mbed_official 390:35c2c1cf29cd 140
mbed_official 390:35c2c1cf29cd 141 float pwmout_read(pwmout_t* obj) {
mbed_official 437:0b72c0f86db6 142 uint32_t wk_cycle;
mbed_official 437:0b72c0f86db6 143 float value;
mbed_official 437:0b72c0f86db6 144
mbed_official 437:0b72c0f86db6 145 if (obj->ch == 2) {
mbed_official 437:0b72c0f86db6 146 wk_cycle = PWMPWCYR_2 & 0x03ff;
mbed_official 437:0b72c0f86db6 147 } else {
mbed_official 437:0b72c0f86db6 148 wk_cycle = PWMPWCYR_1 & 0x03ff;
mbed_official 437:0b72c0f86db6 149 }
mbed_official 437:0b72c0f86db6 150 value = ((float)(*PWM_MATCH[obj->pwm] & 0x03ff) / (float)wk_cycle);
mbed_official 437:0b72c0f86db6 151
mbed_official 437:0b72c0f86db6 152 return (value > 1.0f) ? (1.0f) : (value);
mbed_official 390:35c2c1cf29cd 153 }
mbed_official 390:35c2c1cf29cd 154
mbed_official 390:35c2c1cf29cd 155 void pwmout_period(pwmout_t* obj, float seconds) {
mbed_official 390:35c2c1cf29cd 156 pwmout_period_us(obj, seconds * 1000000.0f);
mbed_official 390:35c2c1cf29cd 157 }
mbed_official 390:35c2c1cf29cd 158
mbed_official 390:35c2c1cf29cd 159 void pwmout_period_ms(pwmout_t* obj, int ms) {
mbed_official 390:35c2c1cf29cd 160 pwmout_period_us(obj, ms * 1000);
mbed_official 390:35c2c1cf29cd 161 }
mbed_official 390:35c2c1cf29cd 162
mbed_official 437:0b72c0f86db6 163 static void set_duty_again(__IO uint16_t *p_pwmpbfr, uint16_t last_cycle, uint16_t new_cycle){
mbed_official 437:0b72c0f86db6 164 uint16_t wk_pwmpbfr;
mbed_official 437:0b72c0f86db6 165 float value;
mbed_official 437:0b72c0f86db6 166 uint16_t v;
mbed_official 437:0b72c0f86db6 167
mbed_official 437:0b72c0f86db6 168 wk_pwmpbfr = *p_pwmpbfr;
mbed_official 437:0b72c0f86db6 169 value = ((float)(wk_pwmpbfr & 0x03ff) / (float)last_cycle);
mbed_official 437:0b72c0f86db6 170 v = (uint16_t)((float)new_cycle * value);
mbed_official 437:0b72c0f86db6 171 *p_pwmpbfr = (v | (wk_pwmpbfr & 0x1000));
mbed_official 437:0b72c0f86db6 172 }
mbed_official 437:0b72c0f86db6 173
mbed_official 390:35c2c1cf29cd 174 // Set the PWM period, keeping the duty cycle the same.
mbed_official 390:35c2c1cf29cd 175 void pwmout_period_us(pwmout_t* obj, int us) {
mbed_official 437:0b72c0f86db6 176 uint32_t pclk_base;
mbed_official 437:0b72c0f86db6 177 uint32_t wk_cycle;
mbed_official 437:0b72c0f86db6 178 uint16_t wk_last_cycle;
mbed_official 437:0b72c0f86db6 179 uint32_t wk_cks = 0;
mbed_official 437:0b72c0f86db6 180
mbed_official 437:0b72c0f86db6 181 if (us > 491) {
mbed_official 437:0b72c0f86db6 182 us = 491;
mbed_official 437:0b72c0f86db6 183 } else if (us < 1) {
mbed_official 437:0b72c0f86db6 184 us = 1;
mbed_official 437:0b72c0f86db6 185 } else {
mbed_official 437:0b72c0f86db6 186 // Do Nothing
mbed_official 437:0b72c0f86db6 187 }
mbed_official 390:35c2c1cf29cd 188
mbed_official 437:0b72c0f86db6 189 if (RZ_A1_IsClockMode0() == false) {
mbed_official 437:0b72c0f86db6 190 pclk_base = (uint32_t)CM1_RENESAS_RZ_A1_P0_CLK / 10000;
mbed_official 437:0b72c0f86db6 191 } else {
mbed_official 437:0b72c0f86db6 192 pclk_base = (uint32_t)CM0_RENESAS_RZ_A1_P0_CLK / 10000;
mbed_official 437:0b72c0f86db6 193 }
mbed_official 437:0b72c0f86db6 194
mbed_official 437:0b72c0f86db6 195 wk_cycle = pclk_base * us;
mbed_official 437:0b72c0f86db6 196 while (wk_cycle >= 102350) {
mbed_official 437:0b72c0f86db6 197 wk_cycle >>= 1;
mbed_official 437:0b72c0f86db6 198 wk_cks++;
mbed_official 437:0b72c0f86db6 199 }
mbed_official 437:0b72c0f86db6 200 wk_cycle = (wk_cycle + 50) / 100;
mbed_official 390:35c2c1cf29cd 201
mbed_official 437:0b72c0f86db6 202 if (obj->ch == 2) {
mbed_official 437:0b72c0f86db6 203 wk_last_cycle = PWMPWCYR_2 & 0x03ff;
mbed_official 437:0b72c0f86db6 204 PWMPWCR_2_BYTE_L = 0xc0 | wk_cks;
mbed_official 437:0b72c0f86db6 205 PWMPWCYR_2 = (uint16_t)wk_cycle;
mbed_official 437:0b72c0f86db6 206
mbed_official 437:0b72c0f86db6 207 // Set duty again
mbed_official 437:0b72c0f86db6 208 set_duty_again(&PWMPWBFR_2A, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 209 set_duty_again(&PWMPWBFR_2C, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 210 set_duty_again(&PWMPWBFR_2E, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 211 set_duty_again(&PWMPWBFR_2G, wk_last_cycle, wk_cycle);
mbed_official 390:35c2c1cf29cd 212
mbed_official 437:0b72c0f86db6 213 // Counter Start
mbed_official 437:0b72c0f86db6 214 PWMPWCR_2_BYTE_L |= 0x08;
mbed_official 441:d2c15dda23c1 215
mbed_official 441:d2c15dda23c1 216 // Save for future use
mbed_official 441:d2c15dda23c1 217 period_ch2 = us;
mbed_official 437:0b72c0f86db6 218 } else {
mbed_official 437:0b72c0f86db6 219 wk_last_cycle = PWMPWCYR_1 & 0x03ff;
mbed_official 437:0b72c0f86db6 220 PWMPWCR_1_BYTE_L = 0xc0 | wk_cks;
mbed_official 437:0b72c0f86db6 221 PWMPWCYR_1 = (uint16_t)wk_cycle;
mbed_official 390:35c2c1cf29cd 222
mbed_official 437:0b72c0f86db6 223 // Set duty again
mbed_official 437:0b72c0f86db6 224 set_duty_again(&PWMPWBFR_1A, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 225 set_duty_again(&PWMPWBFR_1C, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 226 set_duty_again(&PWMPWBFR_1E, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 227 set_duty_again(&PWMPWBFR_1G, wk_last_cycle, wk_cycle);
mbed_official 437:0b72c0f86db6 228
mbed_official 437:0b72c0f86db6 229 // Counter Start
mbed_official 437:0b72c0f86db6 230 PWMPWCR_1_BYTE_L |= 0x08;
mbed_official 441:d2c15dda23c1 231
mbed_official 441:d2c15dda23c1 232 // Save for future use
mbed_official 441:d2c15dda23c1 233 period_ch1 = us;
mbed_official 437:0b72c0f86db6 234 }
mbed_official 390:35c2c1cf29cd 235 }
mbed_official 390:35c2c1cf29cd 236
mbed_official 390:35c2c1cf29cd 237 void pwmout_pulsewidth(pwmout_t* obj, float seconds) {
mbed_official 390:35c2c1cf29cd 238 pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
mbed_official 390:35c2c1cf29cd 239 }
mbed_official 390:35c2c1cf29cd 240
mbed_official 390:35c2c1cf29cd 241 void pwmout_pulsewidth_ms(pwmout_t* obj, int ms) {
mbed_official 390:35c2c1cf29cd 242 pwmout_pulsewidth_us(obj, ms * 1000);
mbed_official 390:35c2c1cf29cd 243 }
mbed_official 390:35c2c1cf29cd 244
mbed_official 390:35c2c1cf29cd 245 void pwmout_pulsewidth_us(pwmout_t* obj, int us) {
mbed_official 441:d2c15dda23c1 246 float value = 0;
mbed_official 441:d2c15dda23c1 247
mbed_official 441:d2c15dda23c1 248 if (obj->ch == 2) {
mbed_official 441:d2c15dda23c1 249 if (period_ch2 != 0) {
mbed_official 441:d2c15dda23c1 250 value = (float)us / (float)period_ch2;
mbed_official 441:d2c15dda23c1 251 }
mbed_official 441:d2c15dda23c1 252 } else {
mbed_official 441:d2c15dda23c1 253 if (period_ch1 != 0) {
mbed_official 441:d2c15dda23c1 254 value = (float)us / (float)period_ch1;
mbed_official 441:d2c15dda23c1 255 }
mbed_official 441:d2c15dda23c1 256 }
mbed_official 441:d2c15dda23c1 257
mbed_official 437:0b72c0f86db6 258 pwmout_write(obj, value);
mbed_official 390:35c2c1cf29cd 259 }