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.

[参考译文] MSP430FR2111:GPIO 输入状态

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/952624/msp430fr2111-gpio-input-state

器件型号:MSP430FR2111

您好!

我正在研究一个简单的空气磁芯线圈和一个磁钟摆项目。 一个水平效应传感器检测进入的磁体、MSP430根据需要提供一个小脉冲并将钟摆推出。

线圈的一端直接连接到其中一个 GPIO、而线圈的另一端连接到 GND。 线圈使用非常细的磁性导线、电流较低、因此不需要晶体管。 当电路处于深度睡眠状态时、它等待磁体并且线圈 GPIO 为低电平。 问题是当我使用重磁体时、法拉第效应会使钟摆变慢并最终停止。 例如、如果我只取线圈、将其从电路中取出并将其两端连接在一起、它仍然会减慢钟摆的速度、因为感应电压会流经线圈并与钟摆进行对抗。 将其完全断开线圈和磁体两端的唯一方法可以自由飞行、感应电压不会移动到任何位置。

简而言之、我的问题是、我应该为线圈的一端选择什么 GPIO 配置、以便不提供 GND? 高阻抗输入? MSP430中是否有 GPIO 配置、以便引脚将充当完全断开状态、既不是 GND、也不是 VCC、甚至不是悬空状态等。 我真的希望 GPIO 与电路完全断开连接? 与使用继电器物理断开类似、根本没有连接的情况下、是否也可以这样做? 当然、我不能使用继电器、MOSFET 等、因为这是低电流应用、因为每个微安都在计数。 我想使用一个低电流负载开关、但如果某些 GPIO 状态能够处理它、这可能是一种过度使用。

谢谢!

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

    引脚现在处于什么模式?

    如果不完全理解您的描述、我的第一个猜测是您看到施密特触发器的影响。 如果您使用其中一个模拟输入(P1上的任何引脚)并为该引脚设置 P1SEL=11b、则会关闭施密特触发器。 [参考数据表(SLASE78C)表6-34和用户指南(SLAU445I)第21.2.1]节

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

    您无法完全断开引脚连接。 您最接近的方法是将其作为输入、但仍有 ESD 二极管将引脚钳制到 Vcc 和 GND。

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

    非常感谢 Bruce!

    下面是我的测试代码。 基本而言、我在 P1.0睡眠时将其方向更改为输入、并希望它完全断开。 中断时、我再次将方向更改为输出并发送脉冲。 很抱歉、您能不能再详细介绍如何为 P1.0设置 P1SEL=11b?

    再次感谢!!!

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

    您好、Jay、

    下面介绍了如何选择 P1.0作为 第三模块功能:

    //为 P1.0 P1SEL0选择 P1SELx = 11b
    
    |= BIT0;
    P1SEL1 |= BIT1; 

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

    非常感谢 Aaron!

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

    感谢 David 的确认。

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

    直接的方法是:

    P1SEL0 |= BIT0;
    P1SEL1 |= BIT0;// P1SEL.0 = 11b 

    更复杂的方法:假设您知道这两个位是00b、则可以使用:

    P1SELC = BIT0;// P1SEL.0:00B->11b
    

    [参考用户指南(SLAU445I)第7.2.5节]。 这是一个位反转(XOR)操作、因此您也可以从11b->00b 对其进行设置。 目的是一步完成,避免将 PSEL 值从00->01->11更改。

    [编辑:固定格式]