一般的寄存器访问需要通过读-改-写三步曲 和 位运算的清0置1来实现,但在stm32的编程中,通过利用它的一些优秀的特性如端口位设置/复位寄存BSRR、位绑定等,我们可以大大提升寄存器的访问速度和简化寄存器的操作。
1 | //一般寄存器操作: |
BSRR/BRR寄存器
1 | GPIOx->BSRR //对BSRR的低16位写1置位,对BSRR的高16位写1清零 |
由此可见,通过BSRR/BRR寄存器来操作ODR寄存器, 不需要 读-改-写三步曲, 仅通过 写 就可一步到位,方便不少。
位绑定
当然了,stm32还有一个更牛X的特性–位绑定,仅仅只要1个时钟周期就能实现单独的位操作。位绑定,是通过简单的地址变换将寄存器中的某一个位映射到内存中的某一个存储单元。这样通过对一个内存单元的读写就能间接访问相应寄存器的某个位了,当然此时该32位的内存单元也只有最低位是有效的啦!
1 | 但是整个M3内核并没有全部允许位绑定,只有两个区有,分别是 |
下面就可以通过位绑定来快速实现位操作
1 | #define GPIOA_ODR_ADDR (GPIOA_BASE + 0x0C) |
这样就实现了类似51单片机访问I/O的操作方式
1 | sbit P10 = P1^0 |
Pretty cool, huh!