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.

[参考译文] MSP430FR5969:GPIO问题

Guru**** 2553450 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/638216/msp430fr5969-problem-with-gpio

部件号:MSP430FR5969

您好,TI社区:

感谢您对设备的支持。 我正在对MSP430进行编程,并且希望将WFP 1.6 配置为读取数字输入。 我设置了分压器,在开关打开时给我3V电压,在开关关闭时给我0V电压。 我将WFP 1.6 配置为输入,P1DIR寄存器,P1OUT位6至零(用于选择下拉)和P1REN位6至1 (用于启用下拉/上电阻)。 问题是我总是得到一个零,尽管我在输入上施加了电压。 我的代码是否有问题?  

祝你一切顺利,

Luiz Moreira

#include <MSP4S.h>

内部主(无效)

WDTCTL = WDTPW | WDTHOLD;//停止WDT

//配置GPIO
P1DIR = 0b1000.1万;//|= BIT3 | BIT7;//输出
P1REN = 0b100万;
P1OUT = 0b0.1万;//|= BIT3;

//禁用GPIO开机默认高阻抗模式以激活
//以前配置的端口设置
PM5CTL0 &=~LOCKLPM2;

//时钟
CSCTL0_H = CSOKEY >> 8;//解锁CS寄存器
CSCTL1 = DCOFSEL_0;//DCO em 1 MHz
CSCTL2 =拉美_ VLOCLK | SESS_ DCOCLK | SELM_ DCOCLK;//SMCLK em 1 MHz
CSCTL3 = DIFS_0;


//定时器A
TA0CCTL0 = CCIE;//已启用TACR0中断
TA0CCR0 = 1000;
TA0CTL = tassel__SMCLK | MC__UP;// SMCLK,UP模式

//配置ADC12
ADC12CTL0 = ADC12SHT0_2 | ADC12ON;//采样时间,S&H = 16,ADC12开
ADC12CTL1 = ADC12SHP;//使用采样计时器
ADC12CTL2 || ADC12RES_2;// 12位转换结果
ADC12MCTL0 |= ADC12INCH_1;// A1 ADC输入选择;Vref=AVCC
ADC12IER0 |= ADC12IE0;//启用ADC转换完成中断

同时(1)

IF ((P1IN & BIT6)=1){
P1OUT = 0b1000万;//|= BIT7;
}
否则IF ((P1IN & BIT6)==0){
P1OUT = 0b0万;//|= BIT7;
}
__DELAY周期(5000);
ADC12CTL0 || ADC12ENC | ADC12SC;//开始采样/转换

