打印

GPIO控制,程序卡死

[复制链接]
1831|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
清枫城主|  楼主 | 2017-5-6 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#define key_up                 GpioDataRegs.GPBDAT.bit.GPIO48
#define key_down         GpioDataRegs.GPBDAT.bit.GPIO51
#define key_right        GpioDataRegs.GPBDAT.bit.GPIO49
#define key_left         GpioDataRegs.GPBDAT.bit.GPIO50
#define key_enter        GpioDataRegs.GPBDAT.bit.GPIO52
#define key_exit         GpioDataRegs.GPBDAT.bit.GPIO53
#define relay0                GpioDataRegs.GPBDAT.bit.GPIO55
#define relay1                 GpioDataRegs.GPBDAT.bit.GPIO57


void key_init()
{
                EALLOW;
                // 用户根据需要可以使能内部上拉或禁止.
                GpioCtrlRegs.GPBPUD.bit.GPIO48 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO50 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO51 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO52 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO53 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;   //  LCD_RS使能上拉
                GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0;   //  LCD_RS使能上拉

                /* 通过I/O功能选择寄存器配置通用I/O功能*/
                GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO52 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 0;   // GPIO模式
                GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0;   // GPIO模式

                /* 设置I/O口为输入引脚*/
        //    GpioCtrlRegs.GPADIR.all = 0xFFFF0000;
                GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO50 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO51 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO52 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO53 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO55 = 1;   // 输出模式
                GpioCtrlRegs.GPBDIR.bit.GPIO57 = 1;   // 输出模式

                //各个IO初值设定
                GpioDataRegs.GPBDAT.bit.GPIO48 = 1;
                GpioDataRegs.GPBDAT.bit.GPIO49 = 1;
                GpioDataRegs.GPBDAT.bit.GPIO50 = 1;
                GpioDataRegs.GPBDAT.bit.GPIO51 = 1;
                GpioDataRegs.GPBDAT.bit.GPIO52 = 1;
                GpioDataRegs.GPBDAT.bit.GPIO53 = 1;
                GpioDataRegs.GPBDAT.bit.GPIO55 = 1;                //继电器上电关断
                GpioDataRegs.GPBDAT.bit.GPIO57 = 1;
}

void key_scan()
{
        if(key_up==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
//                show("KEY TEST    UP  ");
                show("RELAY0 TEST OPEN");
                relay0 = 0;
                DELAY_US(30);
                while(key_up==0);
        }
        if(key_down==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
//                show("KEY TEST    DOWN");
                show("RELAY0 TEST CLOS");
                relay0 = 1;DELAY_US(20);
                while(key_down==0);
        }
        if(key_right==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
//                show("KEY TEST   RIGHT");
                show("RELAY1 TEST CLOS");
                relay1 = 1;DELAY_US(20);
                while(key_right==0);
        }
        if(key_left==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
//                show("KEY TEST    LEFT");
                show("RELAY1 TEST OPEN");
                relay1 = 0;DELAY_US(20);
                while(key_left==0);
        }
        if(key_enter==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
                show("KEY TEST   ENTER");
                while(key_enter==0);
        }
        if(key_exit==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
                show("KEY TEST    EXIT");
                while(key_exit==0);
        }
}

相关帖子

沙发
清枫城主|  楼主 | 2017-5-6 15:41 | 只看该作者
程序如上,存在问题:当按下按键,然后控制另一个GPIO输出高低电平后,程序就直接卡死。如果按键控制程序里,把relay的控制屏蔽或者删除,各个按键触发灵敏,不会存在卡死问题。在按键处理里面,没有IO控制的情况下,各个按键都可以正常触发控制,但是加入IO控制,就会卡死,个人判断卡死与while(key_xxx==0)这句语句中。不知道是哪里问题,导致IO控制会致使另一个IO如**常检测识别。

使用特权

评论回复
板凳
清枫城主|  楼主 | 2017-5-6 15:42 | 只看该作者
原以为是IO操作频繁导致问题,特意在relay与while之间加延时,从延时3us到30us还是卡死。

使用特权

评论回复
地板
清枫城主|  楼主 | 2017-5-6 15:44 | 只看该作者

void key_scan()
{
        if(key_up==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
//                show("KEY TEST    UP  ");
                show("RELAY0 TEST OPEN");
                relay0 = 0;
                DELAY_US(30);
//                while(key_up==0);
        }
        if(key_down==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
//                show("KEY TEST    DOWN");
                show("RELAY0 TEST CLOS");
                relay0 = 1;
                DELAY_US(20);
//                while(key_down==0);
        }
        if(key_right==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
//                show("KEY TEST   RIGHT");
                show("RELAY1 TEST CLOS");
                relay1 = 1;
                DELAY_US(20);
//                while(key_right==0);
        }
        if(key_left==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
//                show("KEY TEST    LEFT");
                show("RELAY1 TEST OPEN");
                relay1 = 0;
                DELAY_US(20);
//                while(key_left==0);
        }
        if(key_enter==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
                show("KEY TEST   ENTER");
                while(key_enter==0);
        }
        if(key_exit==0)
        {
                LCD_write_command(0x80);        //第一行数据指针地址
                show("KEY TEST    EXIT");
                while(key_exit==0);
        }
}
如果把while();屏蔽掉,那么按键处理程序里面的IO操作,可以正常处理,处理完后各个按键也可以正常触发,不会卡死。

使用特权

评论回复
5
清枫城主|  楼主 | 2017-5-6 16:19 | 只看该作者
清枫城主 发表于 2017-5-6 15:44
void key_scan()
{
        if(key_up==0)

没有  实际测试还是卡死

使用特权

评论回复
6
清枫城主|  楼主 | 2017-5-7 09:26 | 只看该作者
找到问题所在  按键检测要把IO配置为输入模式 我配置成输出模式  导致出问题  换成输入模式 问题彻底解决

使用特权

评论回复
7
icecut| | 2017-5-7 11:52 | 只看该作者
解决了就好

使用特权

评论回复
8
ningling_21| | 2017-5-7 14:54 | 只看该作者
清枫城主 发表于 2017-5-6 15:41
程序如上,存在问题:当按下按键,然后控制另一个GPIO输出高低电平后,程序就直接卡死。如果按键控制程序里 ...

卡死在哪里,就找哪里的问题

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
清枫城主 + 3
9
清枫城主|  楼主 | 2017-5-9 14:53 | 只看该作者
ningling_21 发表于 2017-5-7 14:54
卡死在哪里,就找哪里的问题

使用特权

评论回复
10
aspoke| | 2017-5-9 23:03 | 只看该作者
清枫城主 发表于 2017-5-6 15:41
程序如上,存在问题:当按下按键,然后控制另一个GPIO输出高低电平后,程序就直接卡死。如果按键控制程序里 ...

while(key_up==0); 这个执行了?

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
清枫城主 + 3
11
aspoke| | 2017-5-9 23:05 | 只看该作者
清枫城主 发表于 2017-5-6 15:41
程序如上,存在问题:当按下按键,然后控制另一个GPIO输出高低电平后,程序就直接卡死。如果按键控制程序里 ...

程序卡死肯定是执行了死循环了吧。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
清枫城主 + 3
12
清枫城主|  楼主 | 2017-5-12 09:19 | 只看该作者
aspoke 发表于 2017-5-9 23:05
程序卡死肯定是执行了死循环了吧。

没有  你可以翻上去看下程序 没有执行死循环的函数。按键松开检测应该不算是死循环吧?

使用特权

评论回复
13
清枫城主|  楼主 | 2017-5-12 09:20 | 只看该作者
问题已解决 答案在6楼

使用特权

评论回复
14
shenmu2012| | 2017-5-12 21:50 | 只看该作者
楼主那是判断key的状态的,,没有及时得到状态的

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
清枫城主 + 3
15
清枫城主|  楼主 | 2017-5-15 09:11 | 只看该作者
shenmu2012 发表于 2017-5-12 21:50
楼主那是判断key的状态的,,没有及时得到状态的

嗯 因为IO刚开始设置错误 设置成输出模式 到时得到错误结果 后面改为输入模式搞定了

使用特权

评论回复
16
hudi008| | 2017-5-15 19:05 | 只看该作者
清枫城主 发表于 2017-5-6 15:41
程序如上,存在问题:当按下按键,然后控制另一个GPIO输出高低电平后,程序就直接卡死。如果按键控制程序里 ...

这个死机了吗

使用特权

评论回复
17
selongli| | 2017-5-15 19:06 | 只看该作者
通过看门狗复位了吗

使用特权

评论回复
18
febgxu| | 2017-5-15 19:06 | 只看该作者
你这不是用while了吗

使用特权

评论回复
19
sanfuzi| | 2017-5-15 19:07 | 只看该作者
清枫城主 发表于 2017-5-6 15:42
原以为是IO操作频繁导致问题,特意在relay与while之间加延时,从延时3us到30us还是卡死。 ...

延时卡死,就是没有退出程序。

使用特权

评论回复
20
biechedan| | 2017-5-15 19:07 | 只看该作者
清枫城主 发表于 2017-5-6 15:41
程序如上,存在问题:当按下按键,然后控制另一个GPIO输出高低电平后,程序就直接卡死。如果按键控制程序里 ...

io是怎么设计的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

70

帖子

1

粉丝