mbed library sources. Supersedes mbed-src.
Fork of mbed-dev by
targets/hal/TARGET_Atmel/TARGET_SAM_CortexM0P/TARGET_SAML21J18A/analogout_api.c@18:da299f395b9e, 2015-11-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |