diff --git a/include/libopencm3/lpc43xx/adc.h b/include/libopencm3/lpc43xx/adc.h index 502c0fb27e..d22d596944 100644 --- a/include/libopencm3/lpc43xx/adc.h +++ b/include/libopencm3/lpc43xx/adc.h @@ -112,6 +112,43 @@ extern "C" { #define ADC0_STAT ADC_STAT(ADC0) #define ADC1_STAT ADC_STAT(ADC1) + +/* ADC_CR Values ----------------------------------------------------------- */ + +#define ADC_CR_CH0 (1<<0) +#define ADC_CR_CH1 (1<<1) +#define ADC_CR_CH2 (1<<2) +#define ADC_CR_CH3 (1<<3) +#define ADC_CR_CH4 (1<<4) +#define ADC_CR_CH5 (1<<5) +#define ADC_CR_CH6 (1<<6) +#define ADC_CR_CH7 (1<<7) + +#define ADC_CR_CLKDIV(x) ((x&0xff)<<8) +#define ADC_CR_BURST (1<<16) + +#define ADC_CR_10BITS (0<<17) +#define ADC_CR_9BITS (1<<17) +#define ADC_CR_8BITS (2<<17) +#define ADC_CR_7BITS (3<<17) +#define ADC_CR_6BITS (4<<17) +#define ADC_CR_5BITS (5<<17) +#define ADC_CR_4BITS (6<<17) +#define ADC_CR_3BITS (7<<17) + +#define ADC_CR_POWER (1<<21) + +#define ADC_CR_START (1<<24) +/* missing: add other start modes */ + +/* ADC_GDR and ADC_DR Values */ +#define ADC_DR_VREF(x) ((x>>6)&0b1111111111) +#define ADC_DR_CHN(x) ((x>>24)&0b111) +#define ADC_DR_OVERRUN(x) (((x&(1<<30))!=0)) +#define ADC_DR_DONE(x) (((x&(1<<31))!=0)) + +uint16_t adc_get_single(uint32_t adc, uint32_t flags); + /**@}*/ #ifdef __cplusplus diff --git a/include/libopencm3/lpc43xx/dac.h b/include/libopencm3/lpc43xx/dac.h new file mode 100644 index 0000000000..2f04aff806 --- /dev/null +++ b/include/libopencm3/lpc43xx/dac.h @@ -0,0 +1,84 @@ +/** @defgroup dac_defines DAC Defines + +@brief Defined Constants and Types for the LPC43xx DAC + +@ingroup LPC43xx_defines + +@version 1.0.0 + +@author @htmlonly © @endhtmlonly 2015 + +@date 09 June 2015 + +LGPL License Terms @ref lgpl_license + */ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2015 + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +#ifndef LPC43XX_DAC_H +#define LPC43XX_DAC_H + +/**@{*/ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* --- DAC registers ------------------------------------------------------- */ + +/* DAC register. Holds the conversion data */ +#define DAC_CR MMIO32(DAC_BASE + 0x000) + +/* DAC control register */ +#define DAC_CTRL MMIO32(DAC_BASE + 0x004) + +/* DAC counter value register */ +#define DAC_CNTVAL MMIO32(DAC_BASE + 0x008) + +/* --- DAC_CR values -------------------------------------------------- */ + +#define DAC_CR_BIAS (1 << 16) /* Settling time */ + +/* --- DAC_CTRL values -------------------------------------------------- */ + +#define DAC_CTRL_INT_DMA_REQ (1 << 0) /* DMA request */ +#define DAC_CTRL_DBLBUF_ENA (1 << 1) /* DMA double-buffering */ +#define DAC_CTRL_CNT_ENA (1 << 2) /* DMA time-out */ +#define DAC_CTRL_DMA_ENA (1 << 3) /* Combined DAC and DMA enable */ + +/* --- DAC function prototypes --------------------------------------------- */ + +BEGIN_DECLS + +void dac_init(bool fast); + +void dac_set(uint16_t v); + +END_DECLS + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/libopencm3/lpc43xx/scu.h b/include/libopencm3/lpc43xx/scu.h index e057a38eb4..0ab580f91c 100644 --- a/include/libopencm3/lpc43xx/scu.h +++ b/include/libopencm3/lpc43xx/scu.h @@ -773,6 +773,15 @@ typedef enum { SCU_CONF_EZI_EN_IN_BUFFER | \ SCU_CONF_ZIF_DIS_IN_GLITCH_FILT) +/* definitions for ENAIO */ + +#define SCU_ENAIO_ADCx_0 (1<<0) +#define SCU_ENAIO_ADCx_1 (1<<1) +#define SCU_ENAIO_ADCx_2 (1<<2) +#define SCU_ENAIO_ADCx_3 (1<<3) +#define SCU_ENAIO_ADCx_4 (1<<4) +#define SCU_ENAIO_ADCx_5 (1<<5) +#define SCU_ENAIO_ADCx_6 (1<<6) BEGIN_DECLS void scu_pinmux(scu_grp_pin_t group_pin, uint32_t scu_conf); diff --git a/include/libopencmsis/dispatch/irqhandlers.h b/include/libopencmsis/dispatch/irqhandlers.h index 65e071d79d..2a8105157c 100644 --- a/include/libopencmsis/dispatch/irqhandlers.h +++ b/include/libopencmsis/dispatch/irqhandlers.h @@ -14,8 +14,11 @@ #elif defined(EFM32GG) # include -#elif defined(LPC43XX) -# include +#elif defined(LPC43XX_M4) +# include + +#elif defined(LPC43XX_M0) +# include #else # warning"no chipset defined; user interrupts are not redirected" diff --git a/lib/lpc43xx/adc.c b/lib/lpc43xx/adc.c new file mode 100644 index 0000000000..08637a78f6 --- /dev/null +++ b/lib/lpc43xx/adc.c @@ -0,0 +1,51 @@ +/** @defgroup adc_file ADC + +@ingroup LPC43xx + +@brief libopencm3 LPC43xx ADC + +@version 1.0.0 + +@author @htmlonly © @endhtmlonly 2015 + +LGPL License Terms @ref lgpl_license +*/ + +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2015 + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +/**@{*/ + +#include +#include + +uint16_t adc_get_single(uint32_t adc, uint32_t flags) +{ + uint32_t result; + ADC_CR(adc)=flags | ADC_CR_CLKDIV((uint8_t)(208/4.5))|ADC_CR_10BITS|ADC_CR_POWER|ADC_CR_START; + + do { + result=ADC_GDR(adc); + } while( (!ADC_DR_DONE(result)) ); + + return ADC_DR_VREF(result); +}; + +/**@}*/ + diff --git a/lib/lpc43xx/dac.c b/lib/lpc43xx/dac.c new file mode 100644 index 0000000000..55b112bc6a --- /dev/null +++ b/lib/lpc43xx/dac.c @@ -0,0 +1,54 @@ +/** @defgroup dac_file DAC + +@ingroup LPC43xx + +@brief libopencm3 LPC43xx DAC + +@version 1.0.0 + +@author @htmlonly © @endhtmlonly 2015 + +LGPL License Terms @ref lgpl_license +*/ + +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2015 + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +/**@{*/ + +#include +#include + +static bool dac_fast = false; + +void dac_init(bool fast) +{ + CCU1_CLK_APB3_DAC_CFG |= 1; /* Enable DAC Clock */ + DAC_CTRL = DAC_CTRL_DMA_ENA; + dac_fast = fast; +} + +void dac_set(uint16_t v) +{ + DAC_CR = (v & 0x3FF) << 6 | (dac_fast ? 0 : DAC_CR_BIAS); +} + + +/**@}*/ + diff --git a/lib/lpc43xx/m4/Makefile b/lib/lpc43xx/m4/Makefile index f6931663be..fb871b583f 100644 --- a/lib/lpc43xx/m4/Makefile +++ b/lib/lpc43xx/m4/Makefile @@ -39,7 +39,7 @@ CFLAGS = -O2 -g3 \ ARFLAGS = rcs # LPC43xx common files for M4 / M0 -OBJ_LPC43XX = gpio.o scu.o i2c.o ssp.o uart.o timer.o wwdt.o +OBJ_LPC43XX = gpio.o scu.o i2c.o ssp.o uart.o timer.o wwdt.o dac.o adc.o #LPC43xx M4 specific file + Generic LPC43xx M4/M0 files OBJS = $(OBJ_LPC43XX) ipc.o