STM32 GPIO->ODR与IDR是干啥用的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 GPIO->ODR与IDR是干啥用的?相关的知识,希望对你有一定的参考价值。

CC->APB2ENR|=1<<2;
GPIOA->CRL&=0XFFF0FFFF;
GPIOA->CRL|=0x00030000;
GPIOA->ODR|=1>>4; 这样写是不是把STM32 的PA5置高电平? 我把LED 负极接PA5 居然能点亮?

IDR是查看引脚电平状态用的寄存器,ODR是引脚电平输出的寄存器。1>>4:1右移4位为0,
所以,你这句 GPIOA->ODR|=1>>4 是没用的。1<<4:1左移4位为0x10,所以GPIOA->ODR|=1<<4 拉高的是PA4。你说能点亮,是因为它们默认就是高的。

扩展:

1、STM32是基于ARM® Cortex® M 处理器内核的 32位闪存微控制器,为MCU用户开辟了一个全新的自由开发空间,并提供了各种易于上手的软硬件辅助工具。STM32 MCU融高性能、实时性、数字信号处理、低功耗、低电压于一身,同时保持高集成度和开发简易的特点。业内最强大的产品阵容,基于工业标准的处理器,大量的软硬件开发工具,让STM32单片机成为各类中小项目和完整平台解决方案的理想选择。按内核架构分为不同产品系列。

2、CSingleDocTemplate类定义了一个文档模板用于实现单文档界面(SDI)。一个SDI应用程序使用主框架窗口来显示一个文档;一次只能打开一个文档。IDR_MAINFRAME是CSingleDocTemplate的一个重要参数。

参考技术A

IDR是查看引脚电平状态用的寄存器。

ODR是引脚电平输出的寄存器。

1>>4:1右移4位为0,
所以,你这句 GPIOA->ODR|=1>>4 是没用的。

1<<4:1左移4位为0x10,
所以GPIOA->ODR|=1<<4 拉高的是PA4。

所以你链接PA5能点亮。


stm32读GPIOx_ODR问题求解

请问
1:既然有GPIOx_IDR,那读GPIOx_ODR有啥作用呢?
2:GPIOx配置成输入,设置GPIOx_ODR有啥作用呢?
3:GPIOx配置成输出,那读GPIOx_IDR有啥作用呢?

GPIOx_IDR是端口的输入数据寄存器,GPIOx_ODR是端口的输出寄存器,我们配置引脚的输入输出模式是通过GPIOx_CRL和GPIOx_CRH两个寄存器来配置的,但是每个端口的16个引脚它们有的可能是输出模式,有的是输入模式,甚至一会输出一会输入,而GPIOx_IDR和GPIOx_ODR两个寄存器是以word模式访问而不能以bit模式访问,GPIOx_IDR只能读,而GPIOx_ODR可以读写。你也可以试想一下,如果输入输出公用一个寄存器,你读出的数据到底应该是输入的数据呢还是输出的数据呢?这样MCU将无法判别。追问

2:GPIOx配置成输入,设置GPIOx_ODR有啥作用呢?
3:GPIOx配置成输出,那读GPIOx_IDR有啥作用呢?

追答

2.跟你配置的输入模式有关,如果是analog input或者input floating模式,那么与GPIOx_ODR无关,如果配置成pull-down模式,则应将GPIOx_ODR各位都设置0,如果是pull-up模式,则有设置成1。详见参考手册8.1节的Table 17及8.1.7 Input configuration一节
3.在开漏open-drain模式下,通过读GPIOx_IDR来获取IO状态。详见参考手册8.1.8 output configuration一节

参考技术A 应为标准的输入输出是分开的,输入的时候输出无效,输出的时候输入无效,如果你想输入,那么输出必须为高或者高阻,不能为低,因为一般低电平可以把高电平拉低,就像51上面是准双向IO,但是输入的时候必须先输出高,(一般有编译器完成).
说白了就是输入输出是分开的,需要切换.

以上是关于STM32 GPIO->ODR与IDR是干啥用的?的主要内容,如果未能解决你的问题,请参考以下文章

STM32语句:GPIO->ODR^=0X02 是怎么执行的?实现啥功能?

stm32读GPIOx_ODR问题求解

STM32GPIO配置为输出和输入捕获怎么配置(HAL库)?

stm32寄存器版学习笔记01 GPIO口的配置(LED按键)

STM32F103X datasheet学习笔记---GPIOs and AFIOs

stm32 IDR寄存器软件仿真的BUG