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.

[参考译文] MSP430F5529:P1OUT、P5DIR、P5DS、P3SEL

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1433648/msp430f5529-p1out-p5dir-p5ds-p3sel

器件型号:MSP430F5529
主题中讨论的其他器件:MSP430FR2311

工具与软件:

我在哪里可以找到这些 CCS 命令、宏或它们所调用的任何内容的文档。  

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

    在本指南的数字 I/O 部分:slau208中进行了讨论。

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

    它们只是 MCU 中相应寄存器的别名。

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

    我查看了文档、发现端口的工作方式似乎与其他微控制器相同。

    那么、为什么我的位始终反相?

    例如:

    #define BIT_SET (A、B) A |= B  //应将位设置为1或输出3.3伏

    #define BIT_CLR (A、B) A &=~B //应输出0伏或零伏。

    但它们的工作方式是相反的吗?

    BIT_SET (P1OUT、BIT0);设置为低电平

    BIT_CLR (P1OUT、BIT0);设置为高电平

    使用中没有中断或其他内部外设。

    端口初始化如下:

    int main(void)
    {
        int i,j,x,y,x0,y0,x1,y1;
    
        WDTCTL = WDTPW | WDTHOLD; // Stop wdt
    
        P1SEL = 0x0;
        P2SEL = 0x0;
        P4SEL = 0x0;
        P1DIR = 0xFF;
        P2DIR = 0x0;
        P4DIR = 0xFC;
        P5DIR = 0xFF;
        P6DIR = 0xFF;
        P7DIR = 0xFF;
        P8DIR = 0xFF;

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

    初始化中缺少的是 LOCKLPM5。

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

    LOCKLPM5;="第25行:警告#176-D:表达式没有影响"

    此命令是什么以及在哪里可以找到有关它的更多信息。 我浏览了1000多页的 pdf、但没有具体看到。 它看起来与节能有关。 该产品由交流线路供电、我可以较少关注功耗。 所有这些东西都可以被关闭吗?

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

    LOCKLPM5是寄存器中的一个位。

    在复位期间、某些器件在一定程度上设置了相应的值、而其他器件在不设置时、存在一些差异。 设置后将锁定端口配置。

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

    好的、但为什么要修改我的端口以忽略标准微处理器操作模式? 如果我查看"Simple Blink the LED"程序或 CCS Project Manager 生成的 main.c 模板、我看不到相关的任何信息?

    我的端口是可切换的、只是不遵循标准逻辑、其中一个为高电平、零电平为低电平。

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

    也许您发布了完整代码示例、而不仅仅是位和片段。

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

    #define bit_tst(A,B) (A & B)
    #define bit_set(A,B) A |= B
    #define bit_clr(A,B) A &= ~B
    #define bit_tog(A,B) A ^= B
    
    #include <msp430.h>
    #include <stdint.h>
    #include <stdlib.h>
    
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD; // Stop wdt
    
        P1SEL = 0x0;
        P2SEL = 0x0;
        P4SEL = 0x0;
        P1DIR = 0xFF;
        P2DIR = 0x0;
        P4DIR = 0xFC;
        P5DIR = 0xFF;
        P6DIR = 0xFF;
        P7DIR = 0xFF;
        P8DIR = 0xFF;
    
        while(1)
        {
        bit_clr(P1OUT,BIT2);
        __delay_cycles(100);
        bit_set(P1OUT,BIT2);
        __delay_cycles(1000);
        }
    }

    这里、它被削减至这个问题的基本要素。 这个代码应该生成一个低电平100ms 和高电平1000ms 的脉冲序列、但是它生成相反的100us 高电平和1000ss 低电平。  

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

    您如何确定高电平和低电平? 如果通过 LED 将阳极连接到3.3V、它将在 GPIO 为0时亮起、在高电平时熄灭。

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

    具有 Tektronix 实验室级示波器! 没有一些 USB 连接的玩具。 我拥有35年的电子工程技术经验、因此我对电子行业有很好的了解。

     方向。  我怀疑代码优化会再次干扰标准 C 语言的操作。  

    我想关闭所有这种优化、并按照我认为合适的方式将其添加。

    这是一款具有8条数据线和5条控制线路的 LCD 彩色屏幕控制器实现方案。 因此、如果处理器或编译器未正确分配级别状态、您可以理解问题的严重性。  

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

    当然,我们不知道你的经验水平是什么。

    在 MSP430FR2311上使用此代码:

    #define bit_tst(A,B) (A & B)
    #define bit_set(A,B) A |= B
    #define bit_clr(A,B) A &= ~B
    #define bit_tog(A,B) A ^= B
    
    #include <msp430.h>
    #include <stdio.h>
    
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;               // Stop watchdog timer
    
        //P1SEL = 0x0;
        P1OUT &= ~BIT0;                         // Clear P1.0 output latch for a defined power-on state
        P1DIR = 0xFF;                          // Set P1.0 to output direction
    
        PM5CTL0 &= ~LOCKLPM5;                   // Disable the GPIO power-on default high-impedance mode
                                                // to activate previously configured port settings
    
    
        while(1)
        {
            P1OUT &= ~BIT0;
            __delay_cycles(100);
    
            P1OUT |= BIT0;
            __delay_cycles(1000);
    
    
        }
    }

    我得到:

    使用宏:

    #define bit_tst(A,B) (A & B)
    #define bit_set(A,B) A |= B
    #define bit_clr(A,B) A &= ~B
    #define bit_tog(A,B) A ^= B
    
    #include <msp430.h>
    #include <stdio.h>
    
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;               // Stop watchdog timer
    
        //P1SEL = 0x0;
        P1OUT &= ~BIT0;                         // Clear P1.0 output latch for a defined power-on state
        P1DIR = 0xFF;                          // Set P1.0 to output direction
    
        PM5CTL0 &= ~LOCKLPM5;                   // Disable the GPIO power-on default high-impedance mode
                                                // to activate previously configured port settings
    
    
        while(1)
        {
            bit_clr(P1OUT,BIT0);
            __delay_cycles(100);
    
            bit_set(P1OUT, BIT0);
            __delay_cycles(1000);
    
    
        }
    }
    

    我得到:

    也就是说、它对我来说是有效的。

    P1OUT 等对象可能不是指针-它们本身可能是宏-因此您可能希望保护宏中的表达式:

    #define 位集(A、B)(A)|=(B)

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

    在 GCC 中、至少所有特殊函数寄存器都是#defines。


    #define P1OUT                 (PAOUT_L)     /*端口1输出*/

    SFR_b (PAOUT_L);                              /*端口 A 输出*/

    #define SFR_b (x) extern volatile unsigned char x

    (实际上是在链接时通过链接器脚本处理地址。)

    也就是说,GCC 非常满意,并输出预期的 BIC 和 bis 指令。

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

    我曾尝试修改过我的代码、但使用了 BIT2、这样做会产生一个恒定的高电平。

    现在有另一个.c 文件以及几个。 h 文件作为工程的一部分、这些文件是实际的 LCD 控制器驱动程序。 位检查这些文件没有任何直接访问端口的内容。 您可以在我的代码中看到、目前没有对这些文件中的任何内容进行调用。

    ICCAVRv8。 Archimedes 对于老8051、MPLAB、这个额外代码只是内存浪费、根据我认为的正常 C 标准、额外代码不执行任何操作、除非访问了特别调用的函数。

    另外、 我使用的是官方 TI LaunchPad 开发板(不是一些离岸拷贝)、而且引脚直接来自芯片

    这是怎么回事?

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

    最新动态:

    我构建了一个新项目,排除这些额外的文件,并发生同样的事情,我得到一个恒定的高.

    /**
     * main.c
     */
    
    #define bit_tst(A,B) (A & B)
    #define bit_set(A,B) A |= B
    #define bit_clr(A,B) A &= ~B
    #define bit_tog(A,B) A ^= B
    
    #include <msp430.h>
    #include <stdint.h>
    #include <stdlib.h>
    
    
    /************************************************************************************************************************************************/
    /* Main entry point                                                                                                                             */
    /************************************************************************************************************************************************/
    int main(void)
    {
    
        WDTCTL = WDTPW | WDTHOLD; // Stop wdt
    /*
        P1SEL = 0x0;
        P2SEL = 0x0;
        P4SEL = 0x0;
        P1DIR = 0xFF;
        P2DIR = 0x0;
        P4DIR = 0xFC;
    //    P5DIR = 0xFF;
        P6DIR = 0xFF;
    //    P7DIR = 0xFF;
    //    P8DIR = 0xFF;
    */
    
        P1OUT &= ~BIT2;
        P1DIR = 0xFF;
    
        PM5CTL0 &= ~LOCKLPM5;
    
        while(1)
        {
    
            bit_clr(P1OUT,BIT2);
            __delay_cycles(100);
            bit_set(P1OUT,BIT2);
            __delay_cycles(1000);
        }
    	
    //	return 0;
    }

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

    我建议要么保护宏参数、要么不使用宏进行尝试。

    您还可以从 Resource Explorer 获取基本的闪烁信息、并确保它起作用、尽管这可能会使用切换开关。

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

    尝试过这个,我也相信括号,有人把它称为旧学校,但我不同意。

    #define bit_tst(A,B) (A & B)
    #define bit_set(A,B) (A |= B)
    #define bit_clr(A,B) (A &= ~(B))
    #define bit_tog(A,B) (A ^= B)

    不工作。

    这应该会将 P2的 BIT7拉高并保持在那里。 但 BIT7保持在零吗?

    /**
     * main.c
     */
    
    #define bit_tst(A,B) (A & B)
    #define bit_set(A,B) (A |= B)
    #define bit_clr(A,B) (A &= ~(B))
    #define bit_tog(A,B) (A ^= B)
    
    #include <msp430.h>
    #include <stdint.h>
    #include <stdlib.h>
    
    
    /************************************************************************************************************************************************/
    /* Main entry point                                                                                                                             */
    /************************************************************************************************************************************************/
    int main(void)
    {
    
        WDTCTL = WDTPW | WDTHOLD; // Stop wdt
    /*
        P1SEL = 0x0;
        P2SEL = 0x0;
        P4SEL = 0x0;
        P1DIR = 0xFF;
        P2DIR = 0x0;
        P4DIR = 0xFC;
    //    P5DIR = 0xFF;
        P6DIR = 0xFF;
    //    P7DIR = 0xFF;
    //    P8DIR = 0xFF;
    */
        P2SEL = 0x0;
        P2DIR = 0xFF;
        P2OUT |= BIT7;
    
    
        PM5CTL0 &= ~LOCKLPM5;
    
        while(1)
        {
    /*
    //        bit_clr(P1OUT,BIT2);
            P2OUT |= 128;
            __delay_cycles(100);
    //        bit_set(P1OUT,BIT2);
            P2OUT &= ~(128);
            __delay_cycles(1000);
    */
        }
    	
    //	return 0;
    }
    

    我必须有损坏的芯片?

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

    我的意思是这样保护参数:

    #define BIT_TST (A、B)((A)和(B))

    以防止优先级问题。

    https://c-faq.com/cpp/safemacros.html

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

    现在以这种非常基本的形式工作。 请注意、我注释掉了 PM5CTL0并且=~μ H LOCKLPM5??

    /**
     * main.c
     */
    #define bit_tst(A,B) (A & B)
    #define bit_set(A,B) (A |= B)
    #define bit_clr(A,B) (A &= ~(B))
    #define bit_tog(A,B) (A ^= B)
    
    #include <msp430.h>
    
    /************************************************************************************************************************************************/
    /* Main entry point                                                                                                                             */
    /************************************************************************************************************************************************/
    int main(void)
    {
    
        WDTCTL = WDTPW | WDTHOLD; // Stop wdt
    
        P1SEL = 0x0;
        P1DIR = 0xFF;
        P1OUT |= BIT2;
    
    
      //  PM5CTL0 &= ~LOCKLPM5;
    
    while(1)
        {
        bit_clr(P1OUT,BIT2);
        __delay_cycles(100);
        bit_set(P1OUT,BIT2);
        __delay_cycles(1000);
        }
    	
    }

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

    请注意、我在此移至 P2.7、尝试不同的物理端口。

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

    5529的 TI 示例也不使用 PM5CTL0并且=~μ H LOCKLPM5。

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

    好的、在经过更多小时的测试后、一切都归结为:MSP430或 CCS 并不喜欢这些位设置和清除宏。 如果我动态进行位操作、它会按预期工作。 令人失望、但也不是什么大问题

    感谢大家的帮助和建议。

    第页 我使用的是 CCS 版本12。