161 lines
6.7 KiB
C
161 lines
6.7 KiB
C
/*
|
|
* The Clear BSD License
|
|
* Copyright (c) 2015, Freescale Semiconductor, Inc.
|
|
* Copyright 2016-2017 NXP
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without modification,
|
|
* are permitted (subject to the limitations in the disclaimer below) provided
|
|
* that the following conditions are met:
|
|
*
|
|
* o Redistributions of source code must retain the above copyright notice, this list
|
|
* of conditions and the following disclaimer.
|
|
*
|
|
* o Redistributions in binary form must reproduce the above copyright notice, this
|
|
* list of conditions and the following disclaimer in the documentation and/or
|
|
* other materials provided with the distribution.
|
|
*
|
|
* o Neither the name of the copyright holder nor the names of its
|
|
* contributors may be used to endorse or promote products derived from this
|
|
* software without specific prior written permission.
|
|
*
|
|
* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#include "fsl_debug_console.h"
|
|
#include "board.h"
|
|
#include "fsl_adc16.h"
|
|
#include "fsl_lptmr.h"
|
|
|
|
#include "fsl_device_registers.h"
|
|
#include "fsl_common.h"
|
|
#include "pin_mux.h"
|
|
#include "clock_config.h"
|
|
/*******************************************************************************
|
|
* Definitions
|
|
******************************************************************************/
|
|
#define DEMO_ADC16_BASEADDR ADC0
|
|
#define DEMO_ADC16_CHANNEL_GROUP 0U
|
|
#define DEMO_ADC16_USER_CHANNEL 0U
|
|
#define LPTMR_CLK_FREQ CLOCK_GetFreq(kCLOCK_LpoClk)
|
|
|
|
/*******************************************************************************
|
|
* Prototypes
|
|
******************************************************************************/
|
|
|
|
/*******************************************************************************
|
|
* Variables
|
|
******************************************************************************/
|
|
volatile uint32_t adcResultValue = 0U;
|
|
/*******************************************************************************
|
|
* Code
|
|
******************************************************************************/
|
|
void LPTMR0_IRQHandler(void)
|
|
{
|
|
LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag);
|
|
PRINTF("\r\nThe ADC16 output value is %d.\r\n", adcResultValue);
|
|
/* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
|
|
exception return operation might vector to incorrect interrupt */
|
|
#if defined __CORTEX_M && (__CORTEX_M == 4U)
|
|
__DSB();
|
|
#endif
|
|
}
|
|
|
|
/*!
|
|
* @brief Main function
|
|
*/
|
|
int main(void)
|
|
{
|
|
lptmr_config_t lptmrConfig;
|
|
adc16_config_t adc16ConfigStruct;
|
|
adc16_channel_config_t adc16ChannelConfigStruct;
|
|
|
|
BOARD_InitPins();
|
|
BOARD_BootClockHSRUN();
|
|
BOARD_InitDebugConsole();
|
|
|
|
/* Configure LPTMR */
|
|
/*
|
|
* lptmrConfig.timerMode = kLPTMR_TimerModeTimeCounter;
|
|
* lptmrConfig.pinSelect = kLPTMR_PinSelectInput_0;
|
|
* lptmrConfig.pinPolarity = kLPTMR_PinPolarityActiveHigh;
|
|
* lptmrConfig.enableFreeRunning = false;
|
|
* lptmrConfig.bypassPrescaler = true;
|
|
* lptmrConfig.prescalerClockSource = kLPTMR_PrescalerClock_1;
|
|
* lptmrConfig.value = kLPTMR_Prescale_Glitch_0;
|
|
*/
|
|
LPTMR_GetDefaultConfig(&lptmrConfig);
|
|
/* Initialize the lptmr */
|
|
LPTMR_Init(LPTMR0, &lptmrConfig);
|
|
|
|
/* Set timer period */
|
|
LPTMR_SetTimerPeriod(LPTMR0, USEC_TO_COUNT(1000000u, LPTMR_CLK_FREQ));
|
|
|
|
/* Enable timer interrupt */
|
|
LPTMR_EnableInterrupts(LPTMR0, kLPTMR_TimerInterruptEnable);
|
|
|
|
/* Enable at the NVIC */
|
|
EnableIRQ(LPTMR0_IRQn);
|
|
LPTMR_StartTimer(LPTMR0);
|
|
/*
|
|
* adc16ConfigStruct.referenceVoltageSource = kADC16_ReferenceVoltageSourceVref;
|
|
* adc16ConfigStruct.clockSource = kADC16_ClockSourceAsynchronousClock;
|
|
* adc16ConfigStruct.enableAsynchronousClock = true;
|
|
* adc16ConfigStruct.clockDivider = kADC16_ClockDivider8;
|
|
* adc16ConfigStruct.resolution = kADC16_ResolutionSE12Bit;
|
|
* adc16ConfigStruct.longSampleMode = kADC16_LongSampleDisabled;
|
|
* adc16ConfigStruct.enableHighSpeed = false;
|
|
* adc16ConfigStruct.enableLowPower = false;
|
|
* adc16ConfigStruct.enableContinuousConversion = false;
|
|
*/
|
|
ADC16_GetDefaultConfig(&adc16ConfigStruct);
|
|
adc16ConfigStruct.clockDivider = kADC16_ClockDivider2;
|
|
ADC16_Init(DEMO_ADC16_BASEADDR, &adc16ConfigStruct);
|
|
#if defined(DEMO_ADC16_CHANNEL_MUXB) && DEMO_ADC16_CHANNEL_MUXB
|
|
ADC16_SetChannelMuxMode(DEMO_ADC16_BASEADDR, kADC16_ChannelMuxB);
|
|
#endif
|
|
ADC16_EnableHardwareTrigger(DEMO_ADC16_BASEADDR, false); /* Make sure the software trigger is used. */
|
|
#if defined(FSL_FEATURE_ADC16_HAS_CALIBRATION) && FSL_FEATURE_ADC16_HAS_CALIBRATION
|
|
if (kStatus_Success == ADC16_DoAutoCalibration(DEMO_ADC16_BASEADDR))
|
|
{
|
|
PRINTF("ADC16_DoAutoCalibration() Done.\r\n");
|
|
}
|
|
else
|
|
{
|
|
PRINTF("ADC16_DoAutoCalibration() Failed.\r\n");
|
|
}
|
|
#endif /* FSL_FEATURE_ADC16_HAS_CALIBRATION */
|
|
adc16ChannelConfigStruct.channelNumber = DEMO_ADC16_USER_CHANNEL;
|
|
adc16ChannelConfigStruct.enableInterruptOnConversionCompleted = false;
|
|
#if defined(FSL_FEATURE_ADC16_HAS_DIFF_MODE) && FSL_FEATURE_ADC16_HAS_DIFF_MODE
|
|
adc16ChannelConfigStruct.enableDifferentialConversion = false;
|
|
#endif /* FSL_FEATURE_ADC16_HAS_DIFF_MODE */
|
|
|
|
while (1)
|
|
{
|
|
/*
|
|
When in software trigger mode, each conversion would be launched once calling the "ADC16_ChannelConfigure()"
|
|
function, which works like writing a conversion command and executing it. For another channel's conversion,
|
|
just to change the "channelNumber" field in channel's configuration structure, and call the
|
|
"ADC16_ChannelConfigure() again.
|
|
*/
|
|
ADC16_SetChannelConfig(DEMO_ADC16_BASEADDR, DEMO_ADC16_CHANNEL_GROUP, &adc16ChannelConfigStruct);
|
|
|
|
while (0U == (kADC16_ChannelConversionDoneFlag &
|
|
ADC16_GetChannelStatusFlags(DEMO_ADC16_BASEADDR, DEMO_ADC16_CHANNEL_GROUP)))
|
|
{
|
|
}
|
|
adcResultValue = ADC16_GetChannelConversionValue(DEMO_ADC16_BASEADDR, DEMO_ADC16_CHANNEL_GROUP);
|
|
}
|
|
}
|