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;

寄存器的封装

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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值