嵌入式系统:MSP430g2553 IAR编程 ports/pins BASIC Input / Output syntax

Embedded system: MSP430g2553 IAR programming ports/pins BASIC Input / Output syntax

简单地说:如何在 IAR EW 中使用 MSP430g2553 正确定义和使用端口/引脚?

我会用例子来说明我不明白的地方。

我有一个具有 3 个状态的简单状态机。我想为输入编程 3 个引脚,为输出编程 2 个引脚。 然后,根据我管理状态的输入。

首先,这是定义输入/输出的正确方法吗?

 P1DIR |= BIT0 + BIT1; //pins 1.0 and 1.1 output
 P1DIR &= ~BIT2 + BIT3 + BIT4; // pins 1.2 , 1.3, 1.4 input

以上在我看来相当简单易用,但是,更大的问题是如何在代码中引用输入引脚?以及如何根据输入设置输出?

为了进一步解决我的问题,这是我的这个状态机的起始代码,我在我不明白如何编写语法的地方放入了伪代码。如果任何人都可以填写伪代码并进行一些评论,那将会很有帮助。我看了很多教程,但我似乎没有从他们那里得到这个简单的东西。

# include "msp430g2553.h"
# include "stdio.h"
# include "math.h"

#define START 1
#define LEFT_ON 2
#define RIGHT_ON 3

char STATE;

main ()
{

 P1DIR |= BIT0 + BIT1; //port 1.0 and 1.1 output
 P1DIR &= ~BIT2 + BIT3 + BIT4; // port 1.2 , 1.3, 1.4 input
 
 WDTCTL = WDTPW + WDTHOLD;
 STATE =START;
 
 
 while(1)
 {
  //STATE = START;
   
   
   switch (STATE)
   {
   case START:
     {
     // Starting state I want both outputs to be set 1, I dont know how
       set p1.0 to 1
       set p1.1 to 1
       puts("START");

     //check inputs to switch state

      if (1.2 == 1 & 1.3==0 & 1.4==0) {
        STATE = RIGHT_ON;
      } else if (1.2 == 0 & 1.3==0 & 1.4==1)) {
        STATE = LEFT_ON;
      }  
     
     break;
     }
     
   case LEFT_ON:
     {
       // Here I wish to to put 1.0 output to 1 and 1.1 output to 0
          p1.0 set to 1
          p1.1 set to 0
       // now check if 1.3 is 1
          if (1.3 == 1) { 
             STATE = START;
             }     
       break;
     }
             
   case RIGHT_ON:
     {
      // Here I wish to to put 1.0 output to 0 and 1.1 output to 1
          p1.0 set to 0
          p1.1 set to 1
       // now check if 1.3 is 1
          if (1.3 == 1) { 
             STATE = START;
             }     
       break;
      }
   }//end of Switch  
 }// end of while
 
 
}// end of main

First, is this correct way of defining inputs / outputs ?

我假设 P1DIR 是正确的数据方向寄存器(我不详细了解这个特定的 MCU),但除此之外:不,它不正确。首先,使用按位或 | 而不是加法。它们给出了相同的结果,但是 + 使代码看起来很奇怪并且有点难以阅读。一般的 C 编程书会告诉你做:

P1DIR |= BIT0 | BIT1;

请注意,P1DIR |= ... 将使所有当前设置为输出的引脚保持原样。这可能是也可能不是你想要的。

要将端口引脚设置为活动状态,然后只需执行相同的操作即可,SOME_PORT_REGISTER |= PIN_MASK;。同样,您可以使用按位异或的 ^= 切换单个引脚。或者使用 &= ~(mask).

将其设置为零

P1DIR &= ~BIT2 + BIT3 + BIT4; 是错误的,~ 是一元运算符,只适用于一个操作数。更正后的代码:

P1DIR &= ~(BIT2 | BIT3 | BIT4);

I've looked many tutorials

不幸的是,网络上的大多数教程都很糟糕。首先阅读一本体面的 C 编程书籍,然后再进行其他操作。一旦你学习了 C 的基础知识,你就可以去寻找教程。

比如我写的这篇关于寄存器访问的文章,假设reader已经知道C:How to access a hardware register from firmware?

至于完整的初学者教程,我认为这个质量比大多数教程都好:Embedded Software in C for an ARM Cortex M, Jonathan W. Valvano and Ramesh Yerraballi。 (是Cortex M,不是MSP430,但是不管是什么MCU,原理都非常相似,同一个作者还有一个比较老的教程,用的是NXP HSC12的例子,又是16苦,更像MSP430。)