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:
Fri Aug 14 13:15:17 2015 +0100
Revision:
610:813dcc80987e
Synchronized with git revision 6d84db41c6833e0b9b024741eb0616a5f62d5599

Full URL: https://github.com/mbedmicro/mbed/commit/6d84db41c6833e0b9b024741eb0616a5f62d5599/

DISCO_F746NG - Improvements

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 610:813dcc80987e 1 /* mbed Microcontroller Library
mbed_official 610:813dcc80987e 2 * Copyright (c) 2015, STMicroelectronics
mbed_official 610:813dcc80987e 3 * All rights reserved.
mbed_official 610:813dcc80987e 4 *
mbed_official 610:813dcc80987e 5 * Redistribution and use in source and binary forms, with or without
mbed_official 610:813dcc80987e 6 * modification, are permitted provided that the following conditions are met:
mbed_official 610:813dcc80987e 7 *
mbed_official 610:813dcc80987e 8 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 610:813dcc80987e 9 * this list of conditions and the following disclaimer.
mbed_official 610:813dcc80987e 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 610:813dcc80987e 11 * this list of conditions and the following disclaimer in the documentation
mbed_official 610:813dcc80987e 12 * and/or other materials provided with the distribution.
mbed_official 610:813dcc80987e 13 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 610:813dcc80987e 14 * may be used to endorse or promote products derived from this software
mbed_official 610:813dcc80987e 15 * without specific prior written permission.
mbed_official 610:813dcc80987e 16 *
mbed_official 610:813dcc80987e 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 610:813dcc80987e 18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 610:813dcc80987e 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 610:813dcc80987e 20 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 610:813dcc80987e 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 610:813dcc80987e 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 610:813dcc80987e 23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 610:813dcc80987e 24 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 610:813dcc80987e 25 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 610:813dcc80987e 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 610:813dcc80987e 27 */
mbed_official 610:813dcc80987e 28 #include "mbed_assert.h"
mbed_official 610:813dcc80987e 29 #include "analogout_api.h"
mbed_official 610:813dcc80987e 30
mbed_official 610:813dcc80987e 31 #if DEVICE_ANALOGOUT
mbed_official 610:813dcc80987e 32
mbed_official 610:813dcc80987e 33 #include "cmsis.h"
mbed_official 610:813dcc80987e 34 #include "pinmap.h"
mbed_official 610:813dcc80987e 35 #include "mbed_error.h"
mbed_official 610:813dcc80987e 36 #include "PeripheralPins.h"
mbed_official 610:813dcc80987e 37
mbed_official 610:813dcc80987e 38 #define DAC_RANGE (0xFFF) // 12 bits
mbed_official 610:813dcc80987e 39
mbed_official 610:813dcc80987e 40 static DAC_HandleTypeDef DacHandle;
mbed_official 610:813dcc80987e 41
mbed_official 610:813dcc80987e 42 // These variables are used for the "free" function
mbed_official 610:813dcc80987e 43 static int channel1_used = 0;
mbed_official 610:813dcc80987e 44 static int channel2_used = 0;
mbed_official 610:813dcc80987e 45
mbed_official 610:813dcc80987e 46 void analogout_init(dac_t *obj, PinName pin)
mbed_official 610:813dcc80987e 47 {
mbed_official 610:813dcc80987e 48 DAC_ChannelConfTypeDef sConfig = {0};
mbed_official 610:813dcc80987e 49
mbed_official 610:813dcc80987e 50 // Get the peripheral name from the pin and assign it to the object
mbed_official 610:813dcc80987e 51 obj->dac = (DACName)pinmap_peripheral(pin, PinMap_DAC);
mbed_official 610:813dcc80987e 52 MBED_ASSERT(obj->dac != (DACName)NC);
mbed_official 610:813dcc80987e 53
mbed_official 610:813dcc80987e 54 // Get the pin function and assign the used channel to the object
mbed_official 610:813dcc80987e 55 uint32_t function = pinmap_function(pin, PinMap_DAC);
mbed_official 610:813dcc80987e 56 MBED_ASSERT(function != (uint32_t)NC);
mbed_official 610:813dcc80987e 57 obj->channel = STM_PIN_CHANNEL(function);
mbed_official 610:813dcc80987e 58
mbed_official 610:813dcc80987e 59 // Configure GPIO
mbed_official 610:813dcc80987e 60 pinmap_pinout(pin, PinMap_DAC);
mbed_official 610:813dcc80987e 61
mbed_official 610:813dcc80987e 62 // Save the pin for future use
mbed_official 610:813dcc80987e 63 obj->pin = pin;
mbed_official 610:813dcc80987e 64
mbed_official 610:813dcc80987e 65 // Enable DAC clock
mbed_official 610:813dcc80987e 66 __HAL_RCC_DAC1_CLK_ENABLE();
mbed_official 610:813dcc80987e 67
mbed_official 610:813dcc80987e 68 // Configure DAC
mbed_official 610:813dcc80987e 69 DacHandle.Instance = DAC;
mbed_official 610:813dcc80987e 70
mbed_official 610:813dcc80987e 71 if (HAL_DAC_Init(&DacHandle) != HAL_OK) {
mbed_official 610:813dcc80987e 72 error("Cannot initialize DAC\n");
mbed_official 610:813dcc80987e 73 }
mbed_official 610:813dcc80987e 74
mbed_official 610:813dcc80987e 75 sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
mbed_official 610:813dcc80987e 76 sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
mbed_official 610:813dcc80987e 77 sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
mbed_official 610:813dcc80987e 78 sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
mbed_official 610:813dcc80987e 79 sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
mbed_official 610:813dcc80987e 80
mbed_official 610:813dcc80987e 81 if (obj->channel == 2) {
mbed_official 610:813dcc80987e 82 if (HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_2) != HAL_OK) {
mbed_official 610:813dcc80987e 83 error("Cannot configure DAC channel 2\n");
mbed_official 610:813dcc80987e 84 }
mbed_official 610:813dcc80987e 85 channel2_used = 1;
mbed_official 610:813dcc80987e 86 } else { // channel 1 per default
mbed_official 610:813dcc80987e 87 if (HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_1) != HAL_OK) {
mbed_official 610:813dcc80987e 88 error("Cannot configure DAC channel 1\n");
mbed_official 610:813dcc80987e 89 }
mbed_official 610:813dcc80987e 90 obj->channel = 1;
mbed_official 610:813dcc80987e 91 channel1_used = 1;
mbed_official 610:813dcc80987e 92 }
mbed_official 610:813dcc80987e 93
mbed_official 610:813dcc80987e 94 analogout_write_u16(obj, 0);
mbed_official 610:813dcc80987e 95 }
mbed_official 610:813dcc80987e 96
mbed_official 610:813dcc80987e 97 void analogout_free(dac_t *obj)
mbed_official 610:813dcc80987e 98 {
mbed_official 610:813dcc80987e 99 // Reset DAC and disable clock
mbed_official 610:813dcc80987e 100 if (obj->channel == 1) channel1_used = 0;
mbed_official 610:813dcc80987e 101 if (obj->channel == 2) channel2_used = 0;
mbed_official 610:813dcc80987e 102
mbed_official 610:813dcc80987e 103 if ((channel1_used == 0) && (channel2_used == 0)) {
mbed_official 610:813dcc80987e 104 __HAL_RCC_DAC1_FORCE_RESET();
mbed_official 610:813dcc80987e 105 __HAL_RCC_DAC1_RELEASE_RESET();
mbed_official 610:813dcc80987e 106 __HAL_RCC_DAC1_CLK_DISABLE();
mbed_official 610:813dcc80987e 107 }
mbed_official 610:813dcc80987e 108
mbed_official 610:813dcc80987e 109 // Configure GPIO
mbed_official 610:813dcc80987e 110 pin_function(obj->pin, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 610:813dcc80987e 111 }
mbed_official 610:813dcc80987e 112
mbed_official 610:813dcc80987e 113 static inline void dac_write(dac_t *obj, uint16_t value)
mbed_official 610:813dcc80987e 114 {
mbed_official 610:813dcc80987e 115 if (obj->channel == 1) {
mbed_official 610:813dcc80987e 116 HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, value);
mbed_official 610:813dcc80987e 117 HAL_DAC_Start(&DacHandle, DAC_CHANNEL_1);
mbed_official 610:813dcc80987e 118 }
mbed_official 610:813dcc80987e 119 if (obj->channel == 2) {
mbed_official 610:813dcc80987e 120 HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, value);
mbed_official 610:813dcc80987e 121 HAL_DAC_Start(&DacHandle, DAC_CHANNEL_2);
mbed_official 610:813dcc80987e 122 }
mbed_official 610:813dcc80987e 123 }
mbed_official 610:813dcc80987e 124
mbed_official 610:813dcc80987e 125 static inline int dac_read(dac_t *obj)
mbed_official 610:813dcc80987e 126 {
mbed_official 610:813dcc80987e 127 if (obj->channel == 1) {
mbed_official 610:813dcc80987e 128 return (int)HAL_DAC_GetValue(&DacHandle, DAC_CHANNEL_1);
mbed_official 610:813dcc80987e 129 }
mbed_official 610:813dcc80987e 130 if (obj->channel == 2) {
mbed_official 610:813dcc80987e 131 return (int)HAL_DAC_GetValue(&DacHandle, DAC_CHANNEL_2);
mbed_official 610:813dcc80987e 132 }
mbed_official 610:813dcc80987e 133 return 0;
mbed_official 610:813dcc80987e 134 }
mbed_official 610:813dcc80987e 135
mbed_official 610:813dcc80987e 136 void analogout_write(dac_t *obj, float value)
mbed_official 610:813dcc80987e 137 {
mbed_official 610:813dcc80987e 138 if (value < 0.0f) {
mbed_official 610:813dcc80987e 139 dac_write(obj, 0); // Min value
mbed_official 610:813dcc80987e 140 } else if (value > 1.0f) {
mbed_official 610:813dcc80987e 141 dac_write(obj, (uint16_t)DAC_RANGE); // Max value
mbed_official 610:813dcc80987e 142 } else {
mbed_official 610:813dcc80987e 143 dac_write(obj, (uint16_t)(value * (float)DAC_RANGE));
mbed_official 610:813dcc80987e 144 }
mbed_official 610:813dcc80987e 145 }
mbed_official 610:813dcc80987e 146
mbed_official 610:813dcc80987e 147 void analogout_write_u16(dac_t *obj, uint16_t value)
mbed_official 610:813dcc80987e 148 {
mbed_official 610:813dcc80987e 149 if (value > (uint16_t)DAC_RANGE) {
mbed_official 610:813dcc80987e 150 dac_write(obj, (uint16_t)DAC_RANGE); // Max value
mbed_official 610:813dcc80987e 151 } else {
mbed_official 610:813dcc80987e 152 dac_write(obj, value);
mbed_official 610:813dcc80987e 153 }
mbed_official 610:813dcc80987e 154 }
mbed_official 610:813dcc80987e 155
mbed_official 610:813dcc80987e 156 float analogout_read(dac_t *obj)
mbed_official 610:813dcc80987e 157 {
mbed_official 610:813dcc80987e 158 uint32_t value = dac_read(obj);
mbed_official 610:813dcc80987e 159 return (float)((float)value * (1.0f / (float)DAC_RANGE));
mbed_official 610:813dcc80987e 160 }
mbed_official 610:813dcc80987e 161
mbed_official 610:813dcc80987e 162 uint16_t analogout_read_u16(dac_t *obj)
mbed_official 610:813dcc80987e 163 {
mbed_official 610:813dcc80987e 164 return (uint16_t)dac_read(obj);
mbed_official 610:813dcc80987e 165 }
mbed_official 610:813dcc80987e 166
mbed_official 610:813dcc80987e 167 #endif // DEVICE_ANALOGOUT