打印
[STM32F1]

STM32F103 IO读取问题

[复制链接]
5815|61
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小风车|  楼主 | 2017-8-9 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
遇到一个问题,就是读取PD9的值,然后赋值给一个变量,电路上PD9的值是0,所以理论上变量的值也应该一直是0,但是有的时候变量的值会变成1,查看寄存器的值,GPIOD->IDR9的值是0,但是从WATCH看变量的值却是1,想不明白,忘大神告知。

u16     Port_9=0;

void main(void)
{
    u8 i=0;
   
    GPIO_InitTypeDef  GPIO_InitStructure;
   
    //开启A,B,C,D端口时钟和IO口复用时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
                           |RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE
                               |RCC_APB2Periph_AFIO,ENABLE);
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOD, &GPIO_InitStructure);
   
    while(1)
    {
        Port_9=GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9);
        
        if(Port_9)
        {
            i=1;//电路上PD9的电平是0,所以理论上是不会执行此语句的,但是在调试过程中会执行,
        }
        else
        {
            i=2;
        }
    }   
}
附上图片两张:
///// https:  //share.weiyun.com/5e2e1e18ffd6008beabf136612ad73b6
///// https:  //share.weiyun.com/b6ae9e81195ea83cba52b86358066685
沙发
feelhyq| | 2017-8-9 17:14 | 只看该作者

使用特权

评论回复
板凳
小风车|  楼主 | 2017-8-9 17:32 | 只看该作者

我没说明白么?

使用特权

评论回复
地板
feelhyq| | 2017-8-9 17:35 | 只看该作者

楼主说的很明白了,我只是帮你顶下让更多的人看到。如果要作为单纯的输入的话,不建议配置成悬浮模式,最好是上拉或者下拉输入

使用特权

评论回复
5
小风车|  楼主 | 2017-8-9 17:40 | 只看该作者
feelhyq 发表于 2017-8-9 17:35
楼主说的很明白了,我只是帮你顶下让更多的人看到。如果要作为单纯的输入的话,不建议配置成悬浮模式,最 ...

我上拉输入也配置过了,调试的结果一样

使用特权

评论回复
6
feelhyq| | 2017-8-9 17:42 | 只看该作者
小风车 发表于 2017-8-9 17:40
我上拉输入也配置过了,调试的结果一样

看看 Port_9这个变量是不是0x0001呢?

使用特权

评论回复
7
小风车|  楼主 | 2017-8-9 17:44 | 只看该作者
feelhyq 发表于 2017-8-9 17:42
看看 Port_9这个变量是不是0x0001呢?

是的,我附上了两个链接,可以看一下

使用特权

评论回复
8
feelhyq| | 2017-8-9 17:47 | 只看该作者
小风车 发表于 2017-8-9 17:44
是的,我附上了两个链接,可以看一下

u16 volatile Port_9;这样定义试试,

使用特权

评论回复
9
feelhyq| | 2017-8-9 17:48 | 只看该作者
每到这个点肚子饿了,然后什么都不想想,好饿

使用特权

评论回复
10
小风车|  楼主 | 2017-8-9 17:52 | 只看该作者
feelhyq 发表于 2017-8-9 17:47
u16 volatile Port_9;这样定义试试,

没有用,都试过了,我也饿了

使用特权

评论回复
11
feelhyq| | 2017-8-9 17:59 | 只看该作者
不科学,太不科学了,你颠覆了我对单片机的世界观

使用特权

评论回复
12
小风车|  楼主 | 2017-8-9 18:04 | 只看该作者
feelhyq 发表于 2017-8-9 17:59
不科学,太不科学了,你颠覆了我对单片机的世界观

我也没想明白,我只是简简单单想读取IO的值,然后赋给一个变量,变量的值竟然不对,我也想不通

使用特权

评论回复
13
小风车|  楼主 | 2017-8-9 18:09 | 只看该作者
feelhyq 发表于 2017-8-9 17:59
不科学,太不科学了,你颠覆了我对单片机的世界观

看这张图片,这个原来的程序调试的情况,当我运行到断点那里时,在WATCH里面temp连个值都没有,我就没有想明白,怎么会没有赋值
https:   //share.weiyun.com/3c9eb67664775d7f89b8ecb26ad979d9(链接稍微修改一下,我没有权限上传)

使用特权

评论回复
14
lxyppc| | 2017-8-9 18:47 | 只看该作者
贴你这段C代码对应的汇编代码
然后再分析

使用特权

评论回复
15
feelhyq| | 2017-8-9 20:13 | 只看该作者
小风车 发表于 2017-8-9 18:09
看这张图片,这个原来的程序调试的情况,当我运行到断点那里时,在WATCH里面temp连个值都没有,我就没有 ...

刚吃完饭,能量来了,局部变量看不到值不奇怪,有可能是你的优化开了,也有可能代码还没执行到那里去,把那个变脸定义成全局变量吧,楼下说得对,看看汇编就明白了

使用特权

评论回复
16
mmuuss586| | 2017-8-9 21:54 | 只看该作者
程序暂停看下

使用特权

评论回复
17
kkzz| | 2017-8-9 22:51 | 只看该作者
你查看到的输出变量呢?

使用特权

评论回复
18
hudi008| | 2017-8-9 22:51 | 只看该作者
单步调试的时候显示多少

使用特权

评论回复
19
lzmm| | 2017-8-9 22:52 | 只看该作者
楼主的赋值怎么能够变为1呢

使用特权

评论回复
20
minzisc| | 2017-8-9 22:52 | 只看该作者
赋值给一个变量检查有问题吗

使用特权

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

本版积分规则

4

主题

37

帖子

0

粉丝