SPKT

Dependencies:   F746_GUI SD_PlayerSkeleton F746_SAI_IO

Committer:
phungductung
Date:
Tue Jun 04 21:37:21 2019 +0000
Revision:
0:8ede47d38d10
SPKT

Who changed what in which revision?

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