Vasily Davydov 25545eb2ea root: init project
Adding basic board repos, main
2022-09-14 11:05:10 +03:00

291 lines
8.7 KiB
C

/*
* @brief LPC15xx D/A conversion driver
*
* @note
* Copyright(C) NXP Semiconductors, 2014
* All rights reserved.
*
* @par
* Software that is described herein is for illustrative purposes only
* which provides customers with programming information regarding the
* LPC products. This software is supplied "AS IS" without any warranties of
* any kind, and NXP Semiconductors and its licensor disclaim any and
* all warranties, express or implied, including all implied warranties of
* merchantability, fitness for a particular purpose and non-infringement of
* intellectual property rights. NXP Semiconductors assumes no responsibility
* or liability for the use of the software, conveys no license or rights under any
* patent, copyright, mask work right, or any other intellectual property rights in
* or to any products. NXP Semiconductors reserves the right to make changes
* in the software without notification. NXP Semiconductors also makes no
* representation or warranty that such application will be suitable for the
* specified use without further testing or modification.
*
* @par
* Permission to use, copy, modify, and distribute this software and its
* documentation is hereby granted, under NXP Semiconductors' and its
* licensor's relevant copyrights in the software, without fee, provided that it
* is used in conjunction with NXP Semiconductors microcontrollers. This
* copyright, permission, and disclaimer notice must appear in all copies of
* this code.
*/
#ifndef __DAC_15XX_H_
#define __DAC_15XX_H_
#ifdef __cplusplus
extern "C" {
#endif
/** @defgroup DAC_15XX CHIP: LPC15xx D/A conversion driver
* @ingroup CHIP_15XX_Drivers
* @{
*/
/**
* @brief DAC register block structure
*/
typedef struct { /*!< DAC Structure */
__IO uint32_t VAL; /*!< DAC register. Holds the conversion data */
__IO uint32_t CTRL; /*!< DAC control register */
__IO uint32_t CNTVAL; /*!< DAC counter value register */
} LPC_DAC_T;
/** After this field is written with a
new VALUE, the voltage on the AOUT pin (with respect to VSSA)
is VALUE*((VREFP_DAC - VREFN)/4095) + VREFN */
#define DAC_VALUE(n) ((uint32_t) ((n & 0x0FFF) << 4))
/* Bit Definitions for DAC Control register */
#define DAC_INT_DMA_FLAG (1 << 0)
#define DAC_TRIG_SRC_MASK (0x7 << 1)
#define DAC_TRIG_SRC_BIT (1 << 1)
#define DAC_POLARITY (1 << 4)
#define DAC_SYNC_BYPASS (1 << 5)
#define DAC_TIM_ENA_BIT (1 << 6)
#define DAC_DBLBUF_ENA (1 << 7)
#define DAC_SHUTOFF_ENA (1 << 8)
#define DAC_SHUTOFF_FLAG (1 << 9)
#define DAC_DACCTRL_MASK ((uint32_t) 0xFF << 1)
#define DAC_CTRL_UNUSED ((uint32_t) 0x7FFFF << 13)
/** Value to reload interrupt/DMA timer */
#define DAC_CNT_VALUE(n) ((uint32_t) ((n) & 0xffff))
/**
* @brief Initial DAC configuration - Value to AOUT is 0
* @param pDAC : pointer to LPC_DAC_T
* @return Nothing
*/
void Chip_DAC_Init(LPC_DAC_T *pDAC);
/**
* @brief Shutdown DAC
* @param pDAC : pointer to LPC_DAC_T
* @return Nothing
*/
void Chip_DAC_DeInit(LPC_DAC_T *pDAC);
/**
* @brief Update value to DAC buffer
* @param pDAC : pointer to LPC_DAC_T
* @param dac_value : 12 bit input value for conversion
* @return Nothing
*/
STATIC INLINE void Chip_DAC_UpdateValue(LPC_DAC_T *pDAC, uint32_t dac_value)
{
pDAC->VAL = DAC_VALUE(dac_value);
}
/**
* @brief Get status for interrupt/DMA time out
* @param pDAC : pointer to LPC_DAC_T
* @return TRUE if interrupt/DMA flag is set else returns FALSE
*/
STATIC INLINE bool Chip_DAC_GetIntStatus(LPC_DAC_T *pDAC)
{
return (pDAC->CTRL & DAC_INT_DMA_FLAG) != 0;
}
/**
* @brief Set Interrupt/DMA trigger source as Internal timer, enable timer before this call
* @param pDAC : pointer to LPC_DAC_T
* @return Nothing
*/
STATIC INLINE void Chip_DAC_SetTrgSrcInternal(LPC_DAC_T *pDAC)
{
pDAC->CTRL &= ~(DAC_CTRL_UNUSED | DAC_TRIG_SRC_BIT);
}
/**
* @brief Set Interrupt/DMA trigger source as External Pin
* @param pDAC : pointer to LPC_DAC_T
* @return Nothing
*/
STATIC INLINE void Chip_DAC_SetTrgSrcExternal(LPC_DAC_T *pDAC)
{
pDAC->CTRL = (pDAC->CTRL & ~DAC_CTRL_UNUSED) | DAC_TRIG_SRC_BIT;
}
/**
* @brief Set Polarity for external trigger pin
* @param pDAC : pointer to LPC_DAC_T
* @param falling_edge : If TRUE indicates that the trigger polarity is Falling edge
* else it is a Rising edge
* @return Nothing
*/
STATIC INLINE void Chip_DAC_SetExtTriggerPolarity(LPC_DAC_T *pDAC, bool falling_edge)
{
if (falling_edge) {
pDAC->CTRL = (pDAC->CTRL & ~DAC_CTRL_UNUSED) | DAC_POLARITY;
}
else {
pDAC->CTRL &= ~(DAC_CTRL_UNUSED | DAC_POLARITY );
}
}
/**
* @brief Enable Sync Bypass, only if external trigger is in sync with SysClk
* @param pDAC : pointer to LPC_DAC_T
* @return Nothing
*/
STATIC INLINE void Chip_DAC_EnableSyncBypass(LPC_DAC_T *pDAC)
{
pDAC->CTRL = (pDAC->CTRL & ~DAC_CTRL_UNUSED) | DAC_SYNC_BYPASS;
}
/**
* @brief Disable Sync Bypass
* @param pDAC : pointer to LPC_DAC_T
* @return Nothing
*/
STATIC INLINE void Chip_DAC_DisableSyncBypass(LPC_DAC_T *pDAC)
{
pDAC->CTRL &= ~(DAC_CTRL_UNUSED | DAC_SYNC_BYPASS);
}
/**
* @brief Enable Internal Timer, CNTVAL should be loaded before enabling timer
* @param pDAC : pointer to LPC_DAC_T
* @return Nothing
*/
STATIC INLINE void Chip_DAC_EnableIntTimer(LPC_DAC_T *pDAC)
{
pDAC->CTRL = (pDAC->CTRL & ~DAC_CTRL_UNUSED) | DAC_TIM_ENA_BIT;
}
/**
* @brief Disable Internal Timer
* @param pDAC : pointer to LPC_DAC_T
* @return Nothing
*/
STATIC INLINE void Chip_DAC_DisableIntTimer(LPC_DAC_T *pDAC)
{
pDAC->CTRL &= ~(DAC_CTRL_UNUSED | DAC_TIM_ENA_BIT);
}
/**
* @brief Enable DAC Double Buffer
* @param pDAC : pointer to LPC_DAC_T
* @return Nothing
*/
STATIC INLINE void Chip_DAC_EnableDoubleBuffer(LPC_DAC_T *pDAC)
{
pDAC->CTRL = (pDAC->CTRL & ~DAC_CTRL_UNUSED) | DAC_DBLBUF_ENA;
}
/**
* @brief Disable DAC Double Buffer
* @param pDAC : pointer to LPC_DAC_T
* @return Nothing
*/
STATIC INLINE void Chip_DAC_DisableDoubleBuffer(LPC_DAC_T *pDAC)
{
pDAC->CTRL &= ~(DAC_CTRL_UNUSED | DAC_DBLBUF_ENA);
}
/**
* @brief Enable DAC Shut Off
* @param pDAC : pointer to LPC_DAC_T
* @return Nothing
*/
STATIC INLINE void Chip_DAC_EnableShutOff(LPC_DAC_T *pDAC)
{
pDAC->CTRL = (pDAC->CTRL & ~DAC_CTRL_UNUSED) | DAC_SHUTOFF_ENA;
}
/**
* @brief Disable DAC Shut Off
* @param pDAC : pointer to LPC_DAC_T
* @return Nothing
*/
STATIC INLINE void Chip_DAC_DisableShutOff(LPC_DAC_T *pDAC)
{
pDAC->CTRL &= ~(DAC_CTRL_UNUSED | DAC_SHUTOFF_ENA);
}
/**
* @brief Get status of DAC Shut Off
* @param pDAC : pointer to LPC_DAC_T
* @return TRUE if DAC is shut off else returns FALSE
*/
STATIC INLINE bool Chip_DAC_GetShutOffStatus(LPC_DAC_T *pDAC)
{
return (pDAC->CTRL & DAC_SHUTOFF_FLAG) != 0;
}
/**
* @brief Enables the DMA operation and controls DMA timer
* @param pDAC : pointer to LPC_DAC_T
* @param dacFlags : An Or'ed value of the following DAC values:
* - DAC_TRIG_SRC_BIT :set trigger source for Interrupt/DMA
* 0 - Internal timer trigger, 1 - External trigger
* - DAC_POLARITY :polarity of the trigger if it is external
* - DAC_SYNC_BYPASS :Synchronize selection is trigger is external
* - DAC_TIM_ENA_BIT :enable/disable internal timer
* - DAC_DBLBUF_ENA :enable/disable DAC double buffering feature
* - DAC_SHUTOFF_ENA :enable/disable DAC Shutoff Pin
* @return Nothing
* @note Pass an Or'ed value of the DAC flags to enable those options.
*/
STATIC INLINE void Chip_DAC_ConfigDMAConverterControl(LPC_DAC_T *pDAC, uint32_t dacFlags)
{
uint32_t temp;
temp = pDAC->CTRL & ~(DAC_CTRL_UNUSED | DAC_DACCTRL_MASK);
pDAC->CTRL = temp | dacFlags;
}
/**
* @brief Set reload value for interrupt/DMA timer
* @param pDAC : pointer to LPC_DAC_T
* @param time_out : time out to reload for interrupt/DMA timer.
* time out rate will be SysClk/(time_out + 1)
* @return Nothing
*/
STATIC INLINE void Chip_DAC_SetDMATimeOut(LPC_DAC_T *pDAC, uint32_t time_out)
{
pDAC->CNTVAL = DAC_CNT_VALUE(time_out);
}
/**
* @brief Set reload value for interrupt/DMA timer to trigger periodic interrupts
* @param pDAC : pointer to LPC_DAC_T
* @param periodHz : Frequency of Timer interrupts in Hz
* @return Nothing
*/
STATIC INLINE void Chip_DAC_SetReqInterval(LPC_DAC_T *pDAC, uint32_t periodHz)
{
uint32_t time_out = Chip_Clock_GetSystemClockRate() / periodHz - 1;
pDAC->CNTVAL = DAC_CNT_VALUE(time_out);
}
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* __DAC_15XX_H_ */