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 Sep 28 10:45:10 2015 +0100
Revision:
630:825f75ca301e
Parent:
469:fc4922e0c183
Synchronized with git revision 54fbe4144faf309c37205a5d39fa665daa919f10

Full URL: https://github.com/mbedmicro/mbed/commit/54fbe4144faf309c37205a5d39fa665daa919f10/

NUCLEO_F031K6 : Add new target

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 630:825f75ca301e 41 void pwmout_init(pwmout_t* obj, PinName pin) {
mbed_official 469:fc4922e0c183 42 // Get the peripheral name from the pin and assign it to the object
mbed_official 469:fc4922e0c183 43 obj->pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
mbed_official 469:fc4922e0c183 44
mbed_official 469:fc4922e0c183 45 if (obj->pwm == (PWMName)NC) {
mbed_official 469:fc4922e0c183 46 error("PWM error: pinout mapping failed.");
mbed_official 469:fc4922e0c183 47 }
mbed_official 469:fc4922e0c183 48
mbed_official 469:fc4922e0c183 49 // Enable TIM clock
mbed_official 469:fc4922e0c183 50 #if defined(TIM1_BASE)
mbed_official 469:fc4922e0c183 51 if (obj->pwm == PWM_1) __TIM1_CLK_ENABLE();
mbed_official 469:fc4922e0c183 52 #endif
mbed_official 469:fc4922e0c183 53 #if defined(TIM2_BASE)
mbed_official 469:fc4922e0c183 54 if (obj->pwm == PWM_2) __TIM2_CLK_ENABLE();
mbed_official 469:fc4922e0c183 55 #endif
mbed_official 630:825f75ca301e 56 #if defined(TIM3_BASE)
mbed_official 469:fc4922e0c183 57 if (obj->pwm == PWM_3) __TIM3_CLK_ENABLE();
mbed_official 630:825f75ca301e 58 #endif
mbed_official 630:825f75ca301e 59 #if defined(TIM14_BASE)
mbed_official 469:fc4922e0c183 60 if (obj->pwm == PWM_14) __TIM14_CLK_ENABLE();
mbed_official 630:825f75ca301e 61 #endif
mbed_official 630:825f75ca301e 62 #if defined(TIM15_BASE)
mbed_official 469:fc4922e0c183 63 if (obj->pwm == PWM_15) __TIM15_CLK_ENABLE();
mbed_official 630:825f75ca301e 64 #endif
mbed_official 630:825f75ca301e 65 #if defined(TIM16_BASE)
mbed_official 469:fc4922e0c183 66 if (obj->pwm == PWM_16) __TIM16_CLK_ENABLE();
mbed_official 630:825f75ca301e 67 #endif
mbed_official 630:825f75ca301e 68 #if defined(TIM17_BASE)
mbed_official 469:fc4922e0c183 69 if (obj->pwm == PWM_17) __TIM17_CLK_ENABLE();
mbed_official 630:825f75ca301e 70 #endif
mbed_official 469:fc4922e0c183 71
mbed_official 469:fc4922e0c183 72 // Configure GPIO
mbed_official 469:fc4922e0c183 73 pinmap_pinout(pin, PinMap_PWM);
mbed_official 469:fc4922e0c183 74
mbed_official 469:fc4922e0c183 75 obj->pin = pin;
mbed_official 469:fc4922e0c183 76 obj->period = 0;
mbed_official 469:fc4922e0c183 77 obj->pulse = 0;
mbed_official 469:fc4922e0c183 78
mbed_official 469:fc4922e0c183 79 pwmout_period_us(obj, 20000); // 20 ms per default
mbed_official 469:fc4922e0c183 80 }
mbed_official 469:fc4922e0c183 81
mbed_official 630:825f75ca301e 82 void pwmout_free(pwmout_t* obj) {
mbed_official 469:fc4922e0c183 83 // Configure GPIO
mbed_official 469:fc4922e0c183 84 pin_function(obj->pin, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 469:fc4922e0c183 85 }
mbed_official 469:fc4922e0c183 86
mbed_official 630:825f75ca301e 87 void pwmout_write(pwmout_t* obj, float value) {
mbed_official 469:fc4922e0c183 88 TIM_OC_InitTypeDef sConfig;
mbed_official 469:fc4922e0c183 89 int channel = 0;
mbed_official 469:fc4922e0c183 90 int complementary_channel = 0;
mbed_official 469:fc4922e0c183 91
mbed_official 469:fc4922e0c183 92 TimHandle.Instance = (TIM_TypeDef *)(obj->pwm);
mbed_official 469:fc4922e0c183 93
mbed_official 469:fc4922e0c183 94 if (value < (float)0.0) {
mbed_official 469:fc4922e0c183 95 value = 0.0;
mbed_official 469:fc4922e0c183 96 } else if (value > (float)1.0) {
mbed_official 469:fc4922e0c183 97 value = 1.0;
mbed_official 469:fc4922e0c183 98 }
mbed_official 469:fc4922e0c183 99
mbed_official 469:fc4922e0c183 100 obj->pulse = (uint32_t)((float)obj->period * value);
mbed_official 469:fc4922e0c183 101
mbed_official 469:fc4922e0c183 102 // Configure channels
mbed_official 469:fc4922e0c183 103 sConfig.OCMode = TIM_OCMODE_PWM1;
mbed_official 469:fc4922e0c183 104 sConfig.Pulse = obj->pulse;
mbed_official 469:fc4922e0c183 105 sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
mbed_official 469:fc4922e0c183 106 sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
mbed_official 469:fc4922e0c183 107 sConfig.OCFastMode = TIM_OCFAST_DISABLE;
mbed_official 469:fc4922e0c183 108 sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
mbed_official 469:fc4922e0c183 109 sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
mbed_official 469:fc4922e0c183 110
mbed_official 630:825f75ca301e 111 #if defined (TARGET_STM32F031K6)
mbed_official 630:825f75ca301e 112 switch (obj->pin) {
mbed_official 630:825f75ca301e 113 // Channels 1
mbed_official 630:825f75ca301e 114 case PA_4:
mbed_official 630:825f75ca301e 115 case PA_6:
mbed_official 630:825f75ca301e 116 case PA_8:
mbed_official 630:825f75ca301e 117 case PB_4:
mbed_official 630:825f75ca301e 118 channel = TIM_CHANNEL_1;
mbed_official 630:825f75ca301e 119 break;
mbed_official 630:825f75ca301e 120 // Channels 1N
mbed_official 630:825f75ca301e 121 case PB_6:
mbed_official 630:825f75ca301e 122 case PB_7:
mbed_official 630:825f75ca301e 123 channel = TIM_CHANNEL_1;
mbed_official 630:825f75ca301e 124 complementary_channel = 1;
mbed_official 630:825f75ca301e 125 break;
mbed_official 630:825f75ca301e 126 // Channels 2
mbed_official 630:825f75ca301e 127 case PA_7:
mbed_official 630:825f75ca301e 128 case PA_9:
mbed_official 630:825f75ca301e 129 case PB_5:
mbed_official 630:825f75ca301e 130 channel = TIM_CHANNEL_2;
mbed_official 630:825f75ca301e 131 break;
mbed_official 630:825f75ca301e 132 // Channels 3
mbed_official 630:825f75ca301e 133 case PA_10:
mbed_official 630:825f75ca301e 134 case PB_0:
mbed_official 630:825f75ca301e 135 channel = TIM_CHANNEL_3;
mbed_official 630:825f75ca301e 136 break;
mbed_official 630:825f75ca301e 137 // Channels 4
mbed_official 630:825f75ca301e 138 case PA_11:
mbed_official 630:825f75ca301e 139 case PB_1:
mbed_official 630:825f75ca301e 140 channel = TIM_CHANNEL_4;
mbed_official 630:825f75ca301e 141 break;
mbed_official 630:825f75ca301e 142 default:
mbed_official 630:825f75ca301e 143 return;
mbed_official 630:825f75ca301e 144 }
mbed_official 630:825f75ca301e 145 #elif defined (TARGET_STM32F030R8) || defined (TARGET_STM32F051R8)
mbed_official 469:fc4922e0c183 146 switch (obj->pin) {
mbed_official 469:fc4922e0c183 147 // Channels 1
mbed_official 469:fc4922e0c183 148 case PA_4:
mbed_official 469:fc4922e0c183 149 case PA_6:
mbed_official 469:fc4922e0c183 150 case PB_1:
mbed_official 469:fc4922e0c183 151 case PB_4:
mbed_official 469:fc4922e0c183 152 case PB_8:
mbed_official 469:fc4922e0c183 153 case PB_9:
mbed_official 469:fc4922e0c183 154 case PB_14:
mbed_official 469:fc4922e0c183 155 case PC_6:
mbed_official 469:fc4922e0c183 156 channel = TIM_CHANNEL_1;
mbed_official 469:fc4922e0c183 157 break;
mbed_official 469:fc4922e0c183 158 // Channels 1N
mbed_official 469:fc4922e0c183 159 case PB_6:
mbed_official 469:fc4922e0c183 160 case PB_7:
mbed_official 469:fc4922e0c183 161 channel = TIM_CHANNEL_1;
mbed_official 469:fc4922e0c183 162 complementary_channel = 1;
mbed_official 469:fc4922e0c183 163 break;
mbed_official 469:fc4922e0c183 164 // Channels 2
mbed_official 469:fc4922e0c183 165 case PA_7:
mbed_official 469:fc4922e0c183 166 case PB_5:
mbed_official 469:fc4922e0c183 167 case PB_15:
mbed_official 469:fc4922e0c183 168 case PC_7:
mbed_official 469:fc4922e0c183 169 channel = TIM_CHANNEL_2;
mbed_official 469:fc4922e0c183 170 break;
mbed_official 469:fc4922e0c183 171 // Channels 3
mbed_official 469:fc4922e0c183 172 case PB_0:
mbed_official 469:fc4922e0c183 173 case PC_8:
mbed_official 469:fc4922e0c183 174 channel = TIM_CHANNEL_3;
mbed_official 469:fc4922e0c183 175 break;
mbed_official 469:fc4922e0c183 176 // Channels 4
mbed_official 469:fc4922e0c183 177 case PC_9:
mbed_official 469:fc4922e0c183 178 channel = TIM_CHANNEL_4;
mbed_official 469:fc4922e0c183 179 break;
mbed_official 469:fc4922e0c183 180 default:
mbed_official 469:fc4922e0c183 181 return;
mbed_official 469:fc4922e0c183 182 }
mbed_official 469:fc4922e0c183 183
mbed_official 469:fc4922e0c183 184 #else
mbed_official 469:fc4922e0c183 185 switch (obj->pin) {
mbed_official 469:fc4922e0c183 186 // Channels 1
mbed_official 469:fc4922e0c183 187 case PA_2:
mbed_official 469:fc4922e0c183 188 case PA_4:
mbed_official 469:fc4922e0c183 189 case PA_6:
mbed_official 469:fc4922e0c183 190 case PA_7:
mbed_official 469:fc4922e0c183 191 case PA_8:
mbed_official 469:fc4922e0c183 192 case PB_1:
mbed_official 469:fc4922e0c183 193 case PB_4:
mbed_official 469:fc4922e0c183 194 case PB_8:
mbed_official 469:fc4922e0c183 195 case PB_9:
mbed_official 469:fc4922e0c183 196 case PB_14:
mbed_official 469:fc4922e0c183 197 case PC_6:
mbed_official 469:fc4922e0c183 198 channel = TIM_CHANNEL_1;
mbed_official 469:fc4922e0c183 199 break;
mbed_official 469:fc4922e0c183 200 // Channels 1N
mbed_official 469:fc4922e0c183 201 case PA_1:
mbed_official 469:fc4922e0c183 202 case PB_6:
mbed_official 469:fc4922e0c183 203 case PB_7:
mbed_official 469:fc4922e0c183 204 case PB_13:
mbed_official 469:fc4922e0c183 205 channel = TIM_CHANNEL_1;
mbed_official 469:fc4922e0c183 206 complementary_channel = 1;
mbed_official 469:fc4922e0c183 207 break;
mbed_official 469:fc4922e0c183 208 // Channels 2
mbed_official 469:fc4922e0c183 209 case PA_3:
mbed_official 469:fc4922e0c183 210 case PA_9:
mbed_official 469:fc4922e0c183 211 case PB_5:
mbed_official 469:fc4922e0c183 212 case PB_15:
mbed_official 469:fc4922e0c183 213 case PC_7:
mbed_official 469:fc4922e0c183 214 channel = TIM_CHANNEL_2;
mbed_official 469:fc4922e0c183 215 break;
mbed_official 469:fc4922e0c183 216 // Channels 3
mbed_official 469:fc4922e0c183 217 case PA_10:
mbed_official 469:fc4922e0c183 218 case PB_0:
mbed_official 469:fc4922e0c183 219 case PC_8:
mbed_official 469:fc4922e0c183 220 channel = TIM_CHANNEL_3;
mbed_official 469:fc4922e0c183 221 break;
mbed_official 469:fc4922e0c183 222 // Channels 4
mbed_official 469:fc4922e0c183 223 case PA_11:
mbed_official 469:fc4922e0c183 224 case PC_9:
mbed_official 469:fc4922e0c183 225 channel = TIM_CHANNEL_4;
mbed_official 469:fc4922e0c183 226 break;
mbed_official 469:fc4922e0c183 227 default:
mbed_official 469:fc4922e0c183 228 return;
mbed_official 469:fc4922e0c183 229 }
mbed_official 469:fc4922e0c183 230
mbed_official 469:fc4922e0c183 231 #endif
mbed_official 469:fc4922e0c183 232
mbed_official 469:fc4922e0c183 233 HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, channel);
mbed_official 469:fc4922e0c183 234
mbed_official 469:fc4922e0c183 235 if (complementary_channel) {
mbed_official 469:fc4922e0c183 236 HAL_TIMEx_PWMN_Start(&TimHandle, channel);
mbed_official 469:fc4922e0c183 237 } else {
mbed_official 469:fc4922e0c183 238 HAL_TIM_PWM_Start(&TimHandle, channel);
mbed_official 469:fc4922e0c183 239 }
mbed_official 469:fc4922e0c183 240 }
mbed_official 469:fc4922e0c183 241
mbed_official 630:825f75ca301e 242 float pwmout_read(pwmout_t* obj) {
mbed_official 469:fc4922e0c183 243 float value = 0;
mbed_official 469:fc4922e0c183 244 if (obj->period > 0) {
mbed_official 469:fc4922e0c183 245 value = (float)(obj->pulse) / (float)(obj->period);
mbed_official 469:fc4922e0c183 246 }
mbed_official 469:fc4922e0c183 247 return ((value > (float)1.0) ? (float)(1.0) : (value));
mbed_official 469:fc4922e0c183 248 }
mbed_official 469:fc4922e0c183 249
mbed_official 630:825f75ca301e 250 void pwmout_period(pwmout_t* obj, float seconds) {
mbed_official 469:fc4922e0c183 251 pwmout_period_us(obj, seconds * 1000000.0f);
mbed_official 469:fc4922e0c183 252 }
mbed_official 469:fc4922e0c183 253
mbed_official 630:825f75ca301e 254 void pwmout_period_ms(pwmout_t* obj, int ms) {
mbed_official 469:fc4922e0c183 255 pwmout_period_us(obj, ms * 1000);
mbed_official 469:fc4922e0c183 256 }
mbed_official 469:fc4922e0c183 257
mbed_official 630:825f75ca301e 258 void pwmout_period_us(pwmout_t* obj, int us) {
mbed_official 469:fc4922e0c183 259 TimHandle.Instance = (TIM_TypeDef *)(obj->pwm);
mbed_official 469:fc4922e0c183 260
mbed_official 469:fc4922e0c183 261 float dc = pwmout_read(obj);
mbed_official 469:fc4922e0c183 262
mbed_official 469:fc4922e0c183 263 __HAL_TIM_DISABLE(&TimHandle);
mbed_official 469:fc4922e0c183 264
mbed_official 469:fc4922e0c183 265 // Update the SystemCoreClock variable
mbed_official 469:fc4922e0c183 266 SystemCoreClockUpdate();
mbed_official 469:fc4922e0c183 267
mbed_official 469:fc4922e0c183 268 TimHandle.Init.Period = us - 1;
mbed_official 469:fc4922e0c183 269 TimHandle.Init.Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick
mbed_official 469:fc4922e0c183 270 TimHandle.Init.ClockDivision = 0;
mbed_official 469:fc4922e0c183 271 TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
mbed_official 469:fc4922e0c183 272 HAL_TIM_PWM_Init(&TimHandle);
mbed_official 469:fc4922e0c183 273
mbed_official 469:fc4922e0c183 274 // Set duty cycle again
mbed_official 469:fc4922e0c183 275 pwmout_write(obj, dc);
mbed_official 469:fc4922e0c183 276
mbed_official 469:fc4922e0c183 277 // Save for future use
mbed_official 469:fc4922e0c183 278 obj->period = us;
mbed_official 469:fc4922e0c183 279
mbed_official 469:fc4922e0c183 280 __HAL_TIM_ENABLE(&TimHandle);
mbed_official 469:fc4922e0c183 281 }
mbed_official 469:fc4922e0c183 282
mbed_official 630:825f75ca301e 283 void pwmout_pulsewidth(pwmout_t* obj, float seconds) {
mbed_official 469:fc4922e0c183 284 pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
mbed_official 469:fc4922e0c183 285 }
mbed_official 469:fc4922e0c183 286
mbed_official 630:825f75ca301e 287 void pwmout_pulsewidth_ms(pwmout_t* obj, int ms) {
mbed_official 469:fc4922e0c183 288 pwmout_pulsewidth_us(obj, ms * 1000);
mbed_official 469:fc4922e0c183 289 }
mbed_official 469:fc4922e0c183 290
mbed_official 630:825f75ca301e 291 void pwmout_pulsewidth_us(pwmout_t* obj, int us) {
mbed_official 469:fc4922e0c183 292 float value = (float)us / (float)obj->period;
mbed_official 469:fc4922e0c183 293 pwmout_write(obj, value);
mbed_official 469:fc4922e0c183 294 }
mbed_official 469:fc4922e0c183 295
mbed_official 469:fc4922e0c183 296 #endif