打印
[STM32]

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

[复制链接]
1606|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大道至简|  楼主 | 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 | 只看该作者
记得管脚的状态是通过肖特基触发器进入输入寄存器的,是否是跟触发器有关系?尝试用浮空输入试试看。

使用特权

评论回复
5
dirtwillfly| | 2014-10-28 22:00 | 只看该作者
觉得可以上电后先等一会,然后再读IO看是否正常。
如果等一会之后io正常,可能是电源或者地线问题,反之,则相反。

使用特权

评论回复
6
原野之狼| | 2014-10-29 09:21 | 只看该作者
本帖最后由 原野之狼 于 2014-10-29 09:30 编辑

廉颇老矣

使用特权

评论回复
7
NE5532| | 2014-10-29 15:06 | 只看该作者
1.楼主描述在复位的状态读端口读出来是0,怀疑楼主怎么在复位的时候读,这时候单片机都没有运行。
2.检查这几个端口有没有第二功能,上电时候默认是端口还是第二功能(特别是模拟功能),有没有正确的配置?
3.抓住“输入0电平以后可以正确”这个切入点来找问题,努力去想输入0电平改变了什么?
4.时间紧,任务重的,可以考虑加下拉电阻,绕开问题。

使用特权

评论回复
8
大道至简|  楼主 | 2014-10-29 15:15 | 只看该作者
1.肯定不是复位状态读的,操作系统运行指示灯都在闪烁,说明里面的小型操作系统已经运行了
2.确定关闭了第二功能
3.昨天就是按照第四点的思路解决的,把输入信号的相位反过来,其他什么都没有改,然后好了

不过这个问题的原因还是无法解释的

使用特权

评论回复
9
ayb_ice| | 2014-10-29 15:19 | 只看该作者
一个IO口能有啥复杂问题,

写个最简单的程序测试,问题应该一目了然了

使用特权

评论回复
10
大道至简|  楼主 | 2014-10-29 19:39 | 只看该作者
楼上说的是,所以说阴沟里帆船,
不过现在解决了。。。。

使用特权

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

本版积分规则

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

7556

主题

9507

帖子

18

粉丝