qrskf 发表于 2020-10-3 10:00:06

stm32循环读取8个io口状态

救助:stm32的8个GPIO端口连接一个8位拨码开关,作为组网从机地址选择,怎么读取拨码开关状态,8个IO口不在一个GPIO组里面,在GPIOA GPIOB两个组里面,有参考案例代码,谢谢!

hujjj 发表于 2020-10-3 10:20:36

逐个读取引脚的电平高低,然后组成您需要的数据。

stm1024 发表于 2020-10-4 22:10:23

那就把GA,GB都读出来,然后提取对应bit位啊,基本的位操作

小歆-2051663 发表于 2020-10-9 12:26:30

我一般会定义一个联合体+结构体的变量,例如:
union {
uint8 Byte;
struct {
    uint8_t   bit0:1;
    uint8_t   bit1:1;
    uint8_t   bit2:1;
    uint8_t   bit3:1;
    uint8_t   bit4:1;
    uint8_t   bit5:1;
    uint8_t   bit6:1;
    uint8_t   bit7:1;
} Bits;
    } Address;

读取IO并赋值变量这样写:
Address.Bits.bit0 = HAL_GPIO_ReadPin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);
    Address.Bits.bit1 = HAL_GPIO_ReadPin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);
    Address.Bits.bit2 = HAL_GPIO_ReadPin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);
    Address.Bits.bit3 = HAL_GPIO_ReadPin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);
    Address.Bits.bit4 = HAL_GPIO_ReadPin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);
    Address.Bits.bit5 = HAL_GPIO_ReadPin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);
    Address.Bits.bit6 = HAL_GPIO_ReadPin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);
    Address.Bits.bit7 = HAL_GPIO_ReadPin(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);

最后使用的时候这样写:
uint8_t tmp = Address.Byte;


butterflyspring 发表于 2020-10-10 11:35:10

读拨码开关一般不追求速度,用什么方法都能读出来。用库函数读就行。大家说的方法都可以实现的:)
页: [1]
查看完整版本: stm32循环读取8个io口状态