完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
#define ExButton1() GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_14)
#define ExButton2() GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_12) 程序这样写就会出错,PE12的值读上来一直是1! if(ExButton1()==0) //启动紧急开门1,并记录日志 { q_doorcmd = DOOR_STATE_OPEN; trig_openstyle = R_TRIG_EXBTN1OPEN; RecordDoorState(trig_openstyle,DOOR_STATE_OPEN);//表示应急开门1 } if(ExButton2()==0) //启动应急开门2,并记录日志 { q_doorcmd = DOOR_STATE_OPEN; trig_openstyle = R_TRIG_EXBTN2OPEN; RecordDoorState(trig_openstyle,DOOR_STATE_OPEN);//52='4',表示应急开门2 } 程序这样写,读PE12的值就是0 if((ExButton1()==0) || (ExButton2()==0)) { Door1Open(1); } 郁闷了.....不知道怎么回事,有人遇到类似的问题吗?我上面是通用的硬件,其它程序都没有占用IO,正确的是PE12读上来为0 ! |
|
相关推荐
41个回答
|
|
|
哪种库 HAL HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_12)
|
|
|
|
|
|
3.5的标准库
|
|
|
|
|
|
路过~~~~支持下
|
|
|
|
|
|
标准库支持的,可能直接使用
|
|
|
|
|
|
我今天发现 if 语句里最好不要运算的太多 例子: y=1; t=0x20 ; if(((t&0x80)==0)&&y==1) 这样条件应该成立进入 才对,但这时是进入不了的
|
|
|
|
|
yuxiangxyz 发表于 2018-10-19 12:52 我就读IO口而已... |
|
|
|
|
|
|
|
|
|
|
|
或者这样写试下:
if(ExButton1()) {} else { q_doorcmd = DOOR_STATE_OPEN; trig_openstyle = R_TRIG_EXBTN1OPEN; RecordDoorState(trig_openstyle,DOOR_STATE_OPEN);//表示应急开门1 } if(ExButton2()) {} else { q_doorcmd = DOOR_STATE_OPEN; trig_openstyle = R_TRIG_EXBTN2OPEN; RecordDoorState(trig_openstyle,DOOR_STATE_OPEN);//52='4',表示应急开门2 } |
|
|
|
|
|
这个问题一点都不奇葩。
从功能逻辑和C语言语法来看,第一段程序和第二段程序都能在检测到开门按钮1或2按下时完成开门动作(当然第一段程序还有相应的日志记录),只能说是没有正确采集到开门按钮1或2的状态而已,应该从GPIO PE12的输入状态采集是否正确入手DEBUG。 另外,GPIO PE14的状态采集正确吗? |
|
|
|
|
zhhx1985 发表于 2018-10-19 09:43 尽量从自己的硬件、软件找问题,不要轻易认为编译器或MCU如何如何 |
|
|
|
|
|
同样的板子,说明硬件是一样的,差别只是程序,IO配置都一样,所以才无语,回头试试,看看汇编代码的区别以排除编译器的问题... |
|
|
|
|
jr3367 发表于 2018-10-19 13:44 是的,GPIOE 14采集完全正确,GPIOE 12读就一直为1,正确应该为0.... 主要是在同样的板子上,同样的按钮触发,但是程序上只有这儿有区别... |
|
|
|
|
|
这试过了,调试模式,GPIOE12读回来一直是1,硬件外面接下拉读回来也还是1 |
|
|
|
|
zhhx1985 发表于 2018-10-19 14:21 两块板子上程序不同,可能是程序问题 但是也不排除硬件问题啊 |
|
|
|
|
|
|
|
|
|
|
|
楼主还没明白意思,大伙说的是你第二种写法里,如果第一个条件(PE14)成立,就没有检测第2个条件了,因为它会直接进入条件里面的子程序了。所以这时候你能看到执行了开门操作。实际调试时,你的第1种写法才真正发现了问题。实际是你的PE12本来就是读的高电平。
你要把PE14人为设为高电平,再去调试第2种,看看问题吧。 |
|
|
|
|
kpj3026 发表于 2018-10-19 15:04 本帖最后由 wofei1314 于 2015-11-4 09:46 编辑 首先感谢你的回答,其次可能是我表达方式不好.... if(条件1或者条件2)这种,实际运行的时候,不管是条件1触发还是条件2触发,都能通过寄存器看出来!!!另外,条件2就是PE12这个IO口,你的意思是PE12接地后,PE12读回的还是高电平,是PE14变低了所以这个判断才成立,门开了?? PE14和PE12都是有上拉的,不需要调,读回的就应该是高电平,只有按键按下了,读回的才是低电平好吗,PE14和PE12是两个独立的IO,硬件上接的是两个独立按键的,这样的表述是不是就明白了? |
|
|
|
|
|
|
|
|
|
|
|
if和else不可以分开么?我记得我以前都是分开的啊,不过我没试过 if(条件) 函数1; else ; else后面为空 |
|
|
|
|
|
应该也可以,个人习惯,标准用法是配对使用 |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 13:08 , Processed in 1.851867 second(s), Total 109, Slave 92 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
652