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.

[参考译文] MSP430FR5994:虽然 GPIO 上施加了一个值、但在 GPIO#39;s 引脚上没有读数

Guru**** 2577385 points
Other Parts Discussed in Thread: MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/949470/msp430fr5994-no-reading-on-the-gpio-s-pin-although-a-value-applied-to-the-gpio

器件型号:MSP430FR5994

这似乎是一个简单的问题,但我不能弄清楚这一点。

我使用以下代码将 GIP 端口2和 pin5设为高电平:

 GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN5);


                 GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN5);


但是、当我通过 Osciloscope 读取该引脚时、它显示为零。 我不知道这背后的原因是什么。 我还为 LED 分配了不同的值、它起作用了。 但是、我无法为 GPIO 分配任何值。

下面是我的完整代码:

#include
#include
#include      /* printf */
#include       /* clock_t、clock、clocks_per_sec */
#include       /* sqrt */

//#include
unsigned int adc_value=0、adc_value2=0;
volatile unsigned int ADCvar;

int main (空)


GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
 GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN1);
 GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN5);


   //禁用看门狗
   WDTCTL = WDTPW | WDTHOLD;
   //启用对端口寄存器的更改
   PM5CTL0 &=~LOCKLPM5;

   P1SEL1 |= BIT3;    //为 ADC 配置 P1.3
   P1SEL0 |= BIT3;

   P1SEL1 |= BIT4;                          //为 ADC 配置 P1.4
   P1SEL0 |= BIT4;


   //配置 ADC12
       ADC12CTL0 = ADC12ON | ADC12SHT0_2;     //打开 ADC12、设置采样时间
       ADC12CTL1 = ADC12SHP;                  //使用采样计时器
       ADC12MCTL0 = ADC12VRSEL_4;             // VR+= VeREF+(外部)和 VR-=AVss
       ADC12CTL0 |= ADC12ENC;                 //启用转换

       while (1)
       {
           ADC12CTL0 |= ADC12SC;              //开始转换软件触发
          // while (!(ADC12IFGR0 & BIT3);
           ADCvar = ADC12MEM0;                //读取转换结果


           // GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);
          // if (ADCvar<4500){
                 GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN5);
                 GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0);
                 GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN1);
                          /* for (i=100000;i>0; i--);
                       for (i=100000;i>0; i--);*/
               // __no_operation();                  //在此处设置断点
      //}
       }



感谢您的任何帮助。

此致、

