[STM32] 老革命在阴沟里翻船,GPIO读数据出问题了

[复制链接]
 楼主| 大道至简 发表于 2014-10-28 09:34 | 显示全部楼层 |阅读模式
一个单片机软件,使用了STM32103VET6
其中的PE8、PE9、PE10三个管脚分别连接一个信号,做输入用。

出现一个超级奇怪的问题
单片机在复位或者上电的时候,无论这几个管脚是什么状态,读出来的总是0
更奇怪的是只要这几个管脚出现了一次真正的0信号输入,然后这个管脚就正常了。谁可以告诉我这是为什么?
以上问题可以100%的概率重新出现。

以下是初始化代码:
                #define DGsenser_0        GPIO_Pin_8
                #define DGsenser_1        GPIO_Pin_9
                #define DGsenser_2        GPIO_Pin_10
                #define port_DGsenser_0        GPIOE
                #define port_DGsenser_1        GPIOE
                #define port_DGsenser_2        GPIOE
//-----------------------------------------------------
void sdg_gpio_init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;   
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);
        GPIO_InitStructure.GPIO_Pin = DGsenser_0 | DGsenser_1 | DGsenser_2 ;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_Init(port_DGsenser_0, &GPIO_InitStructure);
}
//-----------------------------------------------------
bool sdg_get_senser0()
{
        bool a;
        a=GPIO_ReadInputDataBit(port_DGsenser_0,DGsenser_0);
        return a;
}
bool sdg_get_senser1()
{
        bool a;
        a=GPIO_ReadInputDataBit(port_DGsenser_1,DGsenser_1);
        return a;
}
bool sdg_get_senser2()
{
        bool a;
        a=GPIO_ReadInputDataBit(port_DGsenser_2,DGsenser_2);
        return a;
}

//-----------------------------------------------------
//-----------------------------------------------------
//-----------------------------------------------------


ayb_ice 发表于 2014-10-28 09:51 | 显示全部楼层
可能硬件问题吧,

有地方地线不正常
xlsbz 发表于 2014-10-28 15:09 来自手机 | 显示全部楼层
是不是先再读就ok
21ID 发表于 2014-10-28 15:17 | 显示全部楼层
记得管脚的状态是通过肖特基触发器进入输入寄存器的,是否是跟触发器有关系?尝试用浮空输入试试看。
dirtwillfly 发表于 2014-10-28 22:00 | 显示全部楼层
觉得可以上电后先等一会,然后再读IO看是否正常。
如果等一会之后io正常,可能是电源或者地线问题,反之,则相反。
原野之狼 发表于 2014-10-29 09:21 | 显示全部楼层
本帖最后由 原野之狼 于 2014-10-29 09:30 编辑

廉颇老矣
NE5532 发表于 2014-10-29 15:06 | 显示全部楼层
1.楼主描述在复位的状态读端口读出来是0,怀疑楼主怎么在复位的时候读,这时候单片机都没有运行。
2.检查这几个端口有没有第二功能,上电时候默认是端口还是第二功能(特别是模拟功能),有没有正确的配置?
3.抓住“输入0电平以后可以正确”这个切入点来找问题,努力去想输入0电平改变了什么?
4.时间紧,任务重的,可以考虑加下拉电阻,绕开问题。
 楼主| 大道至简 发表于 2014-10-29 15:15 | 显示全部楼层
1.肯定不是复位状态读的,操作系统运行指示灯都在闪烁,说明里面的小型操作系统已经运行了
2.确定关闭了第二功能
3.昨天就是按照第四点的思路解决的,把输入信号的相位反过来,其他什么都没有改,然后好了

不过这个问题的原因还是无法解释的
ayb_ice 发表于 2014-10-29 15:19 | 显示全部楼层
一个IO口能有啥复杂问题,

写个最简单的程序测试,问题应该一目了然了
 楼主| 大道至简 发表于 2014-10-29 19:39 | 显示全部楼层
楼上说的是,所以说阴沟里帆船,
不过现在解决了。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:看大道至简所著的《感悟设计》,感悟设计的至简大道

7562

主题

9523

帖子

18

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:看大道至简所著的《感悟设计》,感悟设计的至简大道

7562

主题

9523

帖子

18

粉丝
快速回复 在线客服 返回列表 返回顶部