正点原子战舰v3笔记(0)GPIO寄存器配置介绍
GPIOA 下有十六个 口 从pa0----pa15
每组GPIO口都有7个寄存器
如果你的设备有 7 组GPIO口 , 那么寄存器就有, 7 * 7 = 49个寄存器,
比如:GPIOA 有16个GPIO 那就是由这7个寄存器进行控制
GPIOx_CRL : 端口配置低寄存器 (模式配置) 配置 0–7 IO口的模式和速度
GPIOx_CRH : 端口配置高寄存器 (模式配置) 配置 8–15 IO口的模式和速度
为什么需要两组呢 ? 因为是32位的寄存器 ,一共只有32个位 ,但是我们配置每一个IO口, 32个位配置 16个io口, 每个IO口配置需要4个位 , 32 /4 = 8 一共寄存器最多控制8个,但是我们有16个口, 所以说 需要两个寄存器来控制 , 64位 / 4 =16 . GPIOx_CRL 控制 低位 8个, 0—7. GPIOx_CRH控制高位 8个, 8—15 .
每个IO口 由4个位来控制, 每一位分成两半 , 一半用来配置输入输出模式和速度, 一半用来配置到底是哪个模式, 低寄存器和高寄存器是一样的.
GPIOx_IDR : 端口输入数据寄存器 (控制IO口输出高低电频)
因为每一组IO 只有16个io口, 所以这个寄存器只用到 16位, 0—15 后面16位不用,是无效的,
第0位 对应 pa0 … 我们把这个位的值读出来 是0的话说明我们这个pa0输入是低电频, 1的话代表pa0输入的是高电频,
GPIOx_ODR : 端口输出数据寄存器
第0位 对应 pa0 … 我们往相应的位设置为 1的话 那么这个IO口就输出为高电频, 如果我们设置为 0的话那么这个IO 口输出为低电频,跟输入数据寄存器是对应的, 后16无效保留,还可以用来配置输入模式下的上拉还是下拉, 也就是说我们 把GPIOx_CRL 或 GPIOx_CRH配置成输入模式下, 如果我们模式配置为 10上拉/下拉输入模式, ,那到底是上拉还是下拉,那么我们可以通过这个ODR寄存器来配置,
我们以GPIOA_0为例,我们配置为 10 00 也就是输入模式的 上拉/下拉输入模式,到底是上拉还是下拉, 我们去配置GPIOA的ODR寄存器, pa0就对应的 ODR 第0位, 把他配置为0的话就是下拉, 如果配置为1的话就是上拉,
也就是说在输入模式下也可以配置上拉或者下拉, 对于输出模式下就是配置输出的电频
GPIOx_BSRR : 端口位设置/清除寄存器
也是用来配置IO口的输出高电频或者 低电频, 它是一个32位的寄存器, 低16位是用来设置端口对应的位, 如果设置为1的话,对应的io口就输出为高电频, 如果设置为0的话就不产生任何影响, , 实际上它是最终来控制ODR寄存器的,
以开漏为例: 我们CPU写寄存器的时候我们可以先写 这个 位设置/清除寄存器, 通过它来达到设置输出寄存器的目的ODR 最终是用来设置ODR, 直接设置ODR 达到间接设置ODR的内容
这样有什么好处呢 ?
BSRR寄存器, 我们要设置某一个io口,比如 pa0高电频, 我们只要设置它为1 ,把其他的设置为0 ,就可以直接达到, pa0设置为1 其他的不变,其他为都设置为0是不受影响的, ,
但是ODR寄存器是实实在在的, 如果你把它 pa0设置为1 ,输出高电频, 其他位设置为0 那么其他位也是会输出低电频的. 但是BSRR是设置为0的话是不影响的,
这有什么好处呢 ?
在实时系统里面我们的ODR 寄存器经常要,我们要先把ODR里得值,读取进来取分析它,然后再去把它赋一个值, 然后再写入到ODR寄存器,达到设置IO电频的目的, 因为我们经常的话只设置某一部分的IO ,还有IO 口不变,所以对ODR寄存器我们需要这样一个过程,
那么对于BSRR寄存器操作就非常简单了,如果要设置为高电频, 我们只需要设置对应的位为1 其他位 为0, 这样就达到 了, 只设置对应的位的这个IO口, 一次就能达到这样的目的, 不会像ODR寄存器要先读入,分析,再去写, 因为对BSRR寄存器的话,它这个
BSRR高位是用来设置清除ODR寄存器 , 1 为清除输出低电频, 0 为不影响, 正好和低位相反
GPIOx_BRR : 端口位清除寄存器
跟BSRR高位是一样的, 我们用的时候 经常只用BSRR的低16位, 然后再用BRR的它的低16位,
对于F4芯片的话, 它就只有一个BSRR寄存器.