

This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
请您参考下面的2个代码
第一个示例使用定时器来控制采样时间(extended sample mode),第二个示例使用脉冲采样模式 1Msps (也使用 DMA)。
/*
* -------------------------------------------
* MSP432 DriverLib - v3_10_00_09
* -------------------------------------------
*
* --COPYRIGHT--,BSD,BSD
* Copyright (c) 2014, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * 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.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* 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 OWNER 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.
* --/COPYRIGHT--*/
/*******************************************************************************
* MSP432 ADC14 - Single Channel Continuous Sample w/ Timer_A Trigger
*
* Description: In this ADC14 code example, a single input channel is sampled
* using the standard 3.3v reference. The source of the sample trigger for this
* example is Timer_A CCR1. The ADC is setup to continuously sample/convert
* from A0 when the trigger starts and store the results in resultsBuffer (it
* is setup to be a circular buffer where resPos overflows to 0). Timer_A, CCR0
* and CCR1 are configured to generate a PWM. The CCR0 value is 999 and CCR1 is
* set to 996, resulting in a PWM of 1ms period and positive duty cycly of 4us.
*
* The PWM is started once the GPIO interrupt for P1.1 is serviced.
*
* MSP432P401
* ------------------
* /|\| |
* | | |
* --|RST P5.5 |<--- A0 (Analog Input)
* | |
* | P1.1 |<--- GPIO trigger to Start conversions
* | |
* | P1.0 |---> Debug port to show ADC ISR
* | P2.4 |---> Debug TA0.1, ADC trigger
* | |
*
* Author: T. Logan/ C. Sterzik
******************************************************************************/
/* DriverLib Includes */
#include "driverlib.h"
/* Standard Includes */
#include <stdint.h>
#include <stdbool.h>
/*
* Timer_A Compare Configuration Parameter
* CCR1 is used to trigger the ADC14, conversion time
* is defined by the resolution
* 14bit -> 16 cycles + 1 cycle (SLAU356d, 20.2.8.3)
* 12bit -> 14 cycles + 1 cycle
* 10bit -> 11 cycles + 1 cycle
* 8bit -> 9 cycles + 1 cycle
*
* In this example, 14-bit resolution at 24Mhz ~708ns conversion time
* Sample time is defined by high phase ~4us
* Sample period is 1000/1Mhz = 1ms
*/
const Timer_A_PWMConfig timerA_PWM =
{
.clockSource = TIMER_A_CLOCKSOURCE_SMCLK,
.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_24,
.timerPeriod = 999,
.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1,
.compareOutputMode TIMER_A_OUTPUTMODE_SET_RESET,
.dutyCycle = 996
};
/* Statics */
static volatile uint_fast16_t resultsBuffer[256];
static volatile uint8_t resPos;
int main(void)
{
/* Halting WDT */
MAP_WDT_A_holdTimer();
MAP_Interrupt_enableSleepOnIsrExit();
resPos = 0;
/* Starting HFXT in non-bypass mode without a timeout. Before we start
* we have to change VCORE to 1 to support the 48MHz frequency */
MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);
MAP_FlashCtl_setWaitState(FLASH_BANK0, 1);
MAP_FlashCtl_setWaitState(FLASH_BANK1, 1);
/*
* Setting up clocks
* MCLK = MCLK = 48MHz
* SMCLK = MCLK/2 = 24Mhz
* ACLK = REFO = 32Khz
*/
MAP_CS_setDCOFrequency(48000000);
MAP_CS_initClockSignal(CS_ACLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);
MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_2);
MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);
/* Initializing ADC (SMCLK/1/1) */
MAP_ADC14_enableModule();
MAP_ADC14_initModule(ADC_CLOCKSOURCE_SMCLK, ADC_PREDIVIDER_1, ADC_DIVIDER_1,
0);
/*
* Debug
* Configuring P1.0 as output
*/
MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
P1OUT &= ~BIT0;
/*
* Configuring GPIOs (5.5 A0)
*/
MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN5,
GPIO_TERTIARY_MODULE_FUNCTION);
/*
* Debug: set TA0.1 as output to see ADC trigger signal
*/
MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN4,
GPIO_PRIMARY_MODULE_FUNCTION);
/*
* Configuring P1.1 as an input and enabling interrupt, the timer is started from
* GPIO ISR.
*/
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);
MAP_GPIO_interruptEdgeSelect(GPIO_PORT_P1,GPIO_PIN1,GPIO_HIGH_TO_LOW_TRANSITION);
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1);
MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1);
MAP_Interrupt_enableInterrupt(INT_PORT1);
/*
* Configuring ADC Memory, repeat-single-channel, A0
*/
MAP_ADC14_configureSingleSampleMode(ADC_MEM0, true);
/*
* Configuring ADC Memory, reference, and single ended conversion
* A0 goes to mem0, AVcc is the reference, and the conversion is
* single-ended
*/
MAP_ADC14_configureConversionMemory(ADC_MEM0, ADC_VREFPOS_AVCC_VREFNEG_VSS,
ADC_INPUT_A0, false);
/*
* Configuring the sample trigger to be sourced from Timer_A0 CCR1 and on the
* rising edge, default samplemode is extended (SHP=0)
*/
MAP_ADC14_setSampleHoldTrigger(ADC_TRIGGER_SOURCE1, false);
/* Enabling the interrupt when a conversion on channel 1 is complete and
* enabling conversions */
MAP_ADC14_enableInterrupt(ADC_INT0);
MAP_ADC14_enableConversion();
/* Enabling Interrupts */
MAP_Interrupt_enableInterrupt(INT_ADC14);
MAP_Interrupt_enableMaster();
/* Going to sleep */
MAP_PCM_gotoLPM0();
while(1);
}
/* This interrupt is fired whenever a conversion is completed and placed in
* ADC_MEM0 */
void ADC14_IRQHandler(void)
{
uint64_t status;
status = MAP_ADC14_getEnabledInterruptStatus();
MAP_ADC14_clearInterruptFlag(status);
if (status & ADC_INT0)
{
resultsBuffer[resPos++] = MAP_ADC14_getResult(ADC_MEM0);
if(resPos == 0)
{
P1OUT |= BIT0;
MAP_Timer_A_stopTimer(TIMER_A0_BASE);
MAP_Timer_A_clearTimer(TIMER_A0_BASE);
P1OUT &= ~BIT0;
}
}
}
void PORT1_IRQHandler(void)
{
if(P1->IV == 4)
{
P1OUT |= BIT0;
while(P1->IFG & BIT1)
{
P1->IFG &= ~BIT1;
}
MAP_Timer_A_generatePWM(TIMER_A0_BASE, &timerA_PWM);
P1OUT &= ~BIT0;
}
}
void DMA_INT1_IRQHandler(void)
{
__no_operation();
}
/*
* -------------------------------------------
* MSP432 DriverLib - v3_10_00_09
* -------------------------------------------
*
* --COPYRIGHT--,BSD,BSD
* Copyright (c) 2014, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * 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.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* 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 OWNER 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.
* --/COPYRIGHT--*/
/*******************************************************************************
* MSP432 ADC14 - Single Channel Continuous Sample w/ Timer_A Trigger
*
* Description: In this ADC14 code example, a single input channel is sampled
* using the standard 3.3v reference. The source of the sample trigger for this
* example is Timer_A CCR1. The ADC is setup to continuously sample/convert
* from A0 when the trigger starts and store the results in resultsBuffer (it
* is setup to be a circular buffer where resPos overflows to 0). Timer_A, CCR0
* and CCR1 are configured to generate a PWM. The CCR0 value is 23 and CCR1 is
* set to 11, resulting in a PWM of 1us period. The sample time is driven by
* the ADC clock and not the PWM duty cycle.
*
* The PWM is started once the GPIO interrupt for P1.1 is serviced.
*
* MSP432P401
* ------------------
* /|\| |
* | | |
* --|RST P5.5 |<--- A0 (Analog Input)
* | |
* | P1.1 |<--- GPIO trigger to Start conversions
* | |
* | P1.0 |---> Debug port to show DMA ISR
* | P2.4 |---> Debug TA0.1, ADC trigger
* | |
*
* Author: Timothy Logan/ C. Sterzik
******************************************************************************/
/* DriverLib Includes */
#include "driverlib.h"
/* Standard Includes */
#include <stdint.h>
#include <stdbool.h>
#define ARRAY_LENGTH 256
/*
* Timer_A Compare Configuration Parameter
* CCR1 is used to trigger the ADC14, conversion time
* is defined by the resolution
* 14bit -> 16 cycles + 1 cycle (SLAU356d, 20.2.8.3)
* 12bit -> 14 cycles + 1 cycle
* 10bit -> 11 cycles + 1 cycle
* 8bit -> 9 cycles + 1 cycle
*
* In this example, 14-bit resolution at 24Mhz ~708ns conversion time
* Sample time is defined by 4 ADC clocks
* Sample period is 24/24Mhz = 1us
*/
const Timer_A_PWMConfig timerA_PWM =
{
.clockSource = TIMER_A_CLOCKSOURCE_SMCLK,
.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1,
.timerPeriod = 23,
.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1,
.compareOutputMode TIMER_A_OUTPUTMODE_SET_RESET,
.dutyCycle = 11
};
/* DMA Control Table */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_ALIGN(MSP_EXP432P401RLP_DMAControlTable, 1024)
#elif defined(__IAR_SYSTEMS_ICC__)
#pragma data_alignment=1024
#elif defined(__GNUC__)
__attribute__ ((aligned (1024)))
#elif defined(__CC_ARM)
__align(1024)
#endif
static DMA_ControlTable MSP_EXP432P401RLP_DMAControlTable[16];
/* Statics */
static volatile uint16_t resultsBufferPrimary[ARRAY_LENGTH];
static volatile uint16_t resultsBufferAlternate[ARRAY_LENGTH];
int main(void)
{
/* Halting WDT */
MAP_WDT_A_holdTimer();
MAP_Interrupt_enableSleepOnIsrExit();
/* Starting HFXT in non-bypass mode without a timeout. Before we start
* we have to change VCORE to 1 to support the 48MHz frequency */
MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);
MAP_FlashCtl_setWaitState(FLASH_BANK0, 1);
MAP_FlashCtl_setWaitState(FLASH_BANK1, 1);
/*
* Setting up clocks
* MCLK = MCLK = 48MHz
* SMCLK = MCLK/2 = 24Mhz
* ACLK = REFO = 32Khz
*/
MAP_CS_setDCOFrequency(48000000);
MAP_CS_initClockSignal(CS_ACLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);
MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_2);
MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);
/* Initializing ADC (SMCLK/1/1) */
MAP_ADC14_enableModule();
MAP_ADC14_initModule(ADC_CLOCKSOURCE_SMCLK, ADC_PREDIVIDER_1, ADC_DIVIDER_1,
0);
/*
* Debug
* Configuring P1.0 as output
*/
MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
P1OUT &= ~BIT0;
/*
* Configuring GPIOs (5.5 A0)
*/
MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN5,
GPIO_TERTIARY_MODULE_FUNCTION);
/*
* Debug: set TA0.1 as output to see ADC trigger signal
*/
MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN4,
GPIO_PRIMARY_MODULE_FUNCTION);
/*
* Configuring P1.1 as an input and enabling interrupt, the timer is started from
* GPIO ISR.
*/
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);
MAP_GPIO_interruptEdgeSelect(GPIO_PORT_P1,GPIO_PIN1,GPIO_HIGH_TO_LOW_TRANSITION);
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1);
MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1);
/*
* Configuring ADC Memory, repeat-single-channel, A0
*/
MAP_ADC14_configureSingleSampleMode(ADC_MEM0, true);
/*
* Configuring ADC Memory, reference, and single ended conversion
* A0 goes to mem0, AVcc is the reference, and the conversion is
* single-ended
*/
MAP_ADC14_configureConversionMemory(ADC_MEM0, ADC_VREFPOS_AVCC_VREFNEG_VSS,
ADC_INPUT_A0, false);
/*
* Configuring the sample trigger to be sourced from Timer_A0 CCR1 and on the
* rising edge, default samplemode is extended (SHP=0)
*/
MAP_ADC14_setSampleHoldTrigger(ADC_TRIGGER_SOURCE1, false);
/* Enabling the interrupt when a conversion on channel 1 is complete and
* enabling conversions */
MAP_ADC14_enableInterrupt(ADC_INT0);
MAP_ADC14_enableConversion();
/* Configuring DMA module */
MAP_DMA_enableModule();
MAP_DMA_setControlBase(MSP_EXP432P401RLP_DMAControlTable);
/*
* Setup the DMA + ADC14 interface
*/
MAP_DMA_disableChannelAttribute(DMA_CH7_ADC14,
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
/*
* Setting Control Indexes. In this case we will set the source of the
* DMA transfer to ADC14 Memory 0 and the destination to the destination
* data array.
*/
MAP_DMA_setChannelControl(UDMA_PRI_SELECT | DMA_CH7_ADC14,
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
MAP_DMA_setChannelTransfer(UDMA_PRI_SELECT | DMA_CH7_ADC14,
UDMA_MODE_PINGPONG, (void*) &ADC14->MEM[0],
(void*)resultsBufferPrimary, ARRAY_LENGTH);
MAP_DMA_setChannelControl(UDMA_ALT_SELECT | DMA_CH7_ADC14,
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
MAP_DMA_setChannelTransfer(UDMA_ALT_SELECT | DMA_CH7_ADC14,
UDMA_MODE_PINGPONG, (void*) &ADC14->MEM[0],
(void*)resultsBufferAlternate, ARRAY_LENGTH);
/* Assigning/Enabling Interrupts */
MAP_DMA_assignInterrupt(DMA_INT1, 7);
MAP_DMA_assignChannel(DMA_CH7_ADC14);
MAP_DMA_clearInterruptFlag(7);
/* Enabling Interrupts */
MAP_Interrupt_enableInterrupt(INT_DMA_INT1);
MAP_Interrupt_enableInterrupt(INT_PORT1);
MAP_Interrupt_enableMaster();
/* Going to sleep */
MAP_PCM_gotoLPM0();
__no_operation();
}
/* Completion interrupt for ADC14 MEM0 */
__attribute__((ramfunc)) // Requires compiler TI v15.12.1.LTS
void DMA_INT1_IRQHandler(void)
{
MAP_Timer_A_stopTimer(TIMER_A0_BASE);
MAP_DMA_disableChannel(7);
P1->OUT |= BIT0;
/*
* Switch between primary and alternate bufferes with DMA's PingPong mode
*/
if (MAP_DMA_getChannelAttribute(7) & UDMA_ATTR_ALTSELECT)
{
// MAP_DMA_setChannelControl(UDMA_PRI_SELECT | DMA_CH7_ADC14,
// UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
// MAP_DMA_setChannelTransfer(UDMA_PRI_SELECT | DMA_CH7_ADC14,
// UDMA_MODE_PINGPONG, (void*) &ADC14->MEM[0],
// resultsBufferPrimary, ARRAY_LENGTH);
MSP_EXP432P401RLP_DMAControlTable[7].control =
(MSP_EXP432P401RLP_DMAControlTable[7].control & 0xff000000 ) |
(((ARRAY_LENGTH)-1)<<4) | 0x03;
}
else
{
// MAP_DMA_setChannelControl(UDMA_ALT_SELECT | DMA_CH7_ADC14,
// UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
// MAP_DMA_setChannelTransfer(UDMA_ALT_SELECT | DMA_CH7_ADC14,
// UDMA_MODE_PINGPONG, (void*) &ADC14->MEM[0],
// resultsBufferAlternate, ARRAY_LENGTH);
MSP_EXP432P401RLP_DMAControlTable[15].control =
(MSP_EXP432P401RLP_DMAControlTable[15].control & 0xff000000 ) |
(((ARRAY_LENGTH)-1)<<4) | 0x03;
}
P1->OUT &= ~BIT0;
}
void PORT1_IRQHandler(void)
{
P1->OUT |= BIT0;
P1IFG &= ~BIT1;
MAP_DMA_enableChannel(7);
MAP_Timer_A_generatePWM(TIMER_A0_BASE, &timerA_PWM);
P1->OUT &= ~BIT0;
}有没有不需要DMA中断的,
您可以在下面路径找到
C:\ti\simplelink_msp432p4_sdk_3_40_01_02\examples\nortos\MSP_EXP432P401R\driverlib
如 adc14_multiple_channel_no_repeat