Rareyee 发表于 2018-4-4 15:15:53

STM32F7li 判断IO口状态?

#define BUSY(x)        GPIO_Pin_Set(GPIOD,PIN8,x)
while(BUSY == 1);这样写为什么会报错 未定义

原子的案例里这样也不能写
   u8 GPIO_Pin_Get(GPIO_TypeDef* GPIOD,u16 pin8)
        {
          if(GPIOD->IDR&pin8)return 1;
                else return 0;

toofree 发表于 2018-4-6 23:51:08


宏定义相当于替换,你看看 while(GPIO_Pin_Set(GPIOD,PIN8) == 1) 是个什么?
GPIO_Pin_Set()一般是没有返回值的viod类型, 不知道你的函数定义里面是什么样的。标准库函数中,读是“void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)”,写是“uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)”




至于下面一条说 “原子的案例里这样也不能写”,那得看报什么错?本身这个函数这样写是没有语法问题的。


bargagebaobei 发表于 2018-4-4 15:25:31

GPIO_Pin_Set(GPIOD,PIN8,x)是设置 不是获取。
if里需求的是布尔量,而你是一个数字量,当然报错

Rareyee 发表于 2018-4-4 15:26:06

bargagebaobei 发表于 2018-4-4 15:25
GPIO_Pin_Set(GPIOD,PIN8,x)是设置 不是获取。
if里需求的是布尔量,而你是一个数字量,当然报错 ...

那应该怎么写

bargagebaobei 发表于 2018-4-4 15:26:57

主要是你需要先说清楚到底想要干嘛,我们才能帮你达到

Angel_YY 发表于 2018-4-4 15:28:46

while(BUSY == 1);
你这个BUSY编译器不认识啊,如果是调用GPIO_Pin_Set(GPIOD,PIN8,x),必须
while(BUSY(2) == 1);
这样编译器才认识BUSY是个啥东西。
函数再调用的时候不能只写函数名称,要写括号和参数的,你这里都没有,编译器怎能知道是要掉用什么,所以只能报错了。

Rareyee 发表于 2018-4-4 15:37:28

bargagebaobei 发表于 2018-4-4 15:26
主要是你需要先说清楚到底想要干嘛,我们才能帮你达到

就是判断BUSY 是否高电位

Rareyee 发表于 2018-4-4 15:37:47

Angel_YY 发表于 2018-4-4 15:28
while(BUSY == 1);
你这个BUSY编译器不认识啊,如果是调用GPIO_Pin_Set(GPIOD,PIN8,x),必须
while(BUSY(2) ...

这样写也不对呀

bargagebaobei 发表于 2018-4-4 15:42:18

我只是说一个大概啊 从名字上来说GPIO_Pin_Get(GPIOD,PIN8),这样的名字是获取状态,当然如果这个函数返回的是1或者0那么就可以放在while里循环了。
if(GPIOD->IDR&pin8)关于这个 我认为应该写成 if((GPIOD->IDR&pin8)==0x100)这样 就行了。仅代表个人意见

无薪税绵 发表于 2018-4-4 15:56:28

本帖最后由 无薪税绵 于 2018-4-4 15:58 编辑

建议,使用HAL库吧,方便。
用法:
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_8)==0)
{
   ;
}
else
{
   ;
}

如果想用宏的话,可以这样:
#define BUSY HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_8)


关于详细的 STM32使用HAL库操作GPIO ,请参考:
http://www.cnblogs.com/feipeng8848/p/7248898.html

wudianjun2001 发表于 2018-4-4 16:35:31

这个函数是写,你要找到读的函数才行
页: [1] 2
查看完整版本: STM32F7li 判断IO口状态?