LED 和开关程序故障 Tiva C 板
led and switchs program failure Tiva C board
我正在尝试 运行 TIVA C 板上的此代码。 sw2
连接到 PF0
,sw1
连接到 PF4
,RGB LED 连接到 PF1
、PF2
和 PF3
。
当我按下 sw2
时,它会变成蓝色,如果按下 sw1
,它会变成绿色,否则它会变成红色。
代码无法正常运行。希望大家指出我哪里做错了
/*************************
PORT F Addresses
*************************/
#define RCGCGPIO (*((volatile unsigned long*)0x400FE608)) //CLOCK
#define PORTFDATA (*((volatile unsigned long*)0x400253FC)) //DATA
#define PORTFDIR (*((volatile unsigned long*)0x40025400)) //DIRECTION
#define PORTFDEN (*((volatile unsigned long*)0x4002551C)) //ENABLE
#define PORTFLOCK (*((volatile unsigned long*)0x40025520)) //LOCK (lock or unlocks PF0)
#define PORTFCR (*((volatile unsigned long*)0x40025524)) //COMMIT (uncommit PF0)
#define PORTFPUR (*((volatile unsigned long*)0x40025510)) // PULL UP resistor
#define PORTFPDR (*((volatile unsigned long*)0x40025514)) // PULL Down resistor
/*************************/
int sw1;
int sw2;
int delay;
int main (void)
{
RCGCGPIO = 0x20; //Enable clock for PORT F
delay = RCGCGPIO;
PORTFLOCK = 0x4C4F434B; // unlock commit reg
PORTFCR = 0x01; // unlock PF0
PORTFDEN = 0x1F; //Enable pins 0 to 4
PORTFDIR = 0x0E; // pins 0 and 4 input - pins 1,2,3 output
PORTFPUR = 0x11;
while (1)
{
sw2 = PORTFDATA & 0x00000001;
sw1 = PORTFDATA & 0x00000010;
if (sw1 == 1)
PORTFDATA |= 0x00000002;
else if (sw2 == 1)
PORTFDATA |= 0x00000004;
else
PORTFDATA |= 0x00000008;
}
}
您是否尝试过 CCS 附带的示例代码以确保硬件正常运行?
示例代码使用TI库而不是普通的寄存器读写,但是您可以通过go to defination
挖掘出实际的寄存器。不管怎样,我有点好奇你为什么首先使用普通寄存器而不是 TI 库? ARM单片机已经不是8051了
您的代码有两个明显的问题。可能还有更多...
您设置了 sw1 = PORTFDATA & 0x00000010
,因此 sw1
唯一可能的值是 0x10 或 0x00。然后你测试if (sw1 == 1)
。但是这个测试永远不会成立,因为 sw1
永远不会等于 1.
您使用 |=
运算符设置 PORTFDATA
的位。但是你从来没有清除过 PORTFDATA
的位。因此,您的 LED 可能会亮起,但永远不会熄灭。
请记住以下几点:
启动板按钮是负逻辑,所以如果你的 switch1== 0x01,它没有被按下。
试试这样的东西:
If
sw1 == 0x01 //switch not pressed
PORTFDATA &= ~(0x0E); //ledz off
else
PORTFDATA ^= 0x02; //toggle red
我也是学习ARM&C纯自学,深感你的痛苦。用按位运算符切换单个 LED 花了好几个小时,才弄明白发生了什么。坚持下去!!!
/e
我正在尝试 运行 TIVA C 板上的此代码。 sw2
连接到 PF0
,sw1
连接到 PF4
,RGB LED 连接到 PF1
、PF2
和 PF3
。
当我按下 sw2
时,它会变成蓝色,如果按下 sw1
,它会变成绿色,否则它会变成红色。
代码无法正常运行。希望大家指出我哪里做错了
/*************************
PORT F Addresses
*************************/
#define RCGCGPIO (*((volatile unsigned long*)0x400FE608)) //CLOCK
#define PORTFDATA (*((volatile unsigned long*)0x400253FC)) //DATA
#define PORTFDIR (*((volatile unsigned long*)0x40025400)) //DIRECTION
#define PORTFDEN (*((volatile unsigned long*)0x4002551C)) //ENABLE
#define PORTFLOCK (*((volatile unsigned long*)0x40025520)) //LOCK (lock or unlocks PF0)
#define PORTFCR (*((volatile unsigned long*)0x40025524)) //COMMIT (uncommit PF0)
#define PORTFPUR (*((volatile unsigned long*)0x40025510)) // PULL UP resistor
#define PORTFPDR (*((volatile unsigned long*)0x40025514)) // PULL Down resistor
/*************************/
int sw1;
int sw2;
int delay;
int main (void)
{
RCGCGPIO = 0x20; //Enable clock for PORT F
delay = RCGCGPIO;
PORTFLOCK = 0x4C4F434B; // unlock commit reg
PORTFCR = 0x01; // unlock PF0
PORTFDEN = 0x1F; //Enable pins 0 to 4
PORTFDIR = 0x0E; // pins 0 and 4 input - pins 1,2,3 output
PORTFPUR = 0x11;
while (1)
{
sw2 = PORTFDATA & 0x00000001;
sw1 = PORTFDATA & 0x00000010;
if (sw1 == 1)
PORTFDATA |= 0x00000002;
else if (sw2 == 1)
PORTFDATA |= 0x00000004;
else
PORTFDATA |= 0x00000008;
}
}
您是否尝试过 CCS 附带的示例代码以确保硬件正常运行?
示例代码使用TI库而不是普通的寄存器读写,但是您可以通过go to defination
挖掘出实际的寄存器。不管怎样,我有点好奇你为什么首先使用普通寄存器而不是 TI 库? ARM单片机已经不是8051了
您的代码有两个明显的问题。可能还有更多...
您设置了 sw1 = PORTFDATA & 0x00000010
,因此 sw1
唯一可能的值是 0x10 或 0x00。然后你测试if (sw1 == 1)
。但是这个测试永远不会成立,因为 sw1
永远不会等于 1.
您使用 |=
运算符设置 PORTFDATA
的位。但是你从来没有清除过 PORTFDATA
的位。因此,您的 LED 可能会亮起,但永远不会熄灭。
请记住以下几点: 启动板按钮是负逻辑,所以如果你的 switch1== 0x01,它没有被按下。
试试这样的东西:
If
sw1 == 0x01 //switch not pressed
PORTFDATA &= ~(0x0E); //ledz off
else
PORTFDATA ^= 0x02; //toggle red
我也是学习ARM&C纯自学,深感你的痛苦。用按位运算符切换单个 LED 花了好几个小时,才弄明白发生了什么。坚持下去!!!
/e