__bis_sr_register (LPM0_bits + GIE);
__no_operation();//用于调试器
}

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Luiz:

    您是使用调试器还是仅评估WFP 1.7 输出? 您是否有退出LPM0的ADC ISR? 否则,您将永远不会循环以重新评估P1IN。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ryan Brown1说的话,加上:
    > IF ((P1IN & BIT6)==1){
    此条件始终为假。 尝试:
    > IF ((P1IN & BIT6)==BIT6){
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢Brown先生和McKenney先生。 我有一个ADC ISR,我将在这篇文章下面发布。  我的程序中的ADC部分工作正常。  我正在为我的主板使用Code Composer标准调试器。 我确实遇到过这段代码[__bis_sr_register(LPM0_bits + GIE);]的问题。 有时我的程序在这种说法中被卡住,我不得不“重新启动”我的主板。 您能给我更多关于这方面的见解吗?

    关于Bruce的观点,我将在实验室中尝试,并很快回复。 我认为你是对的,因为BIT6总是零。 我弄错了吗?

    // Timer0_A0中断服务例程
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector = TIMER0_A0_vector
    __interrupt void Timer0_A0_ISR (void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (TIMER0_A0_vector))) Timer0_A0_ISR (void)
    #否则
    错误编译器不受支持!
    #endif

    p1out ^= 0b0.1万;
    }

    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector = ADC12_vector
    __interrupt void ADC12_ISR(void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (ADC12_vector))) ADC12_ISR (void)
    #否则
    错误编译器不受支持!
    #endif

    Switch(__偶 数_in_range(ADC12IV, ADC12IV_ADC12RDYIFG))

    CASE ADC12IV_NONE:Break;// Vector 0:NO INTERRUPT
    CASE ADC12IV_ADC12OVIFG:中断;//矢量2:ADC12MEMx溢出
    CASE ADC12IV_ADC12TOVIFG:中断;//矢量4:转换时间溢出
    CASE ADC12IV_ADC12HIIFG:Break;// Vector 6:ADC12BHI
    CASE ADC12IV_ADC12LOIFG:中断;//矢量8:ADC12BLO
    CASE ADC12IV_ADC12INIFG:中断;//矢量10:ADC12BIN
    CASE ADC12IV_ADC12IFG0://矢量12:ADC12MEM0中断
    如果(ADC12MEM0 >= 0x6B4)// ADC12MEM = A1 > 0.5V?
    P1OUT |= BIT0;// WFP 1.0 = 1.
    否则
    P1OUT &=~BIT0;// WFP 1.0 = 0
    __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出活动CPU
    断开;//从0 (SR)清除CPUOFF位

    CASE ADC12IV_ADC12IFG1:Break;// Vector 14:ADC12MEM1
    CASE ADC12IV_ADC12IFG2:中断;//矢量16:ADC12MEM2
    CASE ADC12IV_ADC12IFG3:中断;//矢量18:ADC12MEM3
    CASE ADC12IV_ADC12IFG4:中断;//矢量20:ADC12MEM4
    CASE ADC12IV_ADC12IFG5:中断;//矢量22:ADC12MEM5
    CASE ADC12IV_ADC12IFG6:Break;// Vector 24:ADC12MEM6
    CASE ADC12IV_ADC12IFG7:中断;//矢量26:ADC12MEM7
    CASE ADC12IV_ADC12IFG8:中断;//矢量28:ADC12MEM8
    CASE ADC12IV_ADC12IFG9:中断;//矢量30:ADC12MEM9
    CASE ADC12IV_ADC12IFG10:中断;//矢量32:ADC12MEM10
    CASE ADC12IV_ADC12IFG11:中断;//矢量34:ADC12MEM11
    CASE ADC12IV_ADC12IFG12:中断;//矢量36:ADC12MEM12
    CASE ADC12IV_ADC12IFG13:Break;// Vector 38:ADC12MEM13
    CASE ADC12IV_ADC12IFG14:Break;// Vector 40:ADC12MEM14
    CASE ADC12IV_ADC12IFG15:Break;// Vector 42:ADC12MEM15
    CASE ADC12IV_ADC12IFG16:中断;//矢量44:ADC12MEM16
    CASE ADC12IV_ADC12IFG17:Break;// Vector 46:ADC12MEM17
    CASE ADC12IV_ADC12IFG18:中断;//矢量48:ADC12MEM18
    CASE ADC12IV_ADC12IFG19:中断;//矢量50:ADC12MEM19
    CASE ADC12IV_ADC12IFG20:中断;//矢量52:ADC12MEM20
    CASE ADC12IV_ADC12IFG21:中断;//矢量54:ADC12MEM21
    CASE ADC12IV_ADC12IFG22:中断;//矢量56:ADC12MEM22
    CASE ADC12IV_ADC12IFG23:Break;// Vector 58:ADC12MEM23
    Case ADC12IV_ADC12IFG24:Break;// Vector 60:ADC12MEM24
    CASE ADC12IV_ADC12IFG25:中断;//矢量62:ADC12MEM25
    CASE ADC12IV_ADC12IFG26:Break;// Vector 64:ADC12MEM26
    CASE ADC12IV_ADC12IFG27:Break;// Vector 66:ADC12MEM27
    CASE ADC12IV_ADC12IFG28:Break;// Vector 68:ADC12MEM28
    CASE ADC12IV_ADC12IFG29:Break;// Vector 70:ADC12MEM29
    CASE ADC12IV_ADC12IFG30:中断;//矢量72:ADC12MEM30
    CASE ADC12IV_ADC12IFG31:中断;//矢量74:ADC12MEM31
    CASE ADC12IV_ADC12RDYIFG:中断;//矢量76:ADC12RDY
    默认值:中断;
    }
    }  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于BIT6 != 1,因此条件始终为false。

    我的猜测是您正在失去LPM设置和ADC12中断之间的竞争:转换需要(16+14) MODOSC时钟,但这只有6个MCLK,因此它可能在LPM0之前完成。 尝试在设置ADC12SC的行之前添加"__disable_interrupts():"。