Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-src by
analogout_api.c
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2013 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 #include "analogout_api.h" 00017 00018 #include "cmsis.h" 00019 #include "pinmap.h" 00020 #include "error.h" 00021 00022 #define RANGE_12BIT 0xFFF 00023 00024 static const PinMap PinMap_DAC[] = { 00025 {PTE30, DAC_0, 0}, 00026 {NC , NC , 0} 00027 }; 00028 00029 void analogout_init(dac_t *obj, PinName pin) { 00030 obj->dac = (DACName)pinmap_peripheral(pin, PinMap_DAC); 00031 if (obj->dac == (uint32_t)NC) { 00032 error("DAC pin mapping failed"); 00033 } 00034 00035 SIM->SCGC6 |= SIM_SCGC6_DAC0_MASK; 00036 00037 uint32_t port = (uint32_t)pin >> PORT_SHIFT; 00038 SIM->SCGC5 |= 1 << (SIM_SCGC5_PORTA_SHIFT + port); 00039 00040 DAC0->DAT[obj->dac].DATH = 0; 00041 DAC0->DAT[obj->dac].DATL = 0; 00042 00043 DAC0->C1 = DAC_C1_DACBFMD_MASK; // One-Time Scan Mode 00044 00045 DAC0->C0 = DAC_C0_DACEN_MASK // Enable 00046 | DAC_C0_DACSWTRG_MASK; // Software Trigger 00047 00048 pinmap_pinout(pin, PinMap_DAC); 00049 00050 analogout_write_u16(obj, 0); 00051 } 00052 00053 void analogout_free(dac_t *obj) {} 00054 00055 static inline void dac_write(dac_t *obj, int value) { 00056 DAC0->DAT[obj->dac].DATL = (uint8_t)( value & 0xFF); 00057 DAC0->DAT[obj->dac].DATH = (uint8_t)((value >> 8) & 0xFF); 00058 } 00059 00060 static inline int dac_read(dac_t *obj) { 00061 return ((DAC0->DAT[obj->dac].DATH << 8) | DAC0->DAT[obj->dac].DATL); 00062 } 00063 00064 void analogout_write(dac_t *obj, float value) { 00065 if (value < 0.0) { 00066 dac_write(obj, 0); 00067 } else if (value > 1.0) { 00068 dac_write(obj, RANGE_12BIT); 00069 } else { 00070 dac_write(obj, value * (float)RANGE_12BIT); 00071 } 00072 } 00073 00074 void analogout_write_u16(dac_t *obj, uint16_t value) { 00075 dac_write(obj, value >> 4); // 12-bit 00076 } 00077 00078 float analogout_read(dac_t *obj) { 00079 uint32_t value = dac_read(obj); 00080 return (float)value * (1.0f / (float)RANGE_12BIT); 00081 } 00082 00083 uint16_t analogout_read_u16(dac_t *obj) { 00084 uint32_t value = dac_read(obj); // 12-bit 00085 return (value << 4) | ((value >> 8) & 0x003F); 00086 }
Generated on Tue Jul 12 2022 13:47:00 by
1.7.2
