打印
[STM32F1]

STM32F103 IO读取问题

[复制链接]
楼主: 小风车
手机看帖
扫描二维码
随时随地手机跟帖
41
小风车|  楼主 | 2017-8-10 09:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
febgxu 发表于 2017-8-9 22:55
得到的信号是否你设定的信号?

电路的电平是0,用示波器看也很稳定,仿真时,看寄存器的值,和电路都一直,只是当我把PD9的值赋给一个变量时,变量的值有时和他们不一致

使用特权

评论回复
42
小风车|  楼主 | 2017-8-10 09:10 | 只看该作者
febgxu 发表于 2017-8-9 22:54
寄存器和watch不一样吗

对对对,寄存器和WATCH不一样,我没想明白

使用特权

评论回复
43
小风车|  楼主 | 2017-8-10 09:13 | 只看该作者
xiaoyaodz 发表于 2017-8-9 22:53
PD9配置的输入对吧

配置为上拉输入,浮空输入都是一样的结果,现在配置成上拉输入

使用特权

评论回复
44
水工鸟| | 2017-8-10 11:20 | 只看该作者
贴103的原理图吧,这个应该不是程序的问题,而是103工作不正常。

使用特权

评论回复
45
lxyppc| | 2017-8-10 11:31 | 只看该作者
小风车 发表于 2017-8-10 08:57
这是汇编代码,
https:  //share.weiyun.com/8e94850dc90fce994679e7c62f274da3
https:  //share.weiyun. ...

汇编代码不完整
右边缺东西
下面esle的没有

使用特权

评论回复
46
小风车|  楼主 | 2017-8-10 11:48 | 只看该作者
lxyppc 发表于 2017-8-10 11:31
汇编代码不完整
右边缺东西
下面esle的没有

(链接有空格,删掉就好)
https:  //share.weiyun.com/33c41763d0a2f6af5fe1fb5de77fcabd

https: //share.weiyun.com/30b098a1917f0ffb4ee9f497271c4cf6

使用特权

评论回复
47
小风车|  楼主 | 2017-8-10 11:52 | 只看该作者
lxyppc 发表于 2017-8-10 11:31
汇编代码不完整
右边缺东西
下面esle的没有

编译出来就没有ELSE

使用特权

评论回复
48
lxyppc| | 2017-8-10 12:19 | 只看该作者
小风车 发表于 2017-8-10 11:48
(链接有空格,删掉就好)
https:  //share.weiyun.com/33c41763d0a2f6af5fe1fb5de77fcabd


你的i是一个临时变量
在while循环里面只有赋值没有使用
因此被优化了,并不会分别赋值
临时变量是寄存器,watch看不到
你想看就把i定义成全局的volatile变量

使用特权

评论回复
49
yjmwxwx| | 2017-8-10 12:39 | 只看该作者
小风车 发表于 2017-8-10 11:48
(链接有空格,删掉就好)
https:  //share.weiyun.com/33c41763d0a2f6af5fe1fb5de77fcabd

看汇编代码你读的是整个IDR当然出错





使用特权

评论回复
50
小风车|  楼主 | 2017-8-10 12:42 | 只看该作者
lxyppc 发表于 2017-8-10 12:19
你的i是一个临时变量
在while循环里面只有赋值没有使用
因此被优化了,并不会分别赋值

我把I定义为volatile u8 i=0;全局变量,调试结果还是一样;
我的程序是读取PD9的值,然后将PD9的值赋值给Port_9,然后Port_9是0或者是1有不同的操作;
我目前的错误是:读取PD9的值,电路上PD9一直是低电平,寄存器中IDR9也一直0,然后理论上Port_9就应该是0才对,就只会进行一种操作,但是实际上Port_9即出现了为0的情况也出现了为1的情况,它两种操作都执行了,这肯定是不对的;
就像我程序了写的,无论i是临时变量还是全局变量,我GPIO->IDR9的值一直是0,他就不应该执行到i=1这条语句,但是他还是执行了,所以我就没有想明白

使用特权

评论回复
51
小风车|  楼主 | 2017-8-10 12:45 | 只看该作者
lxyppc 发表于 2017-8-10 12:19
你的i是一个临时变量
在while循环里面只有赋值没有使用
因此被优化了,并不会分别赋值

如果您不忙的话,我可以加你Q,你远程在我电脑上仿真一下

使用特权

评论回复
52
yjmwxwx| | 2017-8-10 12:45 | 只看该作者


这里有错
            

使用特权

评论回复
53
小风车|  楼主 | 2017-8-10 12:51 | 只看该作者

u16     Port_9=0;
volatile u8 i=0;

void main(void)
{
   
   
    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;
        }
        else
        {
            i=2;
        }
    }   
}

这个C代码

使用特权

评论回复
54
yjmwxwx| | 2017-8-10 13:05 | 只看该作者
本帖最后由 yjmwxwx 于 2017-8-10 13:14 编辑
小风车 发表于 2017-8-10 12:51
u16     Port_9=0;
volatile u8 i=0;

我看错了
你没把判断后的0和1写入变量,i=1和i=2没写入内存只在R0寄存器里面

使用特权

评论回复
55
小风车|  楼主 | 2017-8-10 13:15 | 只看该作者
yjmwxwx 发表于 2017-8-10 13:05
我看错了
你没把判断后的0和1写入变量

Port_9=GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9);
写了。
我换了一块板子,测试了一下,运行都正常,没有出现以前的情况,会不会是103工作不正常?

使用特权

评论回复
56
小风车|  楼主 | 2017-8-10 13:17 | 只看该作者
水工鸟 发表于 2017-8-10 11:20
贴103的原理图吧,这个应该不是程序的问题,而是103工作不正常。

嗯嗯,我换了一块板子,然后运行正常,没有出现我说的那种问题

使用特权

评论回复
57
yjmwxwx| | 2017-8-10 13:32 | 只看该作者
小风车 发表于 2017-8-10 13:15
Port_9=GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9);
写了。
我换了一块板子,测试了一下,运行都正常,没 ...

被判断i误导了,Port_9=GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9);原来就这个有用后面都没用啊。。

你自己焊接么,可能和别的引脚焊到一块了吧

使用特权

评论回复
58
小风车|  楼主 | 2017-8-10 14:37 | 只看该作者
yjmwxwx 发表于 2017-8-10 13:32
被判断i误导了,Port_9=GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9);原来就这个有用后面都没用啊。。

你 ...

这个简单的用来测试的程序,我另外的工程,i这个变量是全局变量,都有用到,但是还是不对

使用特权

评论回复
59
工控人家| | 2017-8-11 14:59 | 只看该作者
GPIO_ReadInputDataBit(GPIOX,GPIO_Pin_X)返回的是一个 uint8_t的变量,你试下直接定义一个新变量,按照这个新变量分别等于0x00和0x01的时候赋给Port_9,再看看出现什么现象。另外,if... else... 那里可以用LED亮灭来表示更加直观。

使用特权

评论回复
60
yiilanying| | 2017-8-12 17:23 | 只看该作者
由于浮空输入一般多用于外部按键输入,浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。
/*选择要控制的GPIO引脚*/                                                                                                                          
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;       

                /*设置引脚模式为输入模式*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;   
   
             /*设置引脚为下拉模式*/
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;

                /*设置引脚速率为2MHz */   
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

/*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/
   GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);       

使用特权

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

本版积分规则