Abolfazl

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

    我可能缺少一些东西、但如果您将输出设置为低电平、为什么您希望在引脚上看到任何电压、因为低输出= 0V?

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

    您好!

    感谢您的回答。

    实际上、这是最后一个代码。 但是、在我的代码中、我将其设为高电平。 这是更新后的版本。 我在 GPIO 引脚上仍然看不到任何东西

    #include
    #include
    #include      /* printf */
    #include       /* clock_t、clock、clocks_per_sec */
    #include       /* sqrt */

    //#include
    unsigned int adc_value=0、adc_value2=0;
    volatile unsigned int ADCvar;
    unsigned int
    PP=0;

    int main (空)


    GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
     GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN1);
     GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN5);


       //禁用看门狗
       WDTCTL = WDTPW | WDTHOLD;
       //启用对端口寄存器的更改
       PM5CTL0 &=~LOCKLPM5;

       P1SEL1 |= BIT3;    //为 ADC 配置 P1.3
       P1SEL0 |= BIT3;

       P1SEL1 |= BIT4;                          //为 ADC 配置 P1.4
       P1SEL0 |= BIT4;


       //配置 ADC12
           ADC12CTL0 = ADC12ON | ADC12SHT0_2;     //打开 ADC12、设置采样时间
           ADC12CTL1 = ADC12SHP;                  //使用采样计时器
           ADC12MCTL0 = ADC12VRSEL_4;             // VR+= VeREF+(外部)和 VR-=AVss
           ADC12CTL0 |= ADC12ENC;                 //启用转换

           while (1)
           {
               ADC12CTL0 |= ADC12SC;              //开始转换软件触发
            // while (!(ADC12IFGR0 & BIT3);
               ADCvar = ADC12MEM0;                //读取转换结果


               // GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);
               while (ADCvar<4500){
                   GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN5);
                 // P4OUT |= BIT3;//将 P1.0设置为高电平
                   //P1OUT |= BIT0;//将 P1.0设置为高电平
                  // P1OUT |= BIT1;//将 P1.0设置为高电平

                     GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);
                    GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN1);
                   // __no_operation();                  //在此处设置断点
                    PP=pp+1;
          }
           }



    //
    //int testench (void)

     /*  //配置 ADC12
       //打开 ADC 并启用多个转换
       ADC12CTL0 = ADC12SHT0_2 | ADC12ON | ADC12MSC;
       //采样计时器,单序列
       ADC12CTL1 |= ADC12SHP | ADC12CONSEQ_1;
       // 12位转换
       ADC12CTL2 |= ADC12RES_2;
       //在 MEM1上启用 ADC 中断
       ADC12IER0 |= ADC12IE1;
       // A3选择、Vref=1.2V
       ADC12MCTL0 |= ADC12INCH_3 | ADC12VRSEL_1;
       // A4选择、Vref=1.2V、序列结束
       ADC12MCTL1 |= ADC12INCH_4 | ADC12VRSEL_1 | ADC12EOS;


       while (1){

           ADC12CTL0 |= ADC12ENC | ADC12SC;    //采样和转换启动
           _bis_SR_register (LPM0_bits + GIE);     // LPM0、ADC12_ISR 将强制退出
           __no_operation();//仅用于调试




    // www.ti.com/.../slac536中调整的 ADC 矢量函数

    //使用 MSP430FR59xx_ADC12_01.c

    //作者:T. Witt/P. Thanigai、Texas Instruments Inc.、2013年11月

    /*#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)

    #pragma vector = ADC12_vector
    _interrupt void ADC12_ISR (void)
    #Elif defined (_GNU_)
    void__attribute__((中断(ADC12_vector))) ADC12_ISR (void)
    其他
    错误编译器不受支持!
    #endif

       switch (__evo_in_range (ADC12IV、ADC12IV_ADC12RDYIFG))
       {
       ADC12IV_ADC12IFG1案例:                // ADC12MEM1中断
           ADC_Value = ADC12MEM0;             //保存 MEM0
           ADC_Value2 = ADC12MEM1;            //保存 MEM1
           _BIC_SR_REGISTER_ON_EXIT (LPM0_Bits | GIE);             //退出 CPU、清除中断
       中断;
       默认值:break;
       }

    *

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

    您是否曾尝试单步执行以确保 ADCVar < 4500?

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

    是的、我是这样做的。

    实际上、以下命令运行得非常好、因为我可以看到电路板上的 LED 已关闭。 因此、条件始终为真。

                    GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);
                    GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN1);

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

    这看起来与这里的报告相似:

    https://e2e.ti.com/support/tools/ccs/f/81/p/945082/3501929

    您使用的是哪个 CCS 版本?

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

    CCS 版本为 CCS10.1。

    这对我来说太奇怪了,因为它适用于 P1.1和 P1.0。

    谢谢

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

    如何解决?

    使用旧版本?

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

    实际上、我可以借助您提供的链接来解决这个问题。

    更新版本中未定义端口2、3、4、5、6、7、8、9、10、11和12。

    解决方案是将这些端口添加到"msp430fr5994.h"

    以下是上述标头中端口2的定义:

    #define __MSP430_HAS_PORT2_R__/*               用于显示端口可用的定义*/
    #define __MSP430_BASEADDRESS_PORT2_R__ 0x200
    #define P2_BASE               __MSP430_BASEADDRESS_PORT2_R__

    下面是添加到标头的代码。 我根据需要添加了端口2和端口4。 您可以添加更多内容。

    #define __MSP430_HAS_PORT2_R__/*               用于显示端口可用的定义*/
    #define __MSP430_BASEADDRESS_PORT2_R__ 0x200
    #define P2_BASE               __MSP430_BASEADDRESS_PORT2_R__
    #define __MSP430_HAS_PORT2_R__/*               用于显示端口可用的定义*/
    #define __MSP430_BASEADDRESS_PORT3_R__ 0x200
    #define P3_base               __MSP430_BASEADDRESS_PORT3_R__

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

    你已经领先我了。 感谢您发布解决方案。