用STM32 的装备GPIO 来操控LED 显现状况,可用ODR,BSRR,BRR 直接来操控引脚输出状况。
ODR寄存器可读可写:既能操控管脚为高电平,也能操控管脚为低电平。
管脚关于位写1 gpio 管脚为高电平,写 0 为低电平
BSRR 只写寄存器:[color=Red]既能操控管脚为高电平,也能操控管脚为低电平。
对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。写 0 ,无动作
BRR 只写寄存器:只能改动管脚状况为低电平,对寄存器 管脚关于位写 1 相应管脚会为低电平。写 0 无动作。
刚开始或许你跟我相同有以下疑问:
1.已然ODR 能操控管脚凹凸电平为什么还需求BSRR和SRR寄存器?
2.已然BSRR能完成BRR的悉数功用,为什么还需求SRR寄存器?
关于问题 1 —— 意法半导体给的答案是—
“This way, there is no risk that an IRQ occurs between the read and the modify access.”
什么意思呢?就便是你用BSRR和BRR去改动管脚状况的时分,没有被中止打断的危险。也就不需求封闭中止。
用ODR操作GPIO的伪代码如下:
disable_irq()
save_gpio_pin_sate = read_gpio_pin_state();
save_gpio_pin_sate = xxxx;
chang_gpio_pin_state(save_gpio_pin_sate);
enable_irq();
封闭中止显着会推迟或丢掉一事情的捕获,所以操控GPIO的状况最好仍是用SBRR和BRR
关于问题 2 ——- 个人经历判别意法半导体只是是为了程序员操作便利估量做么做的。
由于BSRR的 低 16bsts 恰好是set操作,而高16bit是 reset 操作 而BRR 低 16bits 是reset 操作。
简略地说GPIOx_BSRR的高16位称作铲除寄存器,而GPIOx_BSRR的低16位称作设置寄存器。
另一个寄存器GPIOx_BRR只需低16位有用,与GPIOx_BSRR的高16位具有相同功用。
举个比如阐明怎么运用这两个寄存器和所表现的优势。
例如GPIOE的16个IO都被设置成输出,而每次操作仅需求
改动低8位的数据而坚持高8位不变,假定新的8位数据在变量Newdata中,
这个要求能够经过操作这两个寄存器完成,STM32的固件库中有两个函数
GPIO_SetBits()和GPIO_ResetBits()运用了这两个寄存器操作端口。
上述要求能够这样完成:
GPIO_SetBits(GPIOE, Newdata & 0xff);
GPIO_ResetBits(GPIOE, (~Newdata & 0xff));
也能够直接操作这两个寄存器:
GPIOE-》BSRR = Newdata & 0xff;
GPIOE-》BRR = ~Newdata & 0xff;
当然还能够一次完成对8位的操作:
GPIOE-》BSRR = (Newdata & 0xff) | ( (~Newdata & 0xff)《《16 );
当然还能够一次完成对16位的操作:
GPIOE-》BSRR = (Newdata & 0xffff) | ( (~Newdata )《《16 );
从最终这个操作能够看出运用BSRR寄存器,能够完成8个端口位的一起修正操作。
有人问是否BSRR的高16位是剩余的,请看下面这个比如:
假设你想在一个操作中对GPIOE的位7置‘1’,位6置‘0’,则运用BSRR十分便利:
GPIOE-》BSRR = 0x400080;
假如没有BSRR的高16位,则要分2次操作,成果形成位7和位6的改变不同步!
GPIOE-》BSRR = 0x80;
GPIOE-》BRR = 0x40;
BSRR还有一个特色,便是Set比Reset的等级高,
便是说同一个bit又做Set又做Reset,最终成果是Set
要同步改变只需简略的 GPIOx-》BSRR = 0xFFFF0000 | PATTEN;
即可,不必考虑哪些需求置1,哪些需求清零
从最终这个操作能够看出运用BSRR寄存器,能够完成8个端口位的一起修正操作。