mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /* mbed Microcontroller Library
AnnaBridge 189:f392fc9709a3 2 * Copyright (c) 2018 GigaDevice Semiconductor Inc.
AnnaBridge 189:f392fc9709a3 3 *
AnnaBridge 189:f392fc9709a3 4 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 189:f392fc9709a3 5 *
AnnaBridge 189:f392fc9709a3 6 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 189:f392fc9709a3 7 * you may not use this file except in compliance with the License.
AnnaBridge 189:f392fc9709a3 8 * You may obtain a copy of the License at
AnnaBridge 189:f392fc9709a3 9 *
AnnaBridge 189:f392fc9709a3 10 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 189:f392fc9709a3 11 *
AnnaBridge 189:f392fc9709a3 12 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 189:f392fc9709a3 13 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 189:f392fc9709a3 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 189:f392fc9709a3 15 * See the License for the specific language governing permissions and
AnnaBridge 189:f392fc9709a3 16 * limitations under the License.
AnnaBridge 189:f392fc9709a3 17 */
AnnaBridge 189:f392fc9709a3 18 #include "analogout_api.h"
AnnaBridge 189:f392fc9709a3 19 #include "mbed_assert.h"
AnnaBridge 189:f392fc9709a3 20
AnnaBridge 189:f392fc9709a3 21 #if DEVICE_ANALOGOUT
AnnaBridge 189:f392fc9709a3 22
AnnaBridge 189:f392fc9709a3 23 #include "cmsis.h"
AnnaBridge 189:f392fc9709a3 24 #include "pinmap.h"
AnnaBridge 189:f392fc9709a3 25 #include "mbed_error.h"
AnnaBridge 189:f392fc9709a3 26 #include "PeripheralPins.h"
AnnaBridge 189:f392fc9709a3 27
AnnaBridge 189:f392fc9709a3 28 /* 12bit */
AnnaBridge 189:f392fc9709a3 29 #define DEV_DAC_ACCURACY_12BIT (0xFFF)
AnnaBridge 189:f392fc9709a3 30 #define DEV_DAC_BITS (12)
AnnaBridge 189:f392fc9709a3 31
AnnaBridge 189:f392fc9709a3 32 /** Initialize the analogout peripheral
AnnaBridge 189:f392fc9709a3 33 *
AnnaBridge 189:f392fc9709a3 34 * Configures the pin used by analogout.
AnnaBridge 189:f392fc9709a3 35 * @param obj The analogout object to initialize
AnnaBridge 189:f392fc9709a3 36 * @param pin The analogout pin name
AnnaBridge 189:f392fc9709a3 37 */
AnnaBridge 189:f392fc9709a3 38 void analogout_init(dac_t *obj, PinName pin)
AnnaBridge 189:f392fc9709a3 39 {
AnnaBridge 189:f392fc9709a3 40 /* get the peripheral name from the pin and assign it to the object */
AnnaBridge 189:f392fc9709a3 41 obj->dac = (DACName)pinmap_peripheral(pin, PinMap_DAC);
AnnaBridge 189:f392fc9709a3 42 MBED_ASSERT(obj->dac != (DACName)NC);
AnnaBridge 189:f392fc9709a3 43
AnnaBridge 189:f392fc9709a3 44 /* get the pin function and assign the used channel to the object */
AnnaBridge 189:f392fc9709a3 45 uint32_t function = pinmap_function(pin, PinMap_DAC);
AnnaBridge 189:f392fc9709a3 46 MBED_ASSERT(function != (uint32_t)NC);
AnnaBridge 189:f392fc9709a3 47
AnnaBridge 189:f392fc9709a3 48 obj->channel = GD_PIN_CHANNEL_GET(function);
AnnaBridge 189:f392fc9709a3 49 MBED_ASSERT(obj->channel <= DAC1);
AnnaBridge 189:f392fc9709a3 50
AnnaBridge 189:f392fc9709a3 51 /* configure GPIO */
AnnaBridge 189:f392fc9709a3 52 pinmap_pinout(pin, PinMap_DAC);
AnnaBridge 189:f392fc9709a3 53
AnnaBridge 189:f392fc9709a3 54 /* save the pin for future use */
AnnaBridge 189:f392fc9709a3 55 obj->pin = pin;
AnnaBridge 189:f392fc9709a3 56
AnnaBridge 189:f392fc9709a3 57 /* enable DAC clock */
AnnaBridge 189:f392fc9709a3 58 rcu_periph_clock_enable(RCU_DAC);
AnnaBridge 189:f392fc9709a3 59
AnnaBridge 189:f392fc9709a3 60 /* configure DAC */
AnnaBridge 189:f392fc9709a3 61 dac_wave_mode_config(obj->channel, DAC_WAVE_DISABLE);
AnnaBridge 189:f392fc9709a3 62 dac_trigger_disable(obj->channel);
AnnaBridge 189:f392fc9709a3 63 dac_output_buffer_enable(obj->channel);
AnnaBridge 189:f392fc9709a3 64 analogout_write_u16(obj, 0);
AnnaBridge 189:f392fc9709a3 65 }
AnnaBridge 189:f392fc9709a3 66
AnnaBridge 189:f392fc9709a3 67 /** Release the analogout object
AnnaBridge 189:f392fc9709a3 68 *
AnnaBridge 189:f392fc9709a3 69 * Note: This is not currently used in the mbed-drivers
AnnaBridge 189:f392fc9709a3 70 * @param obj The analogout object
AnnaBridge 189:f392fc9709a3 71 */
AnnaBridge 189:f392fc9709a3 72 void analogout_free(dac_t *obj)
AnnaBridge 189:f392fc9709a3 73 {
AnnaBridge 189:f392fc9709a3 74 /* Reset DAC and disable clock */
AnnaBridge 189:f392fc9709a3 75 dac_deinit();
AnnaBridge 189:f392fc9709a3 76 rcu_periph_clock_disable(RCU_DAC);
AnnaBridge 189:f392fc9709a3 77
AnnaBridge 189:f392fc9709a3 78 /* configure GPIO */
AnnaBridge 189:f392fc9709a3 79 /* get the pin function and assign the used channel to the object */
AnnaBridge 189:f392fc9709a3 80 uint32_t function = pinmap_function(obj->pin, PinMap_DAC);
AnnaBridge 189:f392fc9709a3 81 MBED_ASSERT(function != (uint32_t)NC);
AnnaBridge 189:f392fc9709a3 82
AnnaBridge 189:f392fc9709a3 83 pin_function(obj->pin, function);
AnnaBridge 189:f392fc9709a3 84 }
AnnaBridge 189:f392fc9709a3 85
AnnaBridge 189:f392fc9709a3 86 /** set the output voltage with specified as a integer
AnnaBridge 189:f392fc9709a3 87 *
AnnaBridge 189:f392fc9709a3 88 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 89 * @param value The integer-point output voltage to be set
AnnaBridge 189:f392fc9709a3 90 */
AnnaBridge 189:f392fc9709a3 91 static inline void dev_dac_data_set(dac_t *obj, int value)
AnnaBridge 189:f392fc9709a3 92 {
AnnaBridge 189:f392fc9709a3 93 dac_data_set(obj->channel, DAC_ALIGN_12B_R, (value & DEV_DAC_ACCURACY_12BIT));
AnnaBridge 189:f392fc9709a3 94
AnnaBridge 189:f392fc9709a3 95 dac_enable(obj->channel);
AnnaBridge 189:f392fc9709a3 96
AnnaBridge 189:f392fc9709a3 97 dac_software_trigger_enable(obj->channel);
AnnaBridge 189:f392fc9709a3 98 }
AnnaBridge 189:f392fc9709a3 99
AnnaBridge 189:f392fc9709a3 100 /** get the current DAC data
AnnaBridge 189:f392fc9709a3 101 *
AnnaBridge 189:f392fc9709a3 102 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 103 * @return DAC data
AnnaBridge 189:f392fc9709a3 104 */
AnnaBridge 189:f392fc9709a3 105 static inline int dev_dac_data_get(dac_t *obj)
AnnaBridge 189:f392fc9709a3 106 {
AnnaBridge 189:f392fc9709a3 107 return (int)dac_output_value_get(obj->channel);
AnnaBridge 189:f392fc9709a3 108 }
AnnaBridge 189:f392fc9709a3 109
AnnaBridge 189:f392fc9709a3 110 /** Set the output voltage, specified as a percentage (float)
AnnaBridge 189:f392fc9709a3 111 *
AnnaBridge 189:f392fc9709a3 112 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 113 * @param value The floating-point output voltage to be set
AnnaBridge 189:f392fc9709a3 114 */
AnnaBridge 189:f392fc9709a3 115 void analogout_write(dac_t *obj, float value)
AnnaBridge 189:f392fc9709a3 116 {
AnnaBridge 189:f392fc9709a3 117 if (value < 0.0f) {
AnnaBridge 189:f392fc9709a3 118 /* when the value is less than 0.0, set DAC output date to 0 */
AnnaBridge 189:f392fc9709a3 119 dev_dac_data_set(obj, 0);
AnnaBridge 189:f392fc9709a3 120 } else if (value > 1.0f) {
AnnaBridge 189:f392fc9709a3 121 /* when the value is more than 1.0, set DAC output date to 0xFFF */
AnnaBridge 189:f392fc9709a3 122 dev_dac_data_set(obj, (int)DEV_DAC_ACCURACY_12BIT);
AnnaBridge 189:f392fc9709a3 123 } else {
AnnaBridge 189:f392fc9709a3 124 dev_dac_data_set(obj, (int)(value * (float)DEV_DAC_ACCURACY_12BIT));
AnnaBridge 189:f392fc9709a3 125 }
AnnaBridge 189:f392fc9709a3 126 }
AnnaBridge 189:f392fc9709a3 127
AnnaBridge 189:f392fc9709a3 128 /** Set the output voltage, specified as unsigned 16-bit
AnnaBridge 189:f392fc9709a3 129 *
AnnaBridge 189:f392fc9709a3 130 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 131 * @param value The unsigned 16-bit output voltage to be set
AnnaBridge 189:f392fc9709a3 132 */
AnnaBridge 189:f392fc9709a3 133 void analogout_write_u16(dac_t *obj, uint16_t value)
AnnaBridge 189:f392fc9709a3 134 {
AnnaBridge 189:f392fc9709a3 135 dev_dac_data_set(obj, value >> (16 - DEV_DAC_BITS));
AnnaBridge 189:f392fc9709a3 136 }
AnnaBridge 189:f392fc9709a3 137
AnnaBridge 189:f392fc9709a3 138 /** Read the current voltage value on the pin
AnnaBridge 189:f392fc9709a3 139 *
AnnaBridge 189:f392fc9709a3 140 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 141 * @return A floating-point value representing the current voltage on the pin,
AnnaBridge 189:f392fc9709a3 142 * measured as a percentage
AnnaBridge 189:f392fc9709a3 143 */
AnnaBridge 189:f392fc9709a3 144 float analogout_read(dac_t *obj)
AnnaBridge 189:f392fc9709a3 145 {
AnnaBridge 189:f392fc9709a3 146 uint32_t ret_val = dev_dac_data_get(obj);
AnnaBridge 189:f392fc9709a3 147 return (float)ret_val * (1.0f / (float)DEV_DAC_ACCURACY_12BIT);
AnnaBridge 189:f392fc9709a3 148 }
AnnaBridge 189:f392fc9709a3 149
AnnaBridge 189:f392fc9709a3 150 /** Read the current voltage value on the pin, as a normalized unsigned 16bit value
AnnaBridge 189:f392fc9709a3 151 *
AnnaBridge 189:f392fc9709a3 152 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 153 * @return An unsigned 16-bit value representing the current voltage on the pin
AnnaBridge 189:f392fc9709a3 154 */
AnnaBridge 189:f392fc9709a3 155 uint16_t analogout_read_u16(dac_t *obj)
AnnaBridge 189:f392fc9709a3 156 {
AnnaBridge 189:f392fc9709a3 157 uint32_t ret_val = dev_dac_data_get(obj);
AnnaBridge 189:f392fc9709a3 158 return (ret_val << 4) | ((ret_val >> 8) & 0x000F);
AnnaBridge 189:f392fc9709a3 159 }
AnnaBridge 189:f392fc9709a3 160
AnnaBridge 189:f392fc9709a3 161 #endif /* DEVICE_ANALOGOUT */