mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /* mbed Microcontroller Library
AnnaBridge 189:f392fc9709a3 2 * Copyright (c) 2013-2016 Realtek Semiconductor Corp.
AnnaBridge 189:f392fc9709a3 3 *
AnnaBridge 189:f392fc9709a3 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 189:f392fc9709a3 5 * you may not use this file except in compliance with the License.
AnnaBridge 189:f392fc9709a3 6 * You may obtain a copy of the License at
AnnaBridge 189:f392fc9709a3 7 *
AnnaBridge 189:f392fc9709a3 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 189:f392fc9709a3 9 *
AnnaBridge 189:f392fc9709a3 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 189:f392fc9709a3 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 189:f392fc9709a3 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 189:f392fc9709a3 13 * See the License for the specific language governing permissions and
AnnaBridge 189:f392fc9709a3 14 * limitations under the License.
AnnaBridge 189:f392fc9709a3 15 */
AnnaBridge 189:f392fc9709a3 16
AnnaBridge 189:f392fc9709a3 17 #include "device.h"
AnnaBridge 189:f392fc9709a3 18 #include "objects.h"
AnnaBridge 189:f392fc9709a3 19 #include "pinmap.h"
AnnaBridge 189:f392fc9709a3 20
AnnaBridge 189:f392fc9709a3 21 #ifdef CONFIG_MBED_ENABLED
AnnaBridge 189:f392fc9709a3 22 #include "platform_stdlib.h"
AnnaBridge 189:f392fc9709a3 23 #endif
AnnaBridge 189:f392fc9709a3 24
AnnaBridge 189:f392fc9709a3 25 #if DEVICE_PWMOUT
AnnaBridge 189:f392fc9709a3 26
AnnaBridge 189:f392fc9709a3 27 #ifdef CONFIG_PWM_EN
AnnaBridge 189:f392fc9709a3 28 #include "pwmout_api.h"
AnnaBridge 189:f392fc9709a3 29
AnnaBridge 189:f392fc9709a3 30 #ifdef CONFIG_MBED_ENABLED
AnnaBridge 189:f392fc9709a3 31 #include "PeripheralPins.h"
AnnaBridge 189:f392fc9709a3 32 #else
AnnaBridge 189:f392fc9709a3 33 static const PinMap PinMap_PWM[] = {
AnnaBridge 189:f392fc9709a3 34 {PB_4, RTL_PIN_PERI(PWM0, 0, S0), RTL_PIN_FUNC(PWM0, S0)},
AnnaBridge 189:f392fc9709a3 35 {PB_5, RTL_PIN_PERI(PWM1, 1, S0), RTL_PIN_FUNC(PWM1, S0)},
AnnaBridge 189:f392fc9709a3 36 {PB_6, RTL_PIN_PERI(PWM2, 2, S0), RTL_PIN_FUNC(PWM2, S0)},
AnnaBridge 189:f392fc9709a3 37 {PB_7, RTL_PIN_PERI(PWM3, 3, S0), RTL_PIN_FUNC(PWM3, S0)},
AnnaBridge 189:f392fc9709a3 38
AnnaBridge 189:f392fc9709a3 39 {PC_0, RTL_PIN_PERI(PWM0, 0, S1), RTL_PIN_FUNC(PWM0, S1)},
AnnaBridge 189:f392fc9709a3 40 {PC_1, RTL_PIN_PERI(PWM1, 1, S1), RTL_PIN_FUNC(PWM1, S1)},
AnnaBridge 189:f392fc9709a3 41 {PC_2, RTL_PIN_PERI(PWM2, 2, S1), RTL_PIN_FUNC(PWM2, S1)},
AnnaBridge 189:f392fc9709a3 42 {PC_3, RTL_PIN_PERI(PWM3, 3, S1), RTL_PIN_FUNC(PWM3, S1)},
AnnaBridge 189:f392fc9709a3 43
AnnaBridge 189:f392fc9709a3 44 {PD_3, RTL_PIN_PERI(PWM0, 0, S2), RTL_PIN_FUNC(PWM0, S2)},
AnnaBridge 189:f392fc9709a3 45 {PD_4, RTL_PIN_PERI(PWM1, 1, S2), RTL_PIN_FUNC(PWM1, S2)},
AnnaBridge 189:f392fc9709a3 46 {PD_5, RTL_PIN_PERI(PWM2, 2, S2), RTL_PIN_FUNC(PWM2, S2)},
AnnaBridge 189:f392fc9709a3 47 {PD_6, RTL_PIN_PERI(PWM3, 3, S2), RTL_PIN_FUNC(PWM3, S2)},
AnnaBridge 189:f392fc9709a3 48
AnnaBridge 189:f392fc9709a3 49 {PE_0, RTL_PIN_PERI(PWM0, 0, S3), RTL_PIN_FUNC(PWM0, S3)},
AnnaBridge 189:f392fc9709a3 50 {PE_1, RTL_PIN_PERI(PWM1, 1, S3), RTL_PIN_FUNC(PWM1, S3)},
AnnaBridge 189:f392fc9709a3 51 {PE_2, RTL_PIN_PERI(PWM2, 2, S3), RTL_PIN_FUNC(PWM2, S3)},
AnnaBridge 189:f392fc9709a3 52 {PE_3, RTL_PIN_PERI(PWM3, 3, S3), RTL_PIN_FUNC(PWM3, S3)},
AnnaBridge 189:f392fc9709a3 53
AnnaBridge 189:f392fc9709a3 54 {NC, NC, 0}
AnnaBridge 189:f392fc9709a3 55 };
AnnaBridge 189:f392fc9709a3 56 #endif
AnnaBridge 189:f392fc9709a3 57
AnnaBridge 189:f392fc9709a3 58 void pwmout_init(pwmout_t* obj, PinName pin)
AnnaBridge 189:f392fc9709a3 59 {
AnnaBridge 189:f392fc9709a3 60 int peripheral;
AnnaBridge 189:f392fc9709a3 61 u32 pwm_idx;
AnnaBridge 189:f392fc9709a3 62 u32 pin_sel;
AnnaBridge 189:f392fc9709a3 63
AnnaBridge 189:f392fc9709a3 64 DBG_PWM_INFO("%s: Init PWM for pin(0x%x)\n", __FUNCTION__, pin);
AnnaBridge 189:f392fc9709a3 65
AnnaBridge 189:f392fc9709a3 66 // Get the peripheral name from the pin and assign it to the object
AnnaBridge 189:f392fc9709a3 67 peripheral = pinmap_peripheral(pin, PinMap_PWM);
AnnaBridge 189:f392fc9709a3 68
AnnaBridge 189:f392fc9709a3 69 if (unlikely(peripheral == NC)) {
AnnaBridge 189:f392fc9709a3 70 DBG_PWM_ERR("%s: Cannot find matched pwm for this pin(0x%x)\n", __FUNCTION__, pin);
AnnaBridge 189:f392fc9709a3 71 return;
AnnaBridge 189:f392fc9709a3 72 }
AnnaBridge 189:f392fc9709a3 73
AnnaBridge 189:f392fc9709a3 74 pwm_idx = RTL_GET_PERI_IDX(peripheral);
AnnaBridge 189:f392fc9709a3 75 pin_sel = RTL_GET_PERI_SEL(peripheral);
AnnaBridge 189:f392fc9709a3 76
AnnaBridge 189:f392fc9709a3 77 obj->pwm_idx = pwm_idx;
AnnaBridge 189:f392fc9709a3 78 obj->pin_sel = pin_sel;
AnnaBridge 189:f392fc9709a3 79 obj->period = 0;
AnnaBridge 189:f392fc9709a3 80 obj->pulse = 0;
AnnaBridge 189:f392fc9709a3 81 _memset((void *)&obj->pwm_hal_adp, 0, sizeof(HAL_PWM_ADAPTER));
AnnaBridge 189:f392fc9709a3 82 if (HAL_OK != HAL_Pwm_Init(&obj->pwm_hal_adp, pwm_idx, pin_sel)) {
AnnaBridge 189:f392fc9709a3 83 DBG_PWM_ERR("pwmout_init Err!\n");
AnnaBridge 189:f392fc9709a3 84 return;
AnnaBridge 189:f392fc9709a3 85 }
AnnaBridge 189:f392fc9709a3 86 pwmout_period_us(obj, 20000); // 20 ms per default
AnnaBridge 189:f392fc9709a3 87 HAL_Pwm_Enable(&obj->pwm_hal_adp);
AnnaBridge 189:f392fc9709a3 88 }
AnnaBridge 189:f392fc9709a3 89
AnnaBridge 189:f392fc9709a3 90 void pwmout_free(pwmout_t* obj)
AnnaBridge 189:f392fc9709a3 91 {
AnnaBridge 189:f392fc9709a3 92 HAL_Pwm_Disable(&obj->pwm_hal_adp);
AnnaBridge 189:f392fc9709a3 93 }
AnnaBridge 189:f392fc9709a3 94
AnnaBridge 189:f392fc9709a3 95 void pwmout_write(pwmout_t* obj, float value)
AnnaBridge 189:f392fc9709a3 96 {
AnnaBridge 189:f392fc9709a3 97 if (value < (float)0.0) {
AnnaBridge 189:f392fc9709a3 98 value = 0.0;
AnnaBridge 189:f392fc9709a3 99 } else if (value > (float)1.0) {
AnnaBridge 189:f392fc9709a3 100 value = 1.0;
AnnaBridge 189:f392fc9709a3 101 }
AnnaBridge 189:f392fc9709a3 102
AnnaBridge 189:f392fc9709a3 103 obj->pulse = (uint32_t)((float)obj->period * value);
AnnaBridge 189:f392fc9709a3 104 HAL_Pwm_SetDuty(&obj->pwm_hal_adp, obj->period, obj->pulse);
AnnaBridge 189:f392fc9709a3 105 }
AnnaBridge 189:f392fc9709a3 106
AnnaBridge 189:f392fc9709a3 107 float pwmout_read(pwmout_t* obj)
AnnaBridge 189:f392fc9709a3 108 {
AnnaBridge 189:f392fc9709a3 109 float value = 0;
AnnaBridge 189:f392fc9709a3 110 if (obj->period > 0) {
AnnaBridge 189:f392fc9709a3 111 value = (float)(obj->pulse) / (float)(obj->period);
AnnaBridge 189:f392fc9709a3 112 }
AnnaBridge 189:f392fc9709a3 113 return ((value > (float)1.0) ? (float)(1.0) : (value));
AnnaBridge 189:f392fc9709a3 114 }
AnnaBridge 189:f392fc9709a3 115
AnnaBridge 189:f392fc9709a3 116 void pwmout_period(pwmout_t* obj, float seconds)
AnnaBridge 189:f392fc9709a3 117 {
AnnaBridge 189:f392fc9709a3 118 pwmout_period_us(obj, (int)(seconds * 1000000.0f));
AnnaBridge 189:f392fc9709a3 119 }
AnnaBridge 189:f392fc9709a3 120
AnnaBridge 189:f392fc9709a3 121 void pwmout_period_ms(pwmout_t* obj, int ms)
AnnaBridge 189:f392fc9709a3 122 {
AnnaBridge 189:f392fc9709a3 123 pwmout_period_us(obj, (int)(ms * 1000));
AnnaBridge 189:f392fc9709a3 124 }
AnnaBridge 189:f392fc9709a3 125
AnnaBridge 189:f392fc9709a3 126 void pwmout_period_us(pwmout_t* obj, int us)
AnnaBridge 189:f392fc9709a3 127 {
AnnaBridge 189:f392fc9709a3 128 float dc = pwmout_read(obj);
AnnaBridge 189:f392fc9709a3 129
AnnaBridge 189:f392fc9709a3 130 obj->period = us;
AnnaBridge 189:f392fc9709a3 131 // Set duty cycle again
AnnaBridge 189:f392fc9709a3 132 pwmout_write(obj, dc);
AnnaBridge 189:f392fc9709a3 133 }
AnnaBridge 189:f392fc9709a3 134
AnnaBridge 189:f392fc9709a3 135 void pwmout_pulsewidth(pwmout_t* obj, float seconds)
AnnaBridge 189:f392fc9709a3 136 {
AnnaBridge 189:f392fc9709a3 137 pwmout_pulsewidth_us(obj, (int)(seconds * 1000000.0f));
AnnaBridge 189:f392fc9709a3 138 }
AnnaBridge 189:f392fc9709a3 139
AnnaBridge 189:f392fc9709a3 140 void pwmout_pulsewidth_ms(pwmout_t* obj, int ms)
AnnaBridge 189:f392fc9709a3 141 {
AnnaBridge 189:f392fc9709a3 142 pwmout_pulsewidth_us(obj, ms * 1000);
AnnaBridge 189:f392fc9709a3 143 }
AnnaBridge 189:f392fc9709a3 144
AnnaBridge 189:f392fc9709a3 145 void pwmout_pulsewidth_us(pwmout_t* obj, int us)
AnnaBridge 189:f392fc9709a3 146 {
AnnaBridge 189:f392fc9709a3 147 float value = (float)us / (float)obj->period;
AnnaBridge 189:f392fc9709a3 148 pwmout_write(obj, value);
AnnaBridge 189:f392fc9709a3 149 }
AnnaBridge 189:f392fc9709a3 150
AnnaBridge 189:f392fc9709a3 151 #endif // #ifdef CONFIG_PWM_EN
AnnaBridge 189:f392fc9709a3 152 #endif // #if DEVICE_PWMOUT