STM32入门——寄存器与GPIO

寄存器与GPIO的关系

相信大家都是从GPIO过来的,截止到这里大家对寄存器的印象就是,每个IO口都是由7个寄存器来控制,有什么CRL,CRH,IDR,ODR,BRR,BSRR,LCKR。在这里不会对每个寄存器的功能进行介绍,而是帮助大家去理解GPIO和寄存器的关系,同时该如何去查看参考手册。
首先,大家把GPIO和单片机的PA0之类的引脚不要混淆,GPIO是通用输入输出端口,是一种总称。它包含有GPIOA,GPIOB等等这些GPIO端口组,在GPIOA里,又有PA0~PA15这十六个端口。用一张通俗的图来理解GPIO与PXx引脚还有寄存器的关系就是这样:
在这里插入图片描述
通俗的理解就是,我么可以通过控制寄存器,来控制相应的IO口,并且寄存器的操作位和IO口是具有着唯一对应关系的,举个例子就是,CRL寄存器有32位,每4位控制一个端口的出入输出状态,那么CRL就可以控制8个IO口的输入输出状态,那我们有PA0—PA15一共16个IO怎么办呢?再加一个一摸一样的寄存器CRH就完了,一个控制0-7,一个控制8-15。
对于IDR和ODR数据寄存器来说,他们也是32位的,低16位有效,也就是说每一位就正好对应一个IO口。剩下的BRR,BSRR,LCKR也是如此的。

总而言之就是一个GPIOx组有七个寄存器控制16个IO口。

如何操作寄存器去控制某一个IO口?

方法一:通过绝对地址访问内存单元
*unsigned int*)(0x40010C0C= 0xFFFF

这段代码实现的功能是通过指针对GPIOB的ODR寄存器进行操作,使其全部输出高电平,也就是全部赋值为1.
那么如何找到GPIOB的ODR地址呢?首先GPIO是挂载到APB总线的APB2上的,APB2的总线基地址为0x40010000,GPIOB相对APB2的偏移地址为0x0C00,GPIOB_ODR相对于GPIOB的偏移为0x0C。
将偏移量相加,就算出0x40010C0C就是GPIOB的ODR寄存器地址。
这里的0xFFFF在我看来展开为二进制数可能更好理解:1111 1111 1111 1111
相信到这里,大家已经能很直观的理解如何通过绝对地址访问内存单元了。

方法二:通过寄存器别名方式访问内存单元

通过绝对地址访问是为了帮助大家理解单片机的工作方式,正常开发的时候,基本上都是通过操作寄存器别名来对寄存器进行操作,其思想就是根据每块内存单元所具有功能的不同,给这些地址去取一个别名,这个过程也叫作寄存器映射。通过操作寄存器来控制IO端口,显然更加直接,也更加方便。

// 通过操作寄存器别名让GPIOB所有端口全部输出高电平
#define GPIO_ODR			*(unsigned int*)(GPIO_BASE + 0x0C)

GPIO_ODR = 0xFFFF;

寄存器的封装

总而言之,为了方便大家的操作,我们一般都会对寄存器进行封装,那么寄存器有这么多,寄存器之外还有很多外设,如果我们每次都是一个一个对应的去设

### 单片机中寄存器GPIO关系 在单片机系统中,寄存器GPIO(通用输入/输出)之间存在紧密联系。STM32单片机的IO结构设计使得可以通过配置特定寄存器来改变GPIO的功能状态[^1]。 #### GPIO的工作原理 GPIO作为一种电路,能够实现数据的输入输出功能。这些电路集成到芯片引脚上,并可通过编程设定其工作模式以及电压水平等特性。这意味着开发者可以根据需求灵活调整每个引脚的行为,比如将其设为推挽输出、开漏输出或是模拟输入等功能之一[^4]。 #### 寄存器的作用 寄存器则是用于保存临时数据或指令的一类特殊硬件组件,在这里特指那些负责管理GPIO行为的相关寄存器。通过对这些寄存器写入不同的值,可以直接影响相应GPIO的状态——例如设置某个引脚为高电平还是低电平,或者是选择该引脚应该处于何种工作模式下运作。 具体来说: - **BSRR (Bit Set/Reset Register)**:此寄存器允许单独置位或复位指定位置上的比特位而不必读取整个端的状态再做修改。如`GPIOB->BSRRL = 1<<3;`这条语句表示将PB3引脚拉低[^2]。 - **ODR (Output Data Register)**:当需要一次性更新多个引脚时,则可利用ODR寄存器来进行批量操作。例如定义宏定义`#define GPIO_ODR *(volatile unsigned int*)(GPIO_BASE + 0x0C)`之后执行`GPIO_ODR = 0xFFFF;`可以让GPIOB所有端都变为高电平输出[^3]。 综上所述,通过编写程序向相应的寄存器发送命令,即可精确地控制各个GPIO引脚的动作,从而达到对外部设备(像LED灯这样的简单外设)的有效操控目的。 ```c // 设置 PB3 输出低电平的例子 GPIOB->BSRRL = 1 << 3; ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值