STM32 GPIO寄存器ODR BSRR BRR
比如希望快速地对GPIOE的位7进行翻转,则可以:
GPIOE->BSRR = 0x80; // 置1
GPIOE->BRR = 0x80; // 置0
如果使用常规读-改-写的方法:
GPIOE->ODR = GPIOE->ODR | 0x80; // 置1
GPIOE->ODR = GPIOE->ODR & 0xFF7F; // 置0
有人问是否BSRR的高16位是多余的,请看下面这个例子:
假如你想在一个操作中对GPIOE的位7置1,位6置0,则使用BSRR非常方便:
GPIOE->BSRR = 0x00400080;
如果没有BSRR的高16位,则要分2次操作,结果造成位7和位6的变化不同步!
GPIOE->BSRR = 0x80;
GPIOE->BRR = 0x40;
规则:
一、置GPIOD->BSRR低16位的某位为1,则对应的I/O端口置1;而置GPIOD->BSRR低16位
的某位为0,则对应的I/O端口不变。
二、置GPIOD->BSRR高16位的某位为1,则对应的I/O端口置0;而置GPIOD->BSRR高16位
的某位为0,则对应的I/O端口不变。
三、置GPIOD->BRR低16位的某位为1,则对应的I/O端口置0;而置GPIOD->BRR低16位的
某位为0,则对应的I/O端口不变。
例如:
1)要设置D0、D5、D10、D11为高,而保持其它I/O口不变,只需一行语句:
GPIOD->BSRR = 0x0C21;// 使用规则一
2)要设置D1、D3、D14、D15为低,而保持其它I/O口不变,只需一行语句:
GPIOD->BRR = 0xC00A;// 使用规则三
3)要同时设置D0、D5、D10、D11为高,设置D1、D3、D14、D15为低,而保持其它I/O口不变
,也只需一行语句:
GPIOD->BSRR = 0xC00A0C21;// 使用规则一和规则二
如果中断中要对IO口设置,最好使用BSRR和BRR操作,而不要用ODR .
STM32GPIO寄存器ODRBSRRBR 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)