OpenEdv-开源电子网

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

PB4和PB5互相写1写0,出现读写错误

[复制链接]

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2017-10-26
在线时间
25 小时
发表于 2019-8-19 15:18:21 | 显示全部楼层 |阅读模式
5金钱
今天做了一组STM32L0的GPIO读写(PB4&PB5),互相读取电平状态,但是总会出现读取错误的情况,代码如下,请各位大神帮忙看看哪里出问题了,谢谢谢谢以下是打印结果,PB4给PB5写1的时候有错误:

打印结果

打印结果

void OS_GPIOB_IN_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
       
        __HAL_RCC_GPIOB_CLK_ENABLE();
       
        GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void OS_GPIOB_OUT_Init(void)

{

        GPIO_InitTypeDef GPIO_InitStruct;

       

        __HAL_RCC_GPIOB_CLK_ENABLE();

               

        GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5 ;

        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

        GPIO_InitStruct.Pull = GPIO_PULLUP;

        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;

        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}



                                OS_GPIOB_OUT_Init();

                                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
                                DelayMs(1);
                                OS_GPIOB_IN_Init();
                                if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4))
                                {
                                        t101=1;
                                        PRINTF("t101=%d\r\n",t101);
                                }else
                                {
                                        t101=0;
                                        PRINTF("t101=%d\r\n",t101);
                                }
                               
                                OS_GPIOB_OUT_Init();
                                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
                                DelayMs(1);
                                OS_GPIOB_IN_Init();
                                if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4))
                                {
                                        t102=1;
                                        PRINTF("t102=%d\r\n",t102);
                                }else
                                {
                                        t102=0;
                                        PRINTF("t102=%d\r\n",t102);
                                }

                                OS_GPIOB_OUT_Init();
                                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
                                DelayMs(1);
                                OS_GPIOB_IN_Init();
                                if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5))
                                {
                                        t103=1;
                                        PRINTF("t103=%d\r\n",t103);
                                }else
                                {
                                        t103=0;
                                        PRINTF("t103=%d\r\n",t103);
                                }

                                OS_GPIOB_OUT_Init();
                                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
                                DelayMs(1);
                                OS_GPIOB_IN_Init();
                                if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5))
                                {
                                        t104=1;
                                        PRINTF("t104=%d\r\n",t104);
                                }else
                                {
                                        t104=0;
                                        PRINTF("t104=%d\r\n",t104);
                                }





最佳答案

查看完整内容[请看2#楼]

你的初始化中是PB4、PB5同时设置为输入或者同时设置为输出。要互相读取状态必须一个设置为输入一个设置为输出才行。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-8-19 15:18:22 | 显示全部楼层
你的初始化中是PB4、PB5同时设置为输入或者同时设置为输出。要互相读取状态必须一个设置为输入一个设置为输出才行。
回复

使用道具 举报

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2017-10-26
在线时间
25 小时
 楼主| 发表于 2019-8-19 17:04:08 | 显示全部楼层
HXYDJ 发表于 2019-8-19 15:27
你的初始化中是PB4、PB5同时设置为输入或者同时设置为输出。要互相读取状态必须一个设置为输入一个设置为输 ...

程序中并没有同时设置为一个mode,每次读写之后都是重新输出化的
回复

使用道具 举报

2

主题

582

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2690
金钱
2690
注册时间
2014-5-23
在线时间
188 小时
发表于 2019-8-19 20:08:24 | 显示全部楼层
你自己的逻辑就有问题,配置的时候肯定一个输出一个输入
回复

使用道具 举报

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2017-10-26
在线时间
25 小时
 楼主| 发表于 2019-8-20 12:10:53 | 显示全部楼层
awsawzj 发表于 2019-8-19 20:08
你自己的逻辑就有问题,配置的时候肯定一个输出一个输入

不可以配置完输出然后再读的时候配置为输入吗?不是很明白
回复

使用道具 举报

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2017-10-26
在线时间
25 小时
 楼主| 发表于 2019-8-20 15:04:47 | 显示全部楼层
majicblue 发表于 2019-8-20 12:10
不可以配置完输出然后再读的时候配置为输入吗?不是很明白

再看了下初始化程序,原来想偷懒把pin一起初始化,结果弄巧成拙了,的确是冲突了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 04:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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