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 #define DEV_DAC_ACCURACY_12BIT (0xFFF) // 12 bits
AnnaBridge 189:f392fc9709a3 29 #define DEV_DAC_BITS (12)
AnnaBridge 189:f392fc9709a3 30
AnnaBridge 189:f392fc9709a3 31 /** Initialize the analogout peripheral
AnnaBridge 189:f392fc9709a3 32 *
AnnaBridge 189:f392fc9709a3 33 * Configures the pin used by analogout.
AnnaBridge 189:f392fc9709a3 34 * @param obj The analogout object to initialize
AnnaBridge 189:f392fc9709a3 35 * @param pin The analogout pin name
AnnaBridge 189:f392fc9709a3 36 */
AnnaBridge 189:f392fc9709a3 37 void analogout_init(dac_t *obj, PinName pin)
AnnaBridge 189:f392fc9709a3 38 {
AnnaBridge 189:f392fc9709a3 39 /* get the peripheral name from the pin and assign it to the object */
AnnaBridge 189:f392fc9709a3 40 obj->dac = (DACName)pinmap_peripheral(pin, PinMap_DAC);
AnnaBridge 189:f392fc9709a3 41 MBED_ASSERT(obj->dac != (DACName)NC);
AnnaBridge 189:f392fc9709a3 42
AnnaBridge 189:f392fc9709a3 43 /* get the pin function and assign the used channel to the object */
AnnaBridge 189:f392fc9709a3 44 uint32_t function = pinmap_function(pin, PinMap_DAC);
AnnaBridge 189:f392fc9709a3 45 MBED_ASSERT(function != (uint32_t)NC);
AnnaBridge 189:f392fc9709a3 46
AnnaBridge 189:f392fc9709a3 47 obj->channel = GD_PIN_CHANNEL_GET(function);
AnnaBridge 189:f392fc9709a3 48 MBED_ASSERT(obj->channel <= DAC1);
AnnaBridge 189:f392fc9709a3 49
AnnaBridge 189:f392fc9709a3 50 /* configure GPIO */
AnnaBridge 189:f392fc9709a3 51 pinmap_pinout(pin, PinMap_DAC);
AnnaBridge 189:f392fc9709a3 52
AnnaBridge 189:f392fc9709a3 53 /* save the pin for future use */
AnnaBridge 189:f392fc9709a3 54 obj->pin = pin;
AnnaBridge 189:f392fc9709a3 55
AnnaBridge 189:f392fc9709a3 56 /* enable DAC clock */
AnnaBridge 189:f392fc9709a3 57 rcu_periph_clock_enable(RCU_DAC);
AnnaBridge 189:f392fc9709a3 58
AnnaBridge 189:f392fc9709a3 59 /* configure DAC */
AnnaBridge 189:f392fc9709a3 60 dac_wave_mode_config(obj->channel, DAC_WAVE_DISABLE);
AnnaBridge 189:f392fc9709a3 61 dac_trigger_disable(obj->channel);
AnnaBridge 189:f392fc9709a3 62 dac_output_buffer_enable(obj->channel);
AnnaBridge 189:f392fc9709a3 63 analogout_write_u16(obj, 0);
AnnaBridge 189:f392fc9709a3 64 }
AnnaBridge 189:f392fc9709a3 65
AnnaBridge 189:f392fc9709a3 66 /** Release the analogout object
AnnaBridge 189:f392fc9709a3 67 *
AnnaBridge 189:f392fc9709a3 68 * Note: This is not currently used in the mbed-drivers
AnnaBridge 189:f392fc9709a3 69 * @param obj The analogout object
AnnaBridge 189:f392fc9709a3 70 */
AnnaBridge 189:f392fc9709a3 71 void analogout_free(dac_t *obj)
AnnaBridge 189:f392fc9709a3 72 {
AnnaBridge 189:f392fc9709a3 73 /* Reset DAC and disable clock */
AnnaBridge 189:f392fc9709a3 74 dac_deinit();
AnnaBridge 189:f392fc9709a3 75 rcu_periph_clock_disable(RCU_DAC);
AnnaBridge 189:f392fc9709a3 76
AnnaBridge 189:f392fc9709a3 77 /* configure GPIO */
AnnaBridge 189:f392fc9709a3 78 /* get the pin function and assign the used channel to the object */
AnnaBridge 189:f392fc9709a3 79 uint32_t function = pinmap_function(obj->pin, PinMap_DAC);
AnnaBridge 189:f392fc9709a3 80 MBED_ASSERT(function != (uint32_t)NC);
AnnaBridge 189:f392fc9709a3 81
AnnaBridge 189:f392fc9709a3 82 pin_function(obj->pin, function);
AnnaBridge 189:f392fc9709a3 83 }
AnnaBridge 189:f392fc9709a3 84
AnnaBridge 189:f392fc9709a3 85 /** set the output voltage with specified as a integer
AnnaBridge 189:f392fc9709a3 86 *
AnnaBridge 189:f392fc9709a3 87 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 88 * @param value The integer-point output voltage to be set
AnnaBridge 189:f392fc9709a3 89 */
AnnaBridge 189:f392fc9709a3 90 static inline void dev_dac_data_set(dac_t *obj, int value)
AnnaBridge 189:f392fc9709a3 91 {
AnnaBridge 189:f392fc9709a3 92 dac_data_set(obj->channel, DAC_ALIGN_12B_R, (value & DEV_DAC_ACCURACY_12BIT));
AnnaBridge 189:f392fc9709a3 93
AnnaBridge 189:f392fc9709a3 94 dac_enable(obj->channel);
AnnaBridge 189:f392fc9709a3 95
AnnaBridge 189:f392fc9709a3 96 dac_software_trigger_enable(obj->channel);
AnnaBridge 189:f392fc9709a3 97 }
AnnaBridge 189:f392fc9709a3 98
AnnaBridge 189:f392fc9709a3 99 /** get the current DAC data
AnnaBridge 189:f392fc9709a3 100 *
AnnaBridge 189:f392fc9709a3 101 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 102 * @return DAC data
AnnaBridge 189:f392fc9709a3 103 */
AnnaBridge 189:f392fc9709a3 104 static inline int dev_dac_data_get(dac_t *obj)
AnnaBridge 189:f392fc9709a3 105 {
AnnaBridge 189:f392fc9709a3 106 return (int)dac_output_value_get(obj->channel);
AnnaBridge 189:f392fc9709a3 107 }
AnnaBridge 189:f392fc9709a3 108
AnnaBridge 189:f392fc9709a3 109 /** Set the output voltage, specified as a percentage (float)
AnnaBridge 189:f392fc9709a3 110 *
AnnaBridge 189:f392fc9709a3 111 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 112 * @param value The floating-point output voltage to be set
AnnaBridge 189:f392fc9709a3 113 */
AnnaBridge 189:f392fc9709a3 114 void analogout_write(dac_t *obj, float value)
AnnaBridge 189:f392fc9709a3 115 {
AnnaBridge 189:f392fc9709a3 116 if (value < 0.0f) {
AnnaBridge 189:f392fc9709a3 117 /* when the value is less than 0.0, set DAC output date to 0 */
AnnaBridge 189:f392fc9709a3 118 dev_dac_data_set(obj, 0);
AnnaBridge 189:f392fc9709a3 119 } else if (value > 1.0f) {
AnnaBridge 189:f392fc9709a3 120 /* when the value is more than 1.0, set DAC output date to 0xFFF */
AnnaBridge 189:f392fc9709a3 121 dev_dac_data_set(obj, (int)DEV_DAC_ACCURACY_12BIT);
AnnaBridge 189:f392fc9709a3 122 } else {
AnnaBridge 189:f392fc9709a3 123 dev_dac_data_set(obj, (int)(value * (float)DEV_DAC_ACCURACY_12BIT));
AnnaBridge 189:f392fc9709a3 124 }
AnnaBridge 189:f392fc9709a3 125 }
AnnaBridge 189:f392fc9709a3 126
AnnaBridge 189:f392fc9709a3 127 /** Set the output voltage, specified as unsigned 16-bit
AnnaBridge 189:f392fc9709a3 128 *
AnnaBridge 189:f392fc9709a3 129 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 130 * @param value The unsigned 16-bit output voltage to be set
AnnaBridge 189:f392fc9709a3 131 */
AnnaBridge 189:f392fc9709a3 132 void analogout_write_u16(dac_t *obj, uint16_t value)
AnnaBridge 189:f392fc9709a3 133 {
AnnaBridge 189:f392fc9709a3 134 dev_dac_data_set(obj, value >> (16 - DEV_DAC_BITS));
AnnaBridge 189:f392fc9709a3 135 }
AnnaBridge 189:f392fc9709a3 136
AnnaBridge 189:f392fc9709a3 137 /** Read the current voltage value on the pin
AnnaBridge 189:f392fc9709a3 138 *
AnnaBridge 189:f392fc9709a3 139 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 140 * @return A floating-point value representing the current voltage on the pin,
AnnaBridge 189:f392fc9709a3 141 * measured as a percentage
AnnaBridge 189:f392fc9709a3 142 */
AnnaBridge 189:f392fc9709a3 143 float analogout_read(dac_t *obj)
AnnaBridge 189:f392fc9709a3 144 {
AnnaBridge 189:f392fc9709a3 145 uint32_t ret_val = dev_dac_data_get(obj);
AnnaBridge 189:f392fc9709a3 146 return (float)ret_val * (1.0f / (float)DEV_DAC_ACCURACY_12BIT);
AnnaBridge 189:f392fc9709a3 147 }
AnnaBridge 189:f392fc9709a3 148
AnnaBridge 189:f392fc9709a3 149 /** Read the current voltage value on the pin, as a normalized unsigned 16bit value
AnnaBridge 189:f392fc9709a3 150 *
AnnaBridge 189:f392fc9709a3 151 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 152 * @return An unsigned 16-bit value representing the current voltage on the pin
AnnaBridge 189:f392fc9709a3 153 */
AnnaBridge 189:f392fc9709a3 154 uint16_t analogout_read_u16(dac_t *obj)
AnnaBridge 189:f392fc9709a3 155 {
AnnaBridge 189:f392fc9709a3 156 uint32_t ret_val = dev_dac_data_get(obj);
AnnaBridge 189:f392fc9709a3 157 return (ret_val << 4) | ((ret_val >> 8) & 0x000F);
AnnaBridge 189:f392fc9709a3 158 }
AnnaBridge 189:f392fc9709a3 159
AnnaBridge 189:f392fc9709a3 160 #endif /* DEVICE_ANALOGOUT */