mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Mon Nov 09 13:30:11 2015 +0000
Revision:
18:da299f395b9e
Synchronized with git revision f605825f66bb2e462ff7dbc5fb4ed2dbe979d1c3

Full URL: https://github.com/mbedmicro/mbed/commit/f605825f66bb2e462ff7dbc5fb4ed2dbe979d1c3/

Added support for SAML21

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 18:da299f395b9e 1 /* mbed Microcontroller Library
mbed_official 18:da299f395b9e 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 18:da299f395b9e 3 *
mbed_official 18:da299f395b9e 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 18:da299f395b9e 5 * you may not use this file except in compliance with the License.
mbed_official 18:da299f395b9e 6 * You may obtain a copy of the License at
mbed_official 18:da299f395b9e 7 *
mbed_official 18:da299f395b9e 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 18:da299f395b9e 9 *
mbed_official 18:da299f395b9e 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 18:da299f395b9e 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 18:da299f395b9e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 18:da299f395b9e 13 * See the License for the specific language governing permissions and
mbed_official 18:da299f395b9e 14 * limitations under the License.
mbed_official 18:da299f395b9e 15 */
mbed_official 18:da299f395b9e 16 #include "mbed_assert.h"
mbed_official 18:da299f395b9e 17 #include "analogout_api.h"
mbed_official 18:da299f395b9e 18
mbed_official 18:da299f395b9e 19 #include "cmsis.h"
mbed_official 18:da299f395b9e 20 #include "pinmap.h"
mbed_official 18:da299f395b9e 21 #include "PeripheralPins.h"
mbed_official 18:da299f395b9e 22 #include "dac.h"
mbed_official 18:da299f395b9e 23
mbed_official 18:da299f395b9e 24 extern uint8_t g_sys_init;
mbed_official 18:da299f395b9e 25
mbed_official 18:da299f395b9e 26 #define MAX_VAL_12BIT 0x0FFF /*12 Bit DAC for SAML21*/
mbed_official 18:da299f395b9e 27
mbed_official 18:da299f395b9e 28 void analogout_init(dac_t *obj, PinName pin)
mbed_official 18:da299f395b9e 29 {
mbed_official 18:da299f395b9e 30 MBED_ASSERT(obj);
mbed_official 18:da299f395b9e 31 if (g_sys_init == 0) {
mbed_official 18:da299f395b9e 32 system_init();
mbed_official 18:da299f395b9e 33 g_sys_init = 1;
mbed_official 18:da299f395b9e 34 }
mbed_official 18:da299f395b9e 35 struct dac_config config_dac;
mbed_official 18:da299f395b9e 36 struct dac_chan_config config_dac_chan;
mbed_official 18:da299f395b9e 37 uint32_t dacperipheral;
mbed_official 18:da299f395b9e 38 uint32_t ch_index;
mbed_official 18:da299f395b9e 39
mbed_official 18:da299f395b9e 40 dacperipheral = pinmap_find_peripheral(pin, PinMap_DAC);
mbed_official 18:da299f395b9e 41 MBED_ASSERT(dacperipheral != NC);
mbed_official 18:da299f395b9e 42 obj->pin = pin;
mbed_official 18:da299f395b9e 43 obj->dac = dacperipheral;
mbed_official 18:da299f395b9e 44 if (pin == PA02) {
mbed_official 18:da299f395b9e 45 ch_index = 0;
mbed_official 18:da299f395b9e 46 } else if (pin == PA05) {
mbed_official 18:da299f395b9e 47 ch_index = 1;
mbed_official 18:da299f395b9e 48 } else { /*Only 2 pins for DAC*/
mbed_official 18:da299f395b9e 49 return 0;
mbed_official 18:da299f395b9e 50 }
mbed_official 18:da299f395b9e 51 obj->channel = ch_index;
mbed_official 18:da299f395b9e 52
mbed_official 18:da299f395b9e 53 dac_get_config_defaults(&config_dac);
mbed_official 18:da299f395b9e 54 dac_init(&(obj->dac_instance), (Dac *)dacperipheral, &config_dac);
mbed_official 18:da299f395b9e 55 dac_chan_get_config_defaults(&config_dac_chan);
mbed_official 18:da299f395b9e 56 dac_chan_set_config(&(obj->dac_instance), ch_index, &config_dac_chan);
mbed_official 18:da299f395b9e 57 dac_chan_enable(&(obj->dac_instance), ch_index);
mbed_official 18:da299f395b9e 58 dac_enable(&(obj->dac_instance));
mbed_official 18:da299f395b9e 59 }
mbed_official 18:da299f395b9e 60
mbed_official 18:da299f395b9e 61 void analogout_free(dac_t *obj)
mbed_official 18:da299f395b9e 62 {
mbed_official 18:da299f395b9e 63 MBED_ASSERT(obj);
mbed_official 18:da299f395b9e 64 struct system_pinmux_config pin_conf;
mbed_official 18:da299f395b9e 65
mbed_official 18:da299f395b9e 66 dac_disable(&(obj->dac_instance));
mbed_official 18:da299f395b9e 67 pin_conf.direction = SYSTEM_PINMUX_PIN_DIR_INPUT;
mbed_official 18:da299f395b9e 68 pin_conf.input_pull = SYSTEM_PINMUX_PIN_PULL_UP;
mbed_official 18:da299f395b9e 69 pin_conf.powersave = false;
mbed_official 18:da299f395b9e 70 pin_conf.mux_position = SYSTEM_PINMUX_GPIO;
mbed_official 18:da299f395b9e 71 system_pinmux_pin_set_config(obj->pin, &pin_conf);
mbed_official 18:da299f395b9e 72 }
mbed_official 18:da299f395b9e 73
mbed_official 18:da299f395b9e 74 void analogout_write(dac_t *obj, float value)
mbed_official 18:da299f395b9e 75 {
mbed_official 18:da299f395b9e 76 MBED_ASSERT(obj);
mbed_official 18:da299f395b9e 77 uint16_t count_val = 0;
mbed_official 18:da299f395b9e 78 if (value < 0.0f) {
mbed_official 18:da299f395b9e 79 count_val = 0;
mbed_official 18:da299f395b9e 80 } else if (value > 1.0f) {
mbed_official 18:da299f395b9e 81 count_val = MAX_VAL_12BIT;
mbed_official 18:da299f395b9e 82 } else {
mbed_official 18:da299f395b9e 83 count_val = (uint16_t)(value * (float)MAX_VAL_12BIT);
mbed_official 18:da299f395b9e 84 }
mbed_official 18:da299f395b9e 85 dac_chan_write(&(obj->dac_instance), obj->channel, count_val);
mbed_official 18:da299f395b9e 86
mbed_official 18:da299f395b9e 87 }
mbed_official 18:da299f395b9e 88
mbed_official 18:da299f395b9e 89 void analogout_write_u16(dac_t *obj, uint16_t value)
mbed_official 18:da299f395b9e 90 {
mbed_official 18:da299f395b9e 91 MBED_ASSERT(obj);
mbed_official 18:da299f395b9e 92 uint16_t count_val;
mbed_official 18:da299f395b9e 93 count_val = (uint16_t)((value * (float)MAX_VAL_12BIT) / 0xFFFF); /*Normalization to the value 0xFFFF*/
mbed_official 18:da299f395b9e 94 dac_chan_write(&(obj->dac_instance), obj->channel, count_val);
mbed_official 18:da299f395b9e 95
mbed_official 18:da299f395b9e 96 }
mbed_official 18:da299f395b9e 97
mbed_official 18:da299f395b9e 98 static uint32_t data_reg_read(dac_t *obj)
mbed_official 18:da299f395b9e 99 {
mbed_official 18:da299f395b9e 100 Dac *const dac_module = (Dac *)obj->dac;
mbed_official 18:da299f395b9e 101 return (uint32_t)dac_module->DATA[obj->channel].reg;
mbed_official 18:da299f395b9e 102 }
mbed_official 18:da299f395b9e 103
mbed_official 18:da299f395b9e 104 float analogout_read(dac_t *obj)
mbed_official 18:da299f395b9e 105 {
mbed_official 18:da299f395b9e 106 MBED_ASSERT(obj);
mbed_official 18:da299f395b9e 107 uint32_t data_val = data_reg_read(obj);
mbed_official 18:da299f395b9e 108 return data_val/(float)MAX_VAL_12BIT;
mbed_official 18:da299f395b9e 109 }
mbed_official 18:da299f395b9e 110
mbed_official 18:da299f395b9e 111 uint16_t analogout_read_u16(dac_t *obj)
mbed_official 18:da299f395b9e 112 {
mbed_official 18:da299f395b9e 113 MBED_ASSERT(obj);
mbed_official 18:da299f395b9e 114 uint32_t data_val = data_reg_read(obj);
mbed_official 18:da299f395b9e 115 return (uint16_t)((data_val / (float)MAX_VAL_12BIT) * 0xFFFF); /*Normalization to the value 0xFFFF*/
mbed_official 18:da299f395b9e 116 }