首页 > 编程知识 正文

io口的四种模式(单片机寄存器切换io)

时间:2023-05-05 19:46:26 阅读:74731 作者:160

IO 配置常用的 8 个寄存器: MODER、OTYPER、OSPEEDR、PUPDR、ODR、IDR 、AFRH 和 AFRL。
MODER 寄存器(输入状态寄存器):STM32F4 最多有 9 组 IO,分别用大写字母表示,即 x=A/B/C/D/E/F/G/H/I,端口X配置位0~15。

OTYPER 寄存器,该寄存器仅用于输出模式,在输入模式(MODER[1:0]=00/11 时)下不起作用。该寄存器低 16 位有效,每一个位控制一个 IO 口,复位后,该寄存器值均为 0。

OSPEEDR 寄存器,该寄存器用于控制 GPIOx 的输出速度

PUPDR 寄存器,该寄存器用于控制 GPIOx 的上拉/下拉

STM32F1 ODR寄存器控制上下拉的,而STM32F4则由单独的寄存器PUPDR控制上下拉,使用起来更加灵活。复位后,该寄存器值一般为 0。
ODR 寄存器,该寄存器用于控制 GPIOx 的输出,该寄存器用于设置某个IO 输出低电平(ODRy=0)还是高电平(ODRy=1),该寄存器也仅在输出模式下有效,在输入模式(MODER[1:0]=00/11 时)下不起作用。
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);

IDR 寄存器,该寄存器用于读取 GPIOx 的输入。如果对应的位为 0(IDRy=0),则说明该 IO 输入的是低电平,如果是 1(IDRy=1),则表示输入的是高电平。库函数相关函数为:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

32 位置位/复位寄存器 (BSRR),这个寄存器是用来置位或者复位 IO 口,该寄存器和 ODR 寄存器具有类似的作用,都可以用来设置 GPIO 端口的输出位是1 还是 0。

对于低 16 位(0-15),我们往相应的位写 1,那么对应的 IO 口会输出高电平,往相应的位写 0,对 IO 口没有任何影响。高 16 位(16-31)作用刚好相反,对相应的位写 1 会输出低电平,写 0没有任何影响。也就是说,对于 BSRR 寄存器,你写 0 的话,对 IO 口电平是没有任何影响的。我们要设置某个 IO 口电平,只需要为相关位设置为 1 即可。而 ODR 寄存器,我们要设置某个IO 口电平,我们首先需要读出来 ODR 寄存器的值,然后对整个 ODR 寄存器重新赋值来达到设置某个或者某些 IO 口的目的,而 BSRR 寄存器,我们就不需要先读,而是直接设置。
IO 库函数操作步骤:
1) 使能 IO 口时钟。调用函数为__HAL_RCC_GPIOF_CLK_ENABLE();
2) 初始化 IO 参数。调用函数 HAL_GPIO_Init();
3) 操作 IO。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。