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 Feb 09 09:30:07 2015 +0000
Revision:
469:fc4922e0c183
Child:
630:825f75ca301e
Synchronized with git revision 06e2b3c8802cb4f78e9958ba9923755bd458e8b7

Full URL: https://github.com/mbedmicro/mbed/commit/06e2b3c8802cb4f78e9958ba9923755bd458e8b7/

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 469:fc4922e0c183 1 /* mbed Microcontroller Library
mbed_official 469:fc4922e0c183 2 *******************************************************************************
mbed_official 469:fc4922e0c183 3 * Copyright (c) 2014, STMicroelectronics
mbed_official 469:fc4922e0c183 4 * All rights reserved.
mbed_official 469:fc4922e0c183 5 *
mbed_official 469:fc4922e0c183 6 * Redistribution and use in source and binary forms, with or without
mbed_official 469:fc4922e0c183 7 * modification, are permitted provided that the following conditions are met:
mbed_official 469:fc4922e0c183 8 *
mbed_official 469:fc4922e0c183 9 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 469:fc4922e0c183 10 * this list of conditions and the following disclaimer.
mbed_official 469:fc4922e0c183 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 469:fc4922e0c183 12 * this list of conditions and the following disclaimer in the documentation
mbed_official 469:fc4922e0c183 13 * and/or other materials provided with the distribution.
mbed_official 469:fc4922e0c183 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 469:fc4922e0c183 15 * may be used to endorse or promote products derived from this software
mbed_official 469:fc4922e0c183 16 * without specific prior written permission.
mbed_official 469:fc4922e0c183 17 *
mbed_official 469:fc4922e0c183 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 469:fc4922e0c183 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 469:fc4922e0c183 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 469:fc4922e0c183 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 469:fc4922e0c183 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 469:fc4922e0c183 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 469:fc4922e0c183 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 469:fc4922e0c183 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 469:fc4922e0c183 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 469:fc4922e0c183 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 469:fc4922e0c183 28 *******************************************************************************
mbed_official 469:fc4922e0c183 29 */
mbed_official 469:fc4922e0c183 30 #include "pwmout_api.h"
mbed_official 469:fc4922e0c183 31
mbed_official 469:fc4922e0c183 32 #if DEVICE_PWMOUT
mbed_official 469:fc4922e0c183 33
mbed_official 469:fc4922e0c183 34 #include "cmsis.h"
mbed_official 469:fc4922e0c183 35 #include "pinmap.h"
mbed_official 469:fc4922e0c183 36 #include "mbed_error.h"
mbed_official 469:fc4922e0c183 37 #include "PeripheralPins.h"
mbed_official 469:fc4922e0c183 38
mbed_official 469:fc4922e0c183 39 static TIM_HandleTypeDef TimHandle;
mbed_official 469:fc4922e0c183 40
mbed_official 469:fc4922e0c183 41 void pwmout_init(pwmout_t* obj, PinName pin)
mbed_official 469:fc4922e0c183 42 {
mbed_official 469:fc4922e0c183 43 // Get the peripheral name from the pin and assign it to the object
mbed_official 469:fc4922e0c183 44 obj->pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
mbed_official 469:fc4922e0c183 45
mbed_official 469:fc4922e0c183 46 if (obj->pwm == (PWMName)NC) {
mbed_official 469:fc4922e0c183 47 error("PWM error: pinout mapping failed.");
mbed_official 469:fc4922e0c183 48 }
mbed_official 469:fc4922e0c183 49
mbed_official 469:fc4922e0c183 50 // Enable TIM clock
mbed_official 469:fc4922e0c183 51 #if defined(TIM1_BASE)
mbed_official 469:fc4922e0c183 52 if (obj->pwm == PWM_1) __TIM1_CLK_ENABLE();
mbed_official 469:fc4922e0c183 53 #endif
mbed_official 469:fc4922e0c183 54 #if defined(TIM2_BASE)
mbed_official 469:fc4922e0c183 55 if (obj->pwm == PWM_2) __TIM2_CLK_ENABLE();
mbed_official 469:fc4922e0c183 56 #endif
mbed_official 469:fc4922e0c183 57 if (obj->pwm == PWM_3) __TIM3_CLK_ENABLE();
mbed_official 469:fc4922e0c183 58 if (obj->pwm == PWM_14) __TIM14_CLK_ENABLE();
mbed_official 469:fc4922e0c183 59 if (obj->pwm == PWM_15) __TIM15_CLK_ENABLE();
mbed_official 469:fc4922e0c183 60 if (obj->pwm == PWM_16) __TIM16_CLK_ENABLE();
mbed_official 469:fc4922e0c183 61 if (obj->pwm == PWM_17) __TIM17_CLK_ENABLE();
mbed_official 469:fc4922e0c183 62
mbed_official 469:fc4922e0c183 63 // Configure GPIO
mbed_official 469:fc4922e0c183 64 pinmap_pinout(pin, PinMap_PWM);
mbed_official 469:fc4922e0c183 65
mbed_official 469:fc4922e0c183 66 obj->pin = pin;
mbed_official 469:fc4922e0c183 67 obj->period = 0;
mbed_official 469:fc4922e0c183 68 obj->pulse = 0;
mbed_official 469:fc4922e0c183 69
mbed_official 469:fc4922e0c183 70 pwmout_period_us(obj, 20000); // 20 ms per default
mbed_official 469:fc4922e0c183 71 }
mbed_official 469:fc4922e0c183 72
mbed_official 469:fc4922e0c183 73 void pwmout_free(pwmout_t* obj)
mbed_official 469:fc4922e0c183 74 {
mbed_official 469:fc4922e0c183 75 // Configure GPIO
mbed_official 469:fc4922e0c183 76 pin_function(obj->pin, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 469:fc4922e0c183 77 }
mbed_official 469:fc4922e0c183 78
mbed_official 469:fc4922e0c183 79 void pwmout_write(pwmout_t* obj, float value)
mbed_official 469:fc4922e0c183 80 {
mbed_official 469:fc4922e0c183 81 TIM_OC_InitTypeDef sConfig;
mbed_official 469:fc4922e0c183 82 int channel = 0;
mbed_official 469:fc4922e0c183 83 int complementary_channel = 0;
mbed_official 469:fc4922e0c183 84
mbed_official 469:fc4922e0c183 85 TimHandle.Instance = (TIM_TypeDef *)(obj->pwm);
mbed_official 469:fc4922e0c183 86
mbed_official 469:fc4922e0c183 87 if (value < (float)0.0) {
mbed_official 469:fc4922e0c183 88 value = 0.0;
mbed_official 469:fc4922e0c183 89 } else if (value > (float)1.0) {
mbed_official 469:fc4922e0c183 90 value = 1.0;
mbed_official 469:fc4922e0c183 91 }
mbed_official 469:fc4922e0c183 92
mbed_official 469:fc4922e0c183 93 obj->pulse = (uint32_t)((float)obj->period * value);
mbed_official 469:fc4922e0c183 94
mbed_official 469:fc4922e0c183 95 // Configure channels
mbed_official 469:fc4922e0c183 96 sConfig.OCMode = TIM_OCMODE_PWM1;
mbed_official 469:fc4922e0c183 97 sConfig.Pulse = obj->pulse;
mbed_official 469:fc4922e0c183 98 sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
mbed_official 469:fc4922e0c183 99 sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
mbed_official 469:fc4922e0c183 100 sConfig.OCFastMode = TIM_OCFAST_DISABLE;
mbed_official 469:fc4922e0c183 101 sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
mbed_official 469:fc4922e0c183 102 sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
mbed_official 469:fc4922e0c183 103
mbed_official 469:fc4922e0c183 104 #if defined (TARGET_STM32F030R8) || defined (TARGET_STM32F051R8)
mbed_official 469:fc4922e0c183 105 switch (obj->pin) {
mbed_official 469:fc4922e0c183 106 // Channels 1
mbed_official 469:fc4922e0c183 107 case PA_4:
mbed_official 469:fc4922e0c183 108 case PA_6:
mbed_official 469:fc4922e0c183 109 case PB_1:
mbed_official 469:fc4922e0c183 110 case PB_4:
mbed_official 469:fc4922e0c183 111 case PB_8:
mbed_official 469:fc4922e0c183 112 case PB_9:
mbed_official 469:fc4922e0c183 113 case PB_14:
mbed_official 469:fc4922e0c183 114 case PC_6:
mbed_official 469:fc4922e0c183 115 channel = TIM_CHANNEL_1;
mbed_official 469:fc4922e0c183 116 break;
mbed_official 469:fc4922e0c183 117 // Channels 1N
mbed_official 469:fc4922e0c183 118 case PB_6:
mbed_official 469:fc4922e0c183 119 case PB_7:
mbed_official 469:fc4922e0c183 120 channel = TIM_CHANNEL_1;
mbed_official 469:fc4922e0c183 121 complementary_channel = 1;
mbed_official 469:fc4922e0c183 122 break;
mbed_official 469:fc4922e0c183 123 // Channels 2
mbed_official 469:fc4922e0c183 124 case PA_7:
mbed_official 469:fc4922e0c183 125 case PB_5:
mbed_official 469:fc4922e0c183 126 case PB_15:
mbed_official 469:fc4922e0c183 127 case PC_7:
mbed_official 469:fc4922e0c183 128 channel = TIM_CHANNEL_2;
mbed_official 469:fc4922e0c183 129 break;
mbed_official 469:fc4922e0c183 130 // Channels 3
mbed_official 469:fc4922e0c183 131 case PB_0:
mbed_official 469:fc4922e0c183 132 case PC_8:
mbed_official 469:fc4922e0c183 133 channel = TIM_CHANNEL_3;
mbed_official 469:fc4922e0c183 134 break;
mbed_official 469:fc4922e0c183 135 // Channels 4
mbed_official 469:fc4922e0c183 136 case PC_9:
mbed_official 469:fc4922e0c183 137 channel = TIM_CHANNEL_4;
mbed_official 469:fc4922e0c183 138 break;
mbed_official 469:fc4922e0c183 139 default:
mbed_official 469:fc4922e0c183 140 return;
mbed_official 469:fc4922e0c183 141 }
mbed_official 469:fc4922e0c183 142
mbed_official 469:fc4922e0c183 143 #else
mbed_official 469:fc4922e0c183 144 switch (obj->pin) {
mbed_official 469:fc4922e0c183 145 // Channels 1
mbed_official 469:fc4922e0c183 146 case PA_2:
mbed_official 469:fc4922e0c183 147 case PA_4:
mbed_official 469:fc4922e0c183 148 case PA_6:
mbed_official 469:fc4922e0c183 149 case PA_7:
mbed_official 469:fc4922e0c183 150 case PA_8:
mbed_official 469:fc4922e0c183 151 case PB_1:
mbed_official 469:fc4922e0c183 152 case PB_4:
mbed_official 469:fc4922e0c183 153 case PB_8:
mbed_official 469:fc4922e0c183 154 case PB_9:
mbed_official 469:fc4922e0c183 155 case PB_14:
mbed_official 469:fc4922e0c183 156 case PC_6:
mbed_official 469:fc4922e0c183 157 channel = TIM_CHANNEL_1;
mbed_official 469:fc4922e0c183 158 break;
mbed_official 469:fc4922e0c183 159 // Channels 1N
mbed_official 469:fc4922e0c183 160 case PA_1:
mbed_official 469:fc4922e0c183 161 case PB_6:
mbed_official 469:fc4922e0c183 162 case PB_7:
mbed_official 469:fc4922e0c183 163 case PB_13:
mbed_official 469:fc4922e0c183 164 channel = TIM_CHANNEL_1;
mbed_official 469:fc4922e0c183 165 complementary_channel = 1;
mbed_official 469:fc4922e0c183 166 break;
mbed_official 469:fc4922e0c183 167 // Channels 2
mbed_official 469:fc4922e0c183 168 case PA_3:
mbed_official 469:fc4922e0c183 169 case PA_9:
mbed_official 469:fc4922e0c183 170 case PB_5:
mbed_official 469:fc4922e0c183 171 case PB_15:
mbed_official 469:fc4922e0c183 172 case PC_7:
mbed_official 469:fc4922e0c183 173 channel = TIM_CHANNEL_2;
mbed_official 469:fc4922e0c183 174 break;
mbed_official 469:fc4922e0c183 175 // Channels 3
mbed_official 469:fc4922e0c183 176 case PA_10:
mbed_official 469:fc4922e0c183 177 case PB_0:
mbed_official 469:fc4922e0c183 178 case PC_8:
mbed_official 469:fc4922e0c183 179 channel = TIM_CHANNEL_3;
mbed_official 469:fc4922e0c183 180 break;
mbed_official 469:fc4922e0c183 181 // Channels 4
mbed_official 469:fc4922e0c183 182 case PA_11:
mbed_official 469:fc4922e0c183 183 case PC_9:
mbed_official 469:fc4922e0c183 184 channel = TIM_CHANNEL_4;
mbed_official 469:fc4922e0c183 185 break;
mbed_official 469:fc4922e0c183 186 default:
mbed_official 469:fc4922e0c183 187 return;
mbed_official 469:fc4922e0c183 188 }
mbed_official 469:fc4922e0c183 189
mbed_official 469:fc4922e0c183 190 #endif
mbed_official 469:fc4922e0c183 191
mbed_official 469:fc4922e0c183 192 HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, channel);
mbed_official 469:fc4922e0c183 193
mbed_official 469:fc4922e0c183 194 if (complementary_channel) {
mbed_official 469:fc4922e0c183 195 HAL_TIMEx_PWMN_Start(&TimHandle, channel);
mbed_official 469:fc4922e0c183 196 } else {
mbed_official 469:fc4922e0c183 197 HAL_TIM_PWM_Start(&TimHandle, channel);
mbed_official 469:fc4922e0c183 198 }
mbed_official 469:fc4922e0c183 199 }
mbed_official 469:fc4922e0c183 200
mbed_official 469:fc4922e0c183 201 float pwmout_read(pwmout_t* obj)
mbed_official 469:fc4922e0c183 202 {
mbed_official 469:fc4922e0c183 203 float value = 0;
mbed_official 469:fc4922e0c183 204 if (obj->period > 0) {
mbed_official 469:fc4922e0c183 205 value = (float)(obj->pulse) / (float)(obj->period);
mbed_official 469:fc4922e0c183 206 }
mbed_official 469:fc4922e0c183 207 return ((value > (float)1.0) ? (float)(1.0) : (value));
mbed_official 469:fc4922e0c183 208 }
mbed_official 469:fc4922e0c183 209
mbed_official 469:fc4922e0c183 210 void pwmout_period(pwmout_t* obj, float seconds)
mbed_official 469:fc4922e0c183 211 {
mbed_official 469:fc4922e0c183 212 pwmout_period_us(obj, seconds * 1000000.0f);
mbed_official 469:fc4922e0c183 213 }
mbed_official 469:fc4922e0c183 214
mbed_official 469:fc4922e0c183 215 void pwmout_period_ms(pwmout_t* obj, int ms)
mbed_official 469:fc4922e0c183 216 {
mbed_official 469:fc4922e0c183 217 pwmout_period_us(obj, ms * 1000);
mbed_official 469:fc4922e0c183 218 }
mbed_official 469:fc4922e0c183 219
mbed_official 469:fc4922e0c183 220 void pwmout_period_us(pwmout_t* obj, int us)
mbed_official 469:fc4922e0c183 221 {
mbed_official 469:fc4922e0c183 222 TimHandle.Instance = (TIM_TypeDef *)(obj->pwm);
mbed_official 469:fc4922e0c183 223
mbed_official 469:fc4922e0c183 224 float dc = pwmout_read(obj);
mbed_official 469:fc4922e0c183 225
mbed_official 469:fc4922e0c183 226 __HAL_TIM_DISABLE(&TimHandle);
mbed_official 469:fc4922e0c183 227
mbed_official 469:fc4922e0c183 228 // Update the SystemCoreClock variable
mbed_official 469:fc4922e0c183 229 SystemCoreClockUpdate();
mbed_official 469:fc4922e0c183 230
mbed_official 469:fc4922e0c183 231 TimHandle.Init.Period = us - 1;
mbed_official 469:fc4922e0c183 232 TimHandle.Init.Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick
mbed_official 469:fc4922e0c183 233 TimHandle.Init.ClockDivision = 0;
mbed_official 469:fc4922e0c183 234 TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
mbed_official 469:fc4922e0c183 235 HAL_TIM_PWM_Init(&TimHandle);
mbed_official 469:fc4922e0c183 236
mbed_official 469:fc4922e0c183 237 // Set duty cycle again
mbed_official 469:fc4922e0c183 238 pwmout_write(obj, dc);
mbed_official 469:fc4922e0c183 239
mbed_official 469:fc4922e0c183 240 // Save for future use
mbed_official 469:fc4922e0c183 241 obj->period = us;
mbed_official 469:fc4922e0c183 242
mbed_official 469:fc4922e0c183 243 __HAL_TIM_ENABLE(&TimHandle);
mbed_official 469:fc4922e0c183 244 }
mbed_official 469:fc4922e0c183 245
mbed_official 469:fc4922e0c183 246 void pwmout_pulsewidth(pwmout_t* obj, float seconds)
mbed_official 469:fc4922e0c183 247 {
mbed_official 469:fc4922e0c183 248 pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
mbed_official 469:fc4922e0c183 249 }
mbed_official 469:fc4922e0c183 250
mbed_official 469:fc4922e0c183 251 void pwmout_pulsewidth_ms(pwmout_t* obj, int ms)
mbed_official 469:fc4922e0c183 252 {
mbed_official 469:fc4922e0c183 253 pwmout_pulsewidth_us(obj, ms * 1000);
mbed_official 469:fc4922e0c183 254 }
mbed_official 469:fc4922e0c183 255
mbed_official 469:fc4922e0c183 256 void pwmout_pulsewidth_us(pwmout_t* obj, int us)
mbed_official 469:fc4922e0c183 257 {
mbed_official 469:fc4922e0c183 258 float value = (float)us / (float)obj->period;
mbed_official 469:fc4922e0c183 259 pwmout_write(obj, value);
mbed_official 469:fc4922e0c183 260 }
mbed_official 469:fc4922e0c183 261
mbed_official 469:fc4922e0c183 262 #endif