嵌入式系统: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。)
简单地说:如何在 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。)