SPKT

Dependents:   WAV

Committer:
phungductung
Date:
Tue Jun 04 21:51:46 2019 +0000
Revision:
0:e87aa4c49e95
libray

Who changed what in which revision?

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