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 Jan 06 16:15:36 2015 +0000
Revision:
441:d2c15dda23c1
Parent:
437:0b72c0f86db6
Child:
500:04797f1feae2
Synchronized with git revision 245a60b29caabb42eabdd19658eeac7c3f68313b

Full URL: https://github.com/mbedmicro/mbed/commit/245a60b29caabb42eabdd19658eeac7c3f68313b/

NUCLEO_F072RB/F091RC - adding target to rtos lib and exporter for coide and gcc_arm

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