请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP430F5132 各位专家,您好!
我的ADC初始化是否不正确? 无论我尝试什么,我都无法清除中断标志。 读取MEM0不会清除IFG0标志,设置ADC10IFG =0不会清除。
当我越过线125时,所有ADC10IFG立即设置为1,尽管没有ADC读数:


在中断向量内,我无法清除标志:


/* --COPYRIGHT--,BSD_EX
* Copyright (c) 2012, 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.
*
*******************************************************************************
*
* MSP430 CODE EXAMPLE DISCLAIMER
*
* MSP430 code examples are self-contained low-level programs that typically
* demonstrate a single peripheral function or device feature in a highly
* concise manner. For this the code may rely on the device's power-on default
* register values and settings such as the clock configuration and care must
* be taken when combining code from several examples to avoid potential side
* effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
* for an API functional library-approach to peripheral configuration.
*
* --/COPYRIGHT--*/
//******************************************************************************
// MSP430F51x2 Demo - ADC10, Window Comparator, 2.5V Timer trigger, DCO
//
// Description; A1 is sampled in every 1s using the TA0.1 trigger in single
// ch/conversion mode. Window comparator is used to generate interrupts to
// indicate when the input voltage goes above the High_Threshold or below the
// Low_Threshold or is inbetween the high and low thresholds. TimerD0 is used
// as an interval timer used to control the LED at P1.0 to toggle slow/fast
// or turn off according to the ADC10 Hi/Lo/IN interupts.
// ADC10 is configured in pulse sample mode and is triggered by the TA0.1
//
// MSP430F51x2
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// >---|P1.1/A1 P1.0 |--> LED
// | P3.6|--> TA0.1 (ADC trigger signal)
//
// Eason Zhou
// Texas Instruments Inc.
// January 2020
// Built with CCS v9.2.0 and IAR Embedded Workbench Version: 7.12.1
//******************************************************************************
#include <msp430.h>
#define High_Threshold 100 //TODO test to determine
#define Low_Threshold 50
#define ARRAY_SIZE 32
unsigned int SlowToggle_Period = 20000-1;
unsigned int FastToggle_Period = 1000-1;
unsigned int ADC_Read, index = 0;
unsigned int average = 0; // Average of most recent and previous measurement
unsigned int ADC_Result[ARRAY_SIZE];
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
PMAPPWD = 0x02D52; // Enable Write-access to modify port mapping registers
PMAPCTL = PMAPRECFG; // Allow reconfiguration during runtime
P1MAP1 |= PM_ANALOG; // Modify all PxMAPy registers.
PMAPPWD = 0; // Disable Write-Access to modify port mapping registers by writing incorrect key
P1SEL|=BIT1; // setting the port mapping register PxMAPy to PM_ANALOG together with PxSEL.y=1 when applying analog signals.
// Configure ADC10;
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10MSC;
// (ADC10ON) enable ADC10
// (SHTx) clk cycles per sample period
// (MSC) completion of one sample triggers next sample
ADC10CTL1 = ADC10SHP + ADC10CONSEQ_2 + ADC10SHS_0; // (SHP) pulse sample mode
// (SHS) triggered sample with ADC10SC
// (CONSEQ) repeat-single-channel mode 27.2.7.3
ADC10CTL2 = ADC10RES; // 10-bit conversion results
ADC10MCTL0 = ADC10INCH_1 + ADC10SREF_1; // (REF_x) V+ = Vref+, V- = AVSS
// (INCH_x) Read ch Ax (P1.x)
ADC10HI = High_Threshold; // Window Comparator Hi-threshold
ADC10LO = Low_Threshold; // Window Comparator Low-threshold
// Configure internal reference
while(REFCTL0 & REFGENBUSY); // If ref generator busy, WAIT
REFCTL0 |= REFVSEL_0+REFON; // (VSEL_x) Select internal ref = 2V
// This sets max FSR for ADC10 per ADC10REF
// (REFON) Internal Reference ON
__delay_cycles(75); // Delay (~75us) for Ref to settle
P1DIR |= BIT0; // Set P1.0 output direction
// TODO will this still allow ADC A0 reading?
P1OUT &= ~BIT0; // Clear P1.0
ADC10IE |= ADC10IFG0 + ADC10HIIE + ADC10LOIE; // Interrupt enable
ADC10CTL0 |= ADC10ENC + ADC10SC; // Sampling and conversion start
while(1){
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 LPM0_bits
average = (average & ADC_Read) + ((average ^ ADC_Read)>>1); // Average previous and current measurements
}
}
// ADC10 interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC10_VECTOR))) ADC10_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(ADC10IV,12))
{
case 0: break; // No interrupt
case 2: break; // conversion result overflow
case 4: break; // conversion time overflow
case 6: // ADC10HI
ADC10IFG &= ~ADC10HIIFG; // Clear interrupt flag
P1OUT = BIT0; // Turn on LED
break;
case 8: // ADC10LO
ADC10IFG &= ~ADC10LOIFG; // Clear interrupt flag
P1OUT &= ~BIT0;
break;
case 10: break;
case 12: // ADC10IFG0 set when ADC10 conversion is completed
ADC10IFG &= ~ADC10IFG0; // clear interrupt flag TODO delete
ADC_Read = ADC10MEM0; // Read ADC10MEM0 clears IFG0 flag
__bic_SR_register_on_exit(LPM0_bits + GIE); // Exit LPM0 on return to main
break;
default: break;
}
}