文章目录
- 1 背景
- 2 GPIO寄存器的类型
- 2.1 端口配置寄存器
- 2.2 设置/清除寄存器和位清除寄存器
- 3 总结
1 背景
C51单片机在进行数据的输入输出时,是直接操作与外部引脚关联的内部寄存器,例如,当设置P2_1为0时,就是将外部引脚的P21引脚设置为低电平,当读取P2_1时,就是读取P21的电平。与之类似,stm32芯片内部也有很多用于输入输出的寄存器,这些寄存器也是用于操作外部引脚,但是比C51单片机复杂很多。
2 GPIO寄存器的类型
stm32的GPIO口以16位为一组,按照字母顺序分为PA、PB、PC等,PA包含PA0~PA15。
每组GPIO口需要通过多个寄存器进行读写操作:
- CRL、CRH:端口配置低寄存器和端口配置高寄存器
- IDR:输入数据寄存器
- ODR:输出数据寄存器
- BSRR:设置/清除寄存器
- BRR:位清除寄存器
- LCKR:锁定寄存器
2.1 端口配置寄存器
端口配置寄存器用于配置端口的模式,每个端口使用4位进行描述,总共需要64位,于是就用两个32位寄存器存储。
例如,对于GPIOA口,使用GPIOA_CRL和GPIOA_CRH两个32位寄存器进行模式的配置,其中PA0口使用GPIOA_CRL的低4位进行模式的设置,PA1使用GPIOA_CRL的从低到高的第4位到第7位(最低位索引为0)进行模式的设置,剩余端口依次类推。
4位配置的值以及含义:
当MODE1和MODE0都为0时,表示输入模式,然后根据CNF1和CNF0区分4种输入模式,否则,就是输出模式,然后根据CNF1和CNF0区分4种输出模式,并且,在输出模式下,MODE1和MODE0还可以表示输出速率。
输入数据寄存器和输出数据寄存器的含义比较明显:输入数据寄存器就是外部引脚通过内部电路转换为0和1后保存到寄存器中,输出数据寄存器则是通过内部电路转换到外部引脚的高低电平,不过两个寄存器都是32位,而外部引脚则是16个一组,因此,两个寄存器都只使用低16位。
2.2 设置/清除寄存器和位清除寄存器
输出数据寄存器只能对整个32位进行操作,如果希望对单个位进行操作(否则,就需要先读取GPIO组的数据,然修改后再整体设置),设置/清除寄存器用于对单个位进行操作。
设置/清除寄存器是32位,高16位是清除位,低16位是设置位,分别对应GPIO组的某个位。例如,GPIOA对应的设置/清除寄存器是GPIOA_BSRR,GPIOA_BSRR的高16位(31位到16位)为清除位,如果索引为20的位设置为1,则将PA4设置为0,如果索引为20的位设置为0,则无效果,同理,GPIOA_BSRR的低16位(15位到0位)为设置位,如果索引为5的位设置为1,则将PA5设置为1,如果索引为5的位设置为0,则无效果。如果针对某一位,同时设置了设置和清除,则设置位生效。
有时候,可能只需要进行清除,可以使用位清除寄存器,也叫做复位寄存器,可以将某些位设置为0。
位清除寄存器是32位,只使用低16位,如果某一位设置为1,则将对应位的输出数据寄存器的值设置为0。例如,GPIOA对应的位清除寄存器是GPIOA_BRR,如果GPIOA_BRR的索引为6的位设置为1,则将PA6设置为0,其他位无变化。
3 总结
外部引脚以16位为一组,内部的数据寄存器都是32位,为了对端口进行配置并方便的进行数据的输入输出,在提供基本的输入输出寄存器的同时,还提供了端口配置寄存器和设置/清除寄存器,能够配置寄存器的模式,并且能够方便的操作单个位。
从开发编程的角度上看,数据寄存器都是只能整体操作,而不能单个位操作,因此,如果是直接操作数据寄存器的话,就需要先读取再设置,操作起来比较麻烦,有了设置/清除寄存器,可以方便的操作单个位,而不影响其他位。而在C51单片机中,数据寄存器是可以位寻址的,可以直接对某一位进行与或的操作。