天嵌 ARM开发社区

 找回密码
 注册
查看: 4895|回复: 20

恳求指教!TQ2440的按键控制LED的裸机程序问题

[复制链接]
mobilefzb 发表于 2010-10-18 23:17:50 | 显示全部楼层 |阅读模式
我通过资料确定TQ2440的按键和LED的GPIO如下:
led灯接口:
nLED1——GPB5
nLED2——GPB6
nLED3——GPB7
nLED4——GPB8
GPBCON——0x60000010
GPBDAT——0x56000014
GPBUP——0x56000018
按键接口
K1——GPF1
K2——GPF4
K3——GPF2
K4——GPF0
GPFCON——0x56000050
GPFDAT——0x56000054
GPFUP——0x56000058

请大家看看我的程序是否有错
ctr0.S文件
.text
.global _start
_start:
        ldr        r0,=0x53000000
        mov        r1,#0x0
        str        r1,[r0]
        ldr        sp,=1024 * 4
        bl        main
halt_loop:
        b        halt_loop
led_on.c文件
#include <stdio.h>

#define        GPBCON        (*(volatile unsigned long *)0x56000010)
#define        GPBDAT        (*(volatile unsigned long *)0x56000014)

#define        GPFCON        (*(volatile unsigned long *)0x56000050)
#define        GPFDAT        (*(volatile unsigned long *)0x56000054)

#define        GPB5_out (1 << 5)
#define        GPB6_out (1 << 6)
#define        GPB7_out (1 << 7)
#define        GPB8_out (1 << 8)

#define        GPF0_in         (1 << 0)
#define        GPF1_in         (1 << 1)
#define        GPF2_in         (1 << 2)
#define        GPF4_in         (1 << 4)

int main()
{
        unsigned long key_data = 0xffffffff;

        GPBCON = 0xfffd57ff;
        GPFCON = 0x00000000;

        GPBDAT = 0x00000000;

        while(1)
        {
                key_data = GPFDAT;

                if(key_data & GPF0_in)
                {
                        GPBDAT &= ~GPB5_out;
                }
                else
                {
                        GPBDAT |= GPB5_out;
                }
                if(key_data & GPF1_in)
                {
                        GPBDAT &= ~GPB6_out;
                }
                else
                {
                        GPBDAT |= GPB6_out;
                }
                if(key_data & GPF2_in)
                {
                        GPBDAT &= ~GPB7_out;
                }
                else
                {
                        GPBDAT |= GPB7_out;
                }
                if(key_data & GPF4_in)
                {
                        GPBDAT &= ~GPB8_out;
                }
                else
                {
                        GPBDAT |= GPB8_out;
                }
                //GPBDAT = led_data;
                //GPFDAT = 0xffffffff;
        }
        return 0;
}
按键没反应,不能控制LED灯,恳求指教!!
 楼主| mobilefzb 发表于 2010-10-18 23:50:17 | 显示全部楼层
资料上的按键电路图标注的是EINT0 EINT1 EINT2 EINT4我对照着核心电路板的电路确定了是GPIO F的接口。不知道这4个标号是不是指向这个接口啊?
附件是资料的截图.
恳求指教!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
天嵌_support1 发表于 2010-10-19 11:54:03 | 显示全部楼层
2# mobilefzb

嗯,对的。
这个你对照一下它们的网络名称就行了
 楼主| mobilefzb 发表于 2010-10-19 12:11:39 | 显示全部楼层
感谢!!我做了如下设置,但是按键无法反应。
采用轮询的方法,设置GPIO F的端口为输入 所以 GPFCON = 0x00000000
那么根据电路,任意按下一个按键,对应管脚会被拉低为低电平。所以我检测对应管脚是不是为0就可以了吧:)
我确定的按键对应的位如下:
K1——GPF1
K2——GPF4
K3——GPF2
K4——GPF0
请看看对不对?
我检测按键是否按下的代码如下例子:
key_data = GPFDAT;
if(key_data & (1 << 2))//检测K3是否按下,如果按下则执行if里面的语句
{
}
else
{
}
请看看这个代码是否有错?感谢!!
鬼鬼一哈 发表于 2010-10-19 13:19:16 | 显示全部楼层
代码贴上来,大家帮你看看。。。
天嵌_support1 发表于 2010-10-19 15:39:25 | 显示全部楼层
4# mobilefzb


思路是对了
 楼主| mobilefzb 发表于 2010-10-19 19:42:18 | 显示全部楼层
代码贴上来,大家帮你看看。。。
鬼鬼一哈 发表于 2010-10-19 13:19

代码在开头,还请看看:)感谢!!
 楼主| mobilefzb 发表于 2010-10-19 20:10:04 | 显示全部楼层
我又修改了下代码,这次是只要检测到GPFDAT不等于0xffffffff就点亮所有的灯,否则关闭。但是按键依然无反应。我无办法了,恳求解答!!感谢!!
#define        GPBCON        (*(volatile unsigned long *)0x56000010)
#define        GPBDAT        (*(volatile unsigned long *)0x56000014)

#define        GPFCON        (*(volatile unsigned long *)0x56000050)
#define        GPFDAT        (*(volatile unsigned long *)0x56000054)

#define        GPB5_out (1 << 5)
#define        GPB6_out (1 << 6)
#define        GPB7_out (1 << 7)
#define        GPB8_out (1 << 8)

#define        GPF0_in         (1 << 0)
#define        GPF1_in         (1 << 1)
#define        GPF2_in         (1 << 2)
#define        GPF4_in         (1 << 4)

#define        GPF0        ~(3 << (0 * 2))
#define        GPF1        ~(3 << (1 * 2))
#define        GPF2        ~(3 << (2 * 2))
#define        GPF3        ~(3 << (3 * 2))
#define        GPF4        ~(3 << (4 * 2))

int main()
{
        unsigned long key_data = 0xffffffff;

        GPBCON = 0xfffd57ff;
        GPFCON = GPF0 & GPF1 & GPF2 & GPF4;

        GPBDAT = 0xffffffff;//light is off

        while(1)
        {
                key_data = GPFDAT;
                if(0xffffffff != key_data)
                {
                        GPBDAT = 0x00000000;
                }
                else
                {
                        GPBDAT = 0xffffffff;
                }
         }
        return 0;
}
 楼主| mobilefzb 发表于 2010-10-19 22:31:51 | 显示全部楼层
本帖最后由 mobilefzb 于 2010-10-19 22:34 编辑

LED电路无问题,我怕按键电路出问题了…………:'(
我使用万用表量了下按键两边的电压,发现按键按下能够使电压降低,但是这个信号似乎没有进入cpu。我现在也之后这样想了…………求帮助!!
 楼主| mobilefzb 发表于 2010-10-19 23:27:43 | 显示全部楼层
本帖最后由 mobilefzb 于 2010-10-19 23:29 编辑

我也量了核心板的42脚(K1的管脚),发现没有问题。能拉低电平。这下如果 出问题的话就只有核心板了…………
我希望是我程序问题!!但是我确实不知道 我错在哪里了,请指正!!感谢了!!
天嵌_support1 发表于 2010-10-20 10:13:11 | 显示全部楼层
10# mobilefzb


你是在裸奔代码里修改再编译调试么?
天嵌_support1 发表于 2010-10-20 10:22:19 | 显示全部楼层
本帖最后由 embedsky_lxt 于 2010-10-20 10:24 编辑

9# mobilefzb
 楼主| mobilefzb 发表于 2010-10-20 13:05:59 | 显示全部楼层
10# mobilefzb


你是在裸奔代码里修改再编译调试么?
embedsky_lxt 发表于 2010-10-20 10:13

我是在那个裸奔代码调试的:)
电平能拉低,可是这个信号就是不能触发led点亮…………
程序发在前面的回复中,恳求指教一下!!感谢!!
天嵌_support1 发表于 2010-10-20 15:26:35 | 显示全部楼层
13# mobilefzb

看一下芯片手册嘛,别老是只看书本和代码呀。
你的 GPFCON 配置有问题:
GPFCON :    GPFCON = GPF0 & GPF1 & GPF2 & GPF4;  这里只是把它们相应的位清零设置为输入。
可是按键需要的是 EITN 的功能,所以相应位的值应该为 10  , 也就是 2 ,所以你的 GPFCON初始化应该为
GPFCON= GPFCON & GPF0 & GPF1 & GPF2 & GPF4 | (2<<4)|(2<<0)|(2<<8)|(2<<2) ;
 楼主| mobilefzb 发表于 2010-10-20 21:18:23 | 显示全部楼层
我修改了GPFCON的配置,还是不行:'(。请看看我的代码:
#define        GPBCON        (*(volatile unsigned long *)0x56000010)
#define        GPBDAT        (*(volatile unsigned long *)0x56000014)

#define        GPFCON        (*(volatile unsigned long *)0x56000050)
#define        GPFDAT        (*(volatile unsigned long *)0x56000054)

#define        GPB5_out (1 << 5)
#define        GPB6_out (1 << 6)
#define        GPB7_out (1 << 7)
#define        GPB8_out (1 << 8)

#define        GPF0_in         (1 << 0)
#define        GPF1_in         (1 << 1)
#define        GPF2_in         (1 << 2)
#define        GPF4_in         (1 << 4)

#define        GPF0        ~(3 << (0 * 2))
#define        GPF1        ~(3 << (1 * 2))
#define        GPF2        ~(3 << (2 * 2))
#define        GPF3        ~(3 << (3 * 2))
#define        GPF4        ~(3 << (4 * 2))

int main()
{
        unsigned long key_data = 0xffffffff;

        GPBCON = 0xfffd57ff;
        GPFCON = GPFCON & GPF0 & GPF1 & GPF2 & GPF4 | (2 << 4) | (2 << 0) \
                        | (2 << 8) | (2 << 2);

        GPBDAT = 0xffffffff;//light is off

        while(1)
        {
                key_data = GPFDAT;
                if(0xffffffff != (0xffffffff & key_data))
                {
                        GPBDAT = 0x000000f0;
                }
                else
                {
                        GPBDAT = 0x000001f0;
                }
        }
        return 0;
}
恳求指教!!感谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-27 17:30 , Processed in 1.062500 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表