mbed library sources for GR-PEACH rev.B.

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Tue Mar 31 16:15:13 2015 +0100
Revision:
500:04797f1feae2
Parent:
441:d2c15dda23c1
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 }