GPIO_ReadInputDataBit()函数返回值的问题

will_24 2015-11-03 03:05:39
想用GPIO的输入值做判断, 但是GPIO不是连续的,无法直接用 ReadInputData(GPIOx); 只能单独GPIO_ReadInputDataBit(), 我想知道这个函数的返回值是什么啊? 是0或1么? 我想用8个IO口读取的数据组成一个8位二进制数,需要 a<<! | b<<2 | c<<3 d<<4 ... 这样的移位操作么? a,b,c,d ...为readinputdatabit的返回值。 我这样的理解错了没? 如果用
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2) 那这样的返回值又是什么啊?
求告知
...全文
12114 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
icemantf 2019-05-28
  • 打赏
  • 举报
回复 2
查看GPIO_ReadInputDataBit函数的定义(可以通过双击该函数后右键“go to definition of XXXX”),可以看到其返回值是Bit_SET或者Bit_REST,再去找Bit_SET的定义,发现其为枚举型变量:
typedef enum
{ Bit_RESET = 0,
Bit_SET
}BitAction;
枚举型变量的定义是0,1,2,3,4,。。。。这样依次递增的整数,所以,Bit_REST=0,Bit_SET=1。
  • 打赏
  • 举报
回复
根据固件代码库,返回的为0 或 1.
pathletboy 2015-11-08
  • 打赏
  • 举报
回复 10
这种问题直接看固件库代码就可以解决。
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;
}

如果传入 GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 这个参数,那么只要其中一个io口为高,则返回Bit_SET,否则返回Bit_RESET
worldy 2015-11-03
  • 打赏
  • 举报
回复
GPIO_ReadInputDataBit(),望文生义,应该是返回0或者1,具体得看文档,你当然可以逐个位读,然后按照权值合成一个8位的数据 byte b=a | (b<<1) | (c<<2)| (d<<4 )..... 每个部分括号起来,以避免编译歧义.
STM32调试报告 1、头文件 初始化相应的函数,同时最好将相应的引脚进行宏定义,方便后面写主函数时方面。 2、 c函数 c函数要将相应的头文件包括进去,同时初始化相应头文件里面的自己定义的函数。对相应的函数进行编写,包括引入结构体,时钟初始化,选择相应的引脚、引脚输入输出模式、如果是输出需要设置输出速度。 3、 main函数 4、 GPIO端口七个寄存器 两个32位配置寄存器GPIO_CRL AND GPIO_CRH. TWO 32bit dateregister GPIO_IDR AND DPIO_ODR 一个32位置位/复位寄存器GPIO_BSRR 一个16位复位寄存器GPIO_BRR 一个32位锁存寄存器GPIO_LCKR GPIO_CRL寄存器的复位值为 0X4444 4444,从图 6.1.4 可以看到,复位值其实就是配置端口为浮空 输入模式。从上图还可以得出:STM32 的 CRL 控制着每组 IO 端口(A~G)的低 8 位的模式。 每个 IO 端口的位占用 CRL 的 4 个位,高两位为 CNF,低两位为 MODE。这里我们可以记住几 个常用的配置,比如 0X0 表示模拟输入模式(ADC 用)、0X3 表示推挽输出模式(做输出口用, 50M 速率)、0X8 表示上/下拉输入模式(做输入口用)、0XB 表示复用输出(使用 IO 口的第二 功能,50M 速率)。 在固件库中操作 IDR 寄存器读取 IO 端口数据是通过 GPIO_ReadInputDataBit 函数实现的: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 比如我要读 GPIOA.5 的电平状态,那么方法是: GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5); 返回值是 1(Bit_SET)或者 0(Bit_RESET); 在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现 的: void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); GPIO_WriteBit(GPIOR,GPIO_Pin_0,(BitAction)(1));//LED控制 位操作使用ODR AND IDP寄存器 在使用寄存器BSRR 和寄存器BRR时,使用规则总结如下: 1、置GPIOD->BSRR低16位的某位为’1’,则对应的I/O端口置’1’;而置GPIOD->BSRR低16位的某位为’0’,则对应的I/O端口不变。 2、置GPIOD->BSRR高16位的某位为’1’,则对应的I/O端口置’0’;而置GPIOD->BSRR高16位的某位为’0’,则对应的I/O端口不变。 3、置GPIOD->BRR低16位的某位为’1’,则对应的I/O端口置’0’;而置GPIOD->BRR低16位的某位为’0’,则对应的I/O端口不变。 使用场合举例如下: 1)要设置D0、D5、D10、D11为高,而保持其它I/O口不变,只需一行语句: GPIOD->BSRR = 0x0C21;// 使用规则1 2)要设置D1、D3、D14、D15为低,而保持其它I/O口不变,只需一行语句: GPIOD->BRR = 0xC00A;// 使用规则三 3)要同时设置D0、D5、D10、D11为高,设置D1、D3、D14、D15为低,而保持其它I/O口不变,也只需一行语句: GPIOD->BSRR = 0xC00A0C21;// 使用规则一和规则二 实例3 假设需要对 GPIOA_Pin_6 输出高电平。采用改写 ODR 寄存器的方式时,使用“读-改-写”操作,代码如下: uint32_t temp; temp = GPIOA->ODR; temp = temp | GPIO_Pin_4; GPIOA->ODR = temp; 而使用改写 BSRR 寄存器时,仅需要使用如下语句: GPIOA->BSRR = GPIO_Pin_6; 在修改 ODR 时,为了确保对端口 6 的修改不会影响到其他端口的输出,需要对端口的原始数据进行保存,之后再对端口 6 的值进行修改,最后再写入寄存器(即读-改-写形式改变位的状态)。而对 BSRR 的操作,是写 1 有效,写 0 不改变原状态,因此可以对端口 6 置 1,其他位保持为 0。BSRR 为 1 的位,会修改相应的 ODR 位,从而控制输出电平。 因此,在设置单个 IO 口输出时,使用 BSRR 进行操作会更加方便。 在固件库中操作 IDR 寄存器

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