使用BRR与BSRR寄存器控制GPIO输出
对比使用ODR寄存器与BRR寄存器+BSRR寄存器
- BRR与BSRR:
Init:
RCC->APB2ENR |= 1 << 5;
GPIOD->CRL &= 0xFFFFF0FF;
GPIOD->CRL |= 0x00000300;
GPIOD->BSRR |= 1 << 2;
RCC->APB2ENR |= 1 << 2;
GPIOA->CRH &= 0xFFFFFFF0;
GPIOA->CRH |= 0x00000003;
GPIOA->BSRR |= 1 << 8;
main:
while(1)
{
GPIOD->BSRR |= 1 << 2;
GPIOA->BSRR |= 1 << 8;
delay_ms(500);
GPIOD->BRR |= 1 << 2;
GPIOA->BRR |= 1 << 8;
delay_ms(500);
}
- ODR:
Init:
RCC->APB2ENR |= 1 << 5;
GPIOD->CRL &= 0xFFFFF0FF;
GPIOD->CRL |= 0x00000300;
GPIOD->ODR |= 1 << 2;
RCC->APB2ENR |= 1 << 2;
GPIOA->CRH &= 0xFFFFFFF0;
GPIOA->CRH |= 0x00000003;
GPIOA->ODR |= 1 << 8;
main:
while(1)
{
GPIOD->ODR |= 1 << 2;
GPIOA->ODR |= 1 << 8;
delay_ms(500);
GPIOD->ODR &= ~(1 << 2);
GPIOA->ODR &= ~(1 << 8);
delay_ms(500);
}
- 二者对比,使用ODR寄存器既需要清除输出对应位,又需要设置对应位才能控制GPIO输出,需灵活使用位操作运算符。而BRR负责清除位,BSRR负责设置位,各有分工使用简洁。