完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
#define SDA_read GPIOE->IDR & GPIO_Pin_3 //GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
我用库函数的GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)这个来读IO口,做了几天发现 居然有的时候会读不到。但是只要改成GPIOE->IDR & GPIO_Pin_3 它就能正常读到了 。 调试进去一看 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) { uint8_t bitstatus = 0x00; /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET) { bitstatus = (uint8_t)Bit_SET; } else { bitstatus = (uint8_t)Bit_RESET; } return bitstatus; } 就没差别 ,可是死活读不到 只要一换成 GPIOE->IDR & GPIO_Pin_3就成功读取了 |
|
相关推荐
28个回答
|
|
|
//I2C SDA(PE3) SCL(PE2)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; / GPIO_Init(GPIOE, &GPIO_InitStructure); |
|
|
|
|
|
上了配置
|
|
|
|
|
|
确实感觉莫名其妙的。。。帮顶
|
|
|
|
|
|
我记得IIC的引脚不能拿来直接用的,内部上拉是没用的,如果要用,还是外部 上拉
|
|
|
|
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; 只设置这2个试试。 |
|
|
|
|
|
哥,我要是没接上拉 ,我能读的到应答信号吗?我肯定是接了外部上拉的 |
|
|
|
|
TOPCB 发表于 2018-9-6 10:38 试过了,可能电池没电的时候,用库函数读不出来吧 用寄存器就可以 |
|
|
|
|
|
库也是读取的寄存器,理论是一样的。这样只能是仿真一下,看看他走到函数里面执行到哪儿跳出了。
|
|
|
|
|
|
我死死用万用表量着它的 3.3V 它硬是读出为0 换了寄存器就读出为1 纠结的我。。。 |
|
|
|
|
|
时不时你那里配置的出了问题程序没有执行配置就返回了啊?
|
|
|
|
|
|
|
|
|
|
|
|
楼主说按我改的也不行。我的模拟I2C就这样配置的。前面留贴有。 |
|
|
|
|
|
那就是你的库函数的问题了
|
|
|
|
|
|
官方库的bug,很明显 GPIOx->IDR & GPIO_Pin,在GPIO_Pin = 0 的时候,这句话读出来的值永远都是0. (xxxxx & 0) == 0,这是&计算的基本常识.
if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET) { bitstatus = (uint8_t)Bit_SET; } 改为如下测试: if (((GPIOx->IDR >> GPIO_Pin) & 0x01) != (uint32_t)Bit_RESET) { bitstatus = (uint8_t)Bit_SET; } |
|
|
|
|
报纸弟弟麦花 发表于 2018-9-6 12:30 #define GPIO_Pin_0 ((uint16_t)0x0001) /* Pin 0 selected */ #define GPIO_Pin_1 ((uint16_t)0x0002) /* Pin 1 selected */ #define GPIO_Pin_2 ((uint16_t)0x0004) /* Pin 2 selected */ #define GPIO_Pin_3 ((uint16_t)0x0008) /* Pin 3 selected */ #define GPIO_Pin_4 ((uint16_t)0x0010) /* Pin 4 selected */ #define GPIO_Pin_5 ((uint16_t)0x0020) /* Pin 5 selected */ #define GPIO_Pin_6 ((uint16_t)0x0040) /* Pin 6 selected */ #define GPIO_Pin_7 ((uint16_t)0x0080) /* Pin 7 selected */ #define GPIO_Pin_8 ((uint16_t)0x0100) /* Pin 8 selected */ #define GPIO_Pin_9 ((uint16_t)0x0200) /* Pin 9 selected */ #define GPIO_Pin_10 ((uint16_t)0x0400) /* Pin 10 selected */ #define GPIO_Pin_11 ((uint16_t)0x0800) /* Pin 11 selected */ #define GPIO_Pin_12 ((uint16_t)0x1000) /* Pin 12 selected */ #define GPIO_Pin_13 ((uint16_t)0x2000) /* Pin 13 selected */ #define GPIO_Pin_14 ((uint16_t)0x4000) /* Pin 14 selected */ #define GPIO_Pin_15 ((uint16_t)0x8000) /* Pin 15 selected */ #define GPIO_Pin_All ((uint16_t)0xFFFF) /* All pins selected */ 哪里来的 0 ? |
|
|
|
|
|
这个函数应该不会存在这样的问题。
IO模拟I2C的话,个人建议将IO口配置成输入模式,再去读取端口输入电平,读完再切回输出。 如果这样的逻辑下还出现库函数和寄存器操作不一样的,那我也没什么好的建议了。呵呵。 |
|
|
|
|
|
函数也是通过寄存器来达到目的的,现在的问题是,直接用寄存器正常,而用库函数不正常,还用怀疑其他啊,肯定是库函数方面的问题
|
|
|
|
|
|
问题解决了,用库函数的话 多加点延迟就能读到数据了 |
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2797 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2403 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2276 浏览 0 评论
2388 浏览 1 评论
1637 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 00:28 , Processed in 1.292630 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
12655