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 03 09:30:05 2014 +0000
Revision:
84:f54042cbc282
Child:
164:90c6009cba07
Synchronized with git revision bbbd8699601c42149ccf0c37bc42bb6856ccc4c6

Full URL: https://github.com/mbedmicro/mbed/commit/bbbd8699601c42149ccf0c37bc42bb6856ccc4c6/

[NUCLEO_L152RE/F030_R8] SPI, I2C, Ticker, PWM updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 84:f54042cbc282 1 /* mbed Microcontroller Library
mbed_official 84:f54042cbc282 2 *******************************************************************************
mbed_official 84:f54042cbc282 3 * Copyright (c) 2014, STMicroelectronics
mbed_official 84:f54042cbc282 4 * All rights reserved.
mbed_official 84:f54042cbc282 5 *
mbed_official 84:f54042cbc282 6 * Redistribution and use in source and binary forms, with or without
mbed_official 84:f54042cbc282 7 * modification, are permitted provided that the following conditions are met:
mbed_official 84:f54042cbc282 8 *
mbed_official 84:f54042cbc282 9 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 84:f54042cbc282 10 * this list of conditions and the following disclaimer.
mbed_official 84:f54042cbc282 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 84:f54042cbc282 12 * this list of conditions and the following disclaimer in the documentation
mbed_official 84:f54042cbc282 13 * and/or other materials provided with the distribution.
mbed_official 84:f54042cbc282 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 84:f54042cbc282 15 * may be used to endorse or promote products derived from this software
mbed_official 84:f54042cbc282 16 * without specific prior written permission.
mbed_official 84:f54042cbc282 17 *
mbed_official 84:f54042cbc282 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 84:f54042cbc282 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 84:f54042cbc282 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 84:f54042cbc282 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 84:f54042cbc282 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 84:f54042cbc282 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 84:f54042cbc282 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 84:f54042cbc282 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 84:f54042cbc282 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 84:f54042cbc282 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 84:f54042cbc282 28 *******************************************************************************
mbed_official 84:f54042cbc282 29 */
mbed_official 84:f54042cbc282 30 #include "pwmout_api.h"
mbed_official 84:f54042cbc282 31
mbed_official 84:f54042cbc282 32 #include "cmsis.h"
mbed_official 84:f54042cbc282 33 #include "pinmap.h"
mbed_official 84:f54042cbc282 34 #include "error.h"
mbed_official 84:f54042cbc282 35
mbed_official 84:f54042cbc282 36 static const PinMap PinMap_PWM[] = {
mbed_official 84:f54042cbc282 37 {PA_7, TIM_14, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_4)}, // TIM14_CH1
mbed_official 84:f54042cbc282 38 {PC_7, TIM_3, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_0)}, // TIM3_CH2
mbed_official 84:f54042cbc282 39 {PB_6, TIM_16, STM_PIN_DATA(GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_NOPULL, GPIO_AF_2)}, // TIM16_CH1N --> FAIL
mbed_official 84:f54042cbc282 40 {NC, NC, 0}
mbed_official 84:f54042cbc282 41 };
mbed_official 84:f54042cbc282 42
mbed_official 84:f54042cbc282 43 void pwmout_init(pwmout_t* obj, PinName pin) {
mbed_official 84:f54042cbc282 44 // Get the peripheral name from the pin and assign it to the object
mbed_official 84:f54042cbc282 45 obj->pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
mbed_official 84:f54042cbc282 46
mbed_official 84:f54042cbc282 47 if (obj->pwm == (PWMName)NC) {
mbed_official 84:f54042cbc282 48 error("PWM pinout mapping failed");
mbed_official 84:f54042cbc282 49 }
mbed_official 84:f54042cbc282 50
mbed_official 84:f54042cbc282 51 // Enable TIM clock
mbed_official 84:f54042cbc282 52 if (obj->pwm == TIM_3) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
mbed_official 84:f54042cbc282 53 if (obj->pwm == TIM_14) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
mbed_official 84:f54042cbc282 54 if (obj->pwm == TIM_16) RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16, ENABLE);
mbed_official 84:f54042cbc282 55
mbed_official 84:f54042cbc282 56 // Configure GPIO
mbed_official 84:f54042cbc282 57 pinmap_pinout(pin, PinMap_PWM);
mbed_official 84:f54042cbc282 58 //pin_mode(pin, PullUp);
mbed_official 84:f54042cbc282 59
mbed_official 84:f54042cbc282 60 obj->pin = pin;
mbed_official 84:f54042cbc282 61 obj->period = 0;
mbed_official 84:f54042cbc282 62 obj->pulse = 0;
mbed_official 84:f54042cbc282 63
mbed_official 84:f54042cbc282 64 pwmout_period_us(obj, 20000); // 20 ms per default
mbed_official 84:f54042cbc282 65 }
mbed_official 84:f54042cbc282 66
mbed_official 84:f54042cbc282 67 void pwmout_free(pwmout_t* obj) {
mbed_official 84:f54042cbc282 68 TIM_TypeDef *tim = (TIM_TypeDef *)(obj->pwm);
mbed_official 84:f54042cbc282 69 TIM_DeInit(tim);
mbed_official 84:f54042cbc282 70 }
mbed_official 84:f54042cbc282 71
mbed_official 84:f54042cbc282 72 void pwmout_write(pwmout_t* obj, float value) {
mbed_official 84:f54042cbc282 73 TIM_TypeDef *tim = (TIM_TypeDef *)(obj->pwm);
mbed_official 84:f54042cbc282 74 TIM_OCInitTypeDef TIM_OCInitStructure;
mbed_official 84:f54042cbc282 75
mbed_official 84:f54042cbc282 76 if (value < 0.0) {
mbed_official 84:f54042cbc282 77 value = 0.0;
mbed_official 84:f54042cbc282 78 } else if (value > 1.0) {
mbed_official 84:f54042cbc282 79 value = 1.0;
mbed_official 84:f54042cbc282 80 }
mbed_official 84:f54042cbc282 81
mbed_official 84:f54042cbc282 82 obj->pulse = (uint32_t)((float)obj->period * value);
mbed_official 84:f54042cbc282 83
mbed_official 84:f54042cbc282 84 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
mbed_official 84:f54042cbc282 85 TIM_OCInitStructure.TIM_Pulse = obj->pulse;
mbed_official 84:f54042cbc282 86
mbed_official 84:f54042cbc282 87 // Configure channel 1
mbed_official 84:f54042cbc282 88 if (obj->pin == PA_7) {
mbed_official 84:f54042cbc282 89 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
mbed_official 84:f54042cbc282 90 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
mbed_official 84:f54042cbc282 91 TIM_OC1PreloadConfig(tim, TIM_OCPreload_Enable);
mbed_official 84:f54042cbc282 92 TIM_OC1Init(tim, &TIM_OCInitStructure);
mbed_official 84:f54042cbc282 93 }
mbed_official 84:f54042cbc282 94
mbed_official 84:f54042cbc282 95 // Configure channel 1N
mbed_official 84:f54042cbc282 96 if (obj->pin == PB_6) {
mbed_official 84:f54042cbc282 97 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
mbed_official 84:f54042cbc282 98 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
mbed_official 84:f54042cbc282 99 TIM_OC1PreloadConfig(tim, TIM_OCPreload_Enable);
mbed_official 84:f54042cbc282 100 TIM_OC1Init(tim, &TIM_OCInitStructure);
mbed_official 84:f54042cbc282 101 }
mbed_official 84:f54042cbc282 102
mbed_official 84:f54042cbc282 103 // Configure channel 2
mbed_official 84:f54042cbc282 104 if (obj->pin == PC_7) {
mbed_official 84:f54042cbc282 105 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
mbed_official 84:f54042cbc282 106 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
mbed_official 84:f54042cbc282 107 TIM_OC2PreloadConfig(tim, TIM_OCPreload_Enable);
mbed_official 84:f54042cbc282 108 TIM_OC2Init(tim, &TIM_OCInitStructure);
mbed_official 84:f54042cbc282 109 }
mbed_official 84:f54042cbc282 110 }
mbed_official 84:f54042cbc282 111
mbed_official 84:f54042cbc282 112 float pwmout_read(pwmout_t* obj) {
mbed_official 84:f54042cbc282 113 float value = 0;
mbed_official 84:f54042cbc282 114 if (obj->period > 0) {
mbed_official 84:f54042cbc282 115 value = (float)(obj->pulse) / (float)(obj->period);
mbed_official 84:f54042cbc282 116 }
mbed_official 84:f54042cbc282 117 return ((value > 1.0) ? (1.0) : (value));
mbed_official 84:f54042cbc282 118 }
mbed_official 84:f54042cbc282 119
mbed_official 84:f54042cbc282 120 void pwmout_period(pwmout_t* obj, float seconds) {
mbed_official 84:f54042cbc282 121 pwmout_period_us(obj, seconds * 1000000.0f);
mbed_official 84:f54042cbc282 122 }
mbed_official 84:f54042cbc282 123
mbed_official 84:f54042cbc282 124 void pwmout_period_ms(pwmout_t* obj, int ms) {
mbed_official 84:f54042cbc282 125 pwmout_period_us(obj, ms * 1000);
mbed_official 84:f54042cbc282 126 }
mbed_official 84:f54042cbc282 127
mbed_official 84:f54042cbc282 128 void pwmout_period_us(pwmout_t* obj, int us) {
mbed_official 84:f54042cbc282 129 TIM_TypeDef *tim = (TIM_TypeDef *)(obj->pwm);
mbed_official 84:f54042cbc282 130 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
mbed_official 84:f54042cbc282 131 float dc = pwmout_read(obj);
mbed_official 84:f54042cbc282 132
mbed_official 84:f54042cbc282 133 TIM_Cmd(tim, DISABLE);
mbed_official 84:f54042cbc282 134
mbed_official 84:f54042cbc282 135 obj->period = us;
mbed_official 84:f54042cbc282 136
mbed_official 84:f54042cbc282 137 TIM_TimeBaseStructure.TIM_Period = obj->period - 1;
mbed_official 84:f54042cbc282 138 TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick
mbed_official 84:f54042cbc282 139 TIM_TimeBaseStructure.TIM_ClockDivision = 0;
mbed_official 84:f54042cbc282 140 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
mbed_official 84:f54042cbc282 141 TIM_TimeBaseInit(tim, &TIM_TimeBaseStructure);
mbed_official 84:f54042cbc282 142
mbed_official 84:f54042cbc282 143 // Set duty cycle again
mbed_official 84:f54042cbc282 144 pwmout_write(obj, dc);
mbed_official 84:f54042cbc282 145
mbed_official 84:f54042cbc282 146 TIM_ARRPreloadConfig(tim, ENABLE);
mbed_official 84:f54042cbc282 147
mbed_official 84:f54042cbc282 148 TIM_Cmd(tim, ENABLE);
mbed_official 84:f54042cbc282 149 }
mbed_official 84:f54042cbc282 150
mbed_official 84:f54042cbc282 151 void pwmout_pulsewidth(pwmout_t* obj, float seconds) {
mbed_official 84:f54042cbc282 152 pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
mbed_official 84:f54042cbc282 153 }
mbed_official 84:f54042cbc282 154
mbed_official 84:f54042cbc282 155 void pwmout_pulsewidth_ms(pwmout_t* obj, int ms) {
mbed_official 84:f54042cbc282 156 pwmout_pulsewidth_us(obj, ms * 1000);
mbed_official 84:f54042cbc282 157 }
mbed_official 84:f54042cbc282 158
mbed_official 84:f54042cbc282 159 void pwmout_pulsewidth_us(pwmout_t* obj, int us) {
mbed_official 84:f54042cbc282 160 float value = (float)us / (float)obj->period;
mbed_official 84:f54042cbc282 161 pwmout_write(obj, value);
mbed_official 84:f54042cbc282 162 }