OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2541|回复: 5

大家好!请帮忙说明下程序死机的原因。谢谢了

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-5-23
在线时间
2 小时
发表于 2019-5-23 11:33:51 | 显示全部楼层 |阅读模式
1金钱
我做了一个5*5的矩阵键盘,用的单片机是STM32F103VET6。前面一直使用都没有问题。这次更换口线后(以前换个几次,没问题),按几下就会死机。不知道那里硬件冲突了。请大家帮忙看看。PB8-12输出高电平。PD8-12作为键盘信信息输入口线。(PD2用作了SDIO-CMD,PD1控制485输入输出,PD5,PD6作串口2)。下面是按键函数:
int key(void)  //êμÏÖ¾ØÕó¼üÅì¡£·μ»ØÖμÎa£¬¸÷°′¼üμļüÖ죬′˼üÖμóéóû§×Ô¼o¶¨òå¡£
{
        //int KeyVal=20;         //keyValÎa×îoó·μ»ØμļüÖμ¡£

        GPIO_Write(GPIOB,(GPIOB->ODR & 0xe0ff | 0x1f00)); //Ïèè&#195B8μ&#189B12è«2¿êä3ö¸ß¡£
       
        if((GPIOD->IDR & 0x1f00)==0x0000)  //èç1û£&#172D8μ&#189D12è«Îa0£¬Ôò£¬Ã»óD¼ü°′Ï¡£′Ëê±£¬·μ»ØÖμÎa-1.
        {
                return -1;
        }
        else
        {       
                delay_ms(120);    //Ñóê±5ms襶¶¶ˉ¡£
                if((GPIOD->IDR & 0x1f00)==0x0000)  //èç1û£¬Ñóê±5msoó£&#172D8μ&#189D12óÖè«Îa0£¬Ôò£¬¸Õ2Åòy½ÅμÄμçλ±ä»ˉêǶ¶¶ˉ2úéúμÄ.
                        return -1;
        }
        GPIO_Write(GPIOB,(GPIOB->ODR & 0xe0ff | 0x800));        //è&#195D8μ&#189D11êä3ö¶t½øÖÆμÄ1000.  
        switch(GPIOD->IDR & 0x1f00)                                //¶&#212D12μ&#189D15μÄÖμ½øDDÅD¶Ï£¬òÔêä3ö2»í¬μļüÖμ¡£
        {
                case 0x0100: KeyVal=18;        break;
                case 0x0200: KeyVal=0;        break;
                case 0x0400: KeyVal=19;        break;               
                case 0x0800: KeyVal=12;        break;
                case 0x1000: KeyVal=10;        break;
        }        
        GPIO_Write(GPIOB,(GPIOB->ODR & 0xe0ff | 0x1000));        //èÃPD8μ½PD11êä3ö¶t½øÖÆμÄ0001.
        switch(GPIOD->IDR & 0x1f00)                             //¶ÔPD12μ½PD15μÄÖμ½øDDÅD¶Ï£¬òÔêä3ö2»í¬μļüÖμ¡£
        {
                case 0x0100: KeyVal=4;        break;
                case 0x0200: KeyVal=1;        break;
                case 0x0400: KeyVal=20;        break;               
                case 0x0800: KeyVal=16;        break;
                case 0x1000: KeyVal=15;        break;
        }

        GPIO_Write(GPIOB,(GPIOB->ODR & 0xe0ff | 0x100));        //èÃPD8μ½PD11êä3ö¶t½øÖÆμÄ0001.
        switch(GPIOD->IDR & 0x1f00)                             //¶ÔPD12μ½PD15μÄÖμ½øDDÅD¶Ï£¬òÔêä3ö2»í¬μļüÖμ¡£
        {
                case 0x0100: KeyVal=7;        break;
                case 0x0200: KeyVal=22;        break;
                case 0x0400: KeyVal=23;        break;               
                case 0x0800: KeyVal=24;        break;
                case 0x1000: KeyVal=25;        break;
        }

        GPIO_Write(GPIOB,(GPIOB->ODR & 0xe0ff | 0x200));        //èÃPD8μ½PD11êä3ö¶t½øÖÆμÄ0010.
        switch(GPIOD->IDR & 0x1f00)                                //¶ÔPD12μ½PD15μÄÖμ½øDDÅD¶Ï£¬òÔêä3ö2»í¬μļüÖμ¡£
        {
                case 0x0100: KeyVal=8;        break;
                case 0x0200: KeyVal=5;        break;
                case 0x0400: KeyVal=2;        break;               
                case 0x0800: KeyVal=11;        break;
                case 0x1000: KeyVal=13;        break;
        }

        GPIO_Write(GPIOB,(GPIOB->ODR & 0xe0ff | 0x400));        //èÃPD8μ½PD11êä3ö¶t½øÖÆμÄ0100.
        switch(GPIOD->IDR & 0x1f00)                                //¶ÔPD12μ½PD15μÄÖμ½øDDÅD¶Ï£¬òÔêä3ö2»í¬μļüÖμ¡£
        {
                case 0x0100: KeyVal=9;        break;
                case 0x0200: KeyVal=6;        break;
                case 0x0400: KeyVal=3;        break;               
                case 0x0800: KeyVal=21;        break;
                case 0x1000: KeyVal=14;        break;
        }
       
        Press = 1;
        return KeyVal;               
}



主函数里面查询按键函数部分:
if(key() != -1)key();
while (Press == 1)
{
                GPIO_Write(GPIOB,(GPIOB->ODR & 0xe0ff | 0x1f00));
                nSw2=GPIOD->IDR & 0x1f00;
                if(nSw2 != 0x0000)Press = 1;
                else Press = 0;
}
nKeycode=KeyVal;
if(nKeycode != -1)
{
                printf("nKeycode = %d ",nKeycode);
}
KeyVal = -1;


请大家帮忙分析下现在出现死机的原因。是不是硬件有冲突了。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-5-23
在线时间
2 小时
 楼主| 发表于 2019-5-23 13:39:57 | 显示全部楼层
朋友们有遇到类似问题的吗?
回复

使用道具 举报

15

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2017-2-21
在线时间
159 小时
发表于 2019-5-23 15:06:21 | 显示全部楼层
太复杂了,看不懂啊
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-5-23
在线时间
2 小时
 楼主| 发表于 2019-5-24 11:45:05 | 显示全部楼层
usb123 发表于 2019-5-23 15:06
太复杂了,看不懂啊

有注释的,不过发出来全乱码了
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-5-24 13:18:25 | 显示全部楼层
一, 说说卡死在哪儿
二, switch里干嘛不写default? 两个keil同时控, 不就跑飞了么
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-5-23
在线时间
2 小时
 楼主| 发表于 2019-5-29 09:26:26 | 显示全部楼层
edmund1234 发表于 2019-5-24 13:18
一, 说说卡死在哪儿
二, switch里干嘛不写default? 两个keil同时控, 不就跑飞了么

以前不会卡死的这次改了矩阵按键的输入输出口线,在使用按键的时候偶尔死机,比较频繁的那种。只有一个主函数的。下面的是在调用按键程序,采取的是主程序里面扫描。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 17:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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