OpenEdv-开源电子网

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

碰到一个关于STM32 IO口的奇怪问题,不知道是不是STM32的一个硬伤?请大家指点

[复制链接]

12

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2012-8-20
在线时间
8 小时
发表于 2013-12-25 16:54:14 | 显示全部楼层 |阅读模式
我的一个产品使用了STM32VCT6,其中使用了4X4按键,电路如下:


产品使用了三个多月以后,发现按键不能使用,而且设备处于死机状态。经过检查,发现按键扫描的输入端口PC3一直为低电平,排除PC3接地以及按键常闭的可能。因为我在测试的时候,把按键去掉,程序中也没有加按键扫描程序,其他程序都工作正常。此时用万用表测试PC0-PC3,只有PC3为0.38V,PC0-PC2为高电平。所以我判定PC3坏了。目前是,好几个板子都出现了这种情况,我实在找不出什么原因。我把按键扫描代码也贴出来,请各位帮忙,多谢了。

void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/*允许总线时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
/* PC0,1,2,3矩阵式按键(行)上拉输入*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2| GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU; 
        GPIO_Init(GPIOC, &GPIO_InitStructure);
/* PC4,5,6,7矩阵式按键(列)推挽输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6| GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP; 
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

}

u8 KeyNumber;
u8 KeyPressFlag;
void KEY_Scan(void)
{  
u8 k;
u16 keytemp;
//u16 ScanNum=0xFFEF;
GPIOC->IDR = (GPIOC->IDR &~0x000F); //把PC口输入寄存器的0--3位清零
                GPIOC->ODR = (GPIOC->ODR &~0x00F0); //把PC口的输出寄存器的4--7位清零
                keytemp=GPIOC->IDR;   // 读入PC口的状态
                keytemp&=0x000F;     // 保留PC口的0--3位

if(keytemp==0x000F)   // 如果没有矩阵式按键按下则直接去判断独立式按键
goto   NEXT;
delay_ms(20);         //延时去抖
keytemp=GPIOC->IDR;   // 再次读入PC口的状态
                keytemp&=0x000F;     // 保留PC口的0--3位
if(keytemp==0x000F)   // 如果没有按键按下则直接去判断独立式按键
goto   NEXT;       
for(k=0;k<4;k++)  
                  {
 switch(k)
{
case 0:
    GPIOC->ODR =0xFFEF;
                                                               break;
                                            case 1:
    GPIOC->ODR =0xFFDF;
                                                               break;
                                                case 2:
    GPIOC->ODR =0xFFBF;
                                                               break;
                                                case 3:
    GPIOC->ODR =0xFF7F;
                                                               break;
                                               default:
                                                                break;
    
}
 delay_ms(1);
 keytemp=GPIOC->IDR;   // 读入PC口的状态
 keytemp=~keytemp;
keytemp&=0x000F;     // 保留PC口的0--3位
                                switch(keytemp)
{
case 0x01:
KeyNumber=1+k;
KeyPressFlag=1;
               break;
case 0x02:
         KeyNumber=5+k;
KeyPressFlag=1;
               break;
case 0x04:
         KeyNumber=9+k;
KeyPressFlag=1;
               break;
case 0x08:
        KeyNumber=13+k;
KeyPressFlag=1;
               break;            
default:
         break;
}
       
                                     }
/*等待按键弹起来*/
if((ScreenDeepCounts==1)&&(KeyNumber==6))      //如果是KEY6按下,判断是否超过3S,其他按键不需要判断
TIM_Cmd(TIM4, ENABLE); 
            AGAIN:
GPIOC->ODR = (GPIOC->ODR &~0x00F0); 
delay_ms(10);  
keytemp=GPIOC->IDR;
keytemp&=0x000F;
if(keytemp!=0x000f)
  {
if(time4cnts>6)
 {
//timecnts=0; 
 return;
}
goto AGAIN;
  }
if(KeyNumber==6)
{
     time4cnts=0;
     TIM_Cmd(TIM4, DISABLE);
}
NEXT:
      return;
}







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

使用道具 举报

12

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2012-8-20
在线时间
8 小时
 楼主| 发表于 2013-12-25 17:13:15 | 显示全部楼层
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-25 17:13:37 | 显示全部楼层
回复【楼主位】maxbar:
---------------------------------
看着没什么问题,你可以写个测试代码,单独输出这个问题管脚的电平,看他会不会反应
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

12

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2012-8-20
在线时间
8 小时
 楼主| 发表于 2013-12-25 17:17:55 | 显示全部楼层
我测试过了,PC3如果作为输出,输出电平有反应,我可以设置为高,也可以设置为低
回复 支持 反对

使用道具 举报

19

主题

199

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2012-11-18
在线时间
72 小时
发表于 2013-12-25 17:19:50 | 显示全部楼层
按键2端加个102的吸收电容吧,要不然经常按的话IO口会坏的.
回复 支持 反对

使用道具 举报

12

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2012-8-20
在线时间
8 小时
 楼主| 发表于 2013-12-25 17:21:42 | 显示全部楼层
如果是加电容,就在我这个按键两端直接加就可以吗?
回复 支持 反对

使用道具 举报

12

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2012-8-20
在线时间
8 小时
 楼主| 发表于 2013-12-25 17:27:49 | 显示全部楼层
或者是在输入按键的输入端口接上一个对地电容,怎么样?
回复 支持 反对

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2012-10-21
在线时间
23 小时
发表于 2013-12-25 20:07:28 | 显示全部楼层
这怎么回事stm32的硬伤,还是看看工作环境会不会打坏IO吧
回复 支持 反对

使用道具 举报

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1074
金钱
1074
注册时间
2012-1-10
在线时间
238 小时
发表于 2013-12-25 22:14:00 | 显示全部楼层
VCC是几伏电?
建议每个10k电阻下面串联一个1N4148。
回复 支持 反对

使用道具 举报

12

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2012-8-20
在线时间
8 小时
 楼主| 发表于 2013-12-26 10:31:33 | 显示全部楼层
回复【9楼】magicoctoy:
---------------------------------
能说说串联1N4148的作用吗
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2017-12-13
在线时间
1 小时
发表于 2017-12-13 09:38:06 | 显示全部楼层
输出端口与输入端口直接连接,输出高电平的时候会有大的灌电流进入输入端口,我觉得应该加一个限流电阻。C语言写的程序,用GOTO语句进行程序跳转,我觉得是不用心构建程序结构的一种表现。
回复 支持 反对

使用道具 举报

6

主题

305

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2876
金钱
2876
注册时间
2016-7-17
在线时间
404 小时
发表于 2017-12-13 09:49:45 | 显示全部楼层
I/O烧了。
回复 支持 反对

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1818
金钱
1818
注册时间
2011-10-9
在线时间
231 小时
发表于 2017-12-13 12:07:27 | 显示全部楼层
我记得按键好像是要并个电容的  
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-24 05:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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