关于STM32的简单问题,GPIOA->BSRR=0x080004;这样写对吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于STM32的简单问题,GPIOA->BSRR=0x080004;这样写对吗?相关的知识,希望对你有一定的参考价值。

GPIOx_BSRR寄存器是32位的,但书上这样写的,才24位,这样写对吗?对的话,是不是对低24位进行设置了呢?(c语言)

“=”就是是对寄存器的32位都设置了,并不只是对24位设置。
这么写是前面省略了几个0而已,与 GPIOA->BSRR=0x00080004 是一样的。
这就好像你的十进制数写“500块”而不会写“0000000500块”一样,但两种写法又都对。
参考技术A BSRR寄存器高16bit对端口位清零,低16bit对端口位置1.
GPIOA->BSRR=0x080004实际就是GPIOA->BSRR=0x00080004,结果就是对PA3清零,PA2置1.本回答被提问者和网友采纳

STM32的寄存器控制SDA_IN()/SDA_OUT()

#define SDA_IN()  {GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=(u32)3<<28;}

 

终于碰到点儿寄存器的操作了.

上面的意思, 其实就是切换PA_7的模式, 控制模式的寄存器叫CRL跟CRH, 如下图:

CRL(引脚0-7):

技术分享

CRH(引脚8-16):

技术分享

研究了一下,

GPIOA->CRL&=0X0FFFFFFF;

GPIOA->CRL|=(u32)8<<28;

的意思 先都置0, 得0000, 然后1000B, 左移28位, 得1000, 分别是将CRL的31到28bit位置1000, 查下面的表:

技术分享

 

1000意思就是Input模式, Input pull-down/pull-up

GPIOA->CRL&=0X0FFFFFFF;

GPIOA->CRL|=(u32)3<<28;

3换成2进制是0011, 结合上面的就是00就是outpu的push-pull, 11表示速度是50MHz

 

那么, 如果要修改PA_11的配置, 就修改CRH, 移动3*4次就好,

#define SDA_IN()  {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=(u32)8<<12;}
#define SDA_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=(u32)3<<12;}

 

经验证, 成功.

 

以上是关于关于STM32的简单问题,GPIOA->BSRR=0x080004;这样写对吗?的主要内容,如果未能解决你的问题,请参考以下文章

关于STM32串口2配置问题

STM32F407单片机UART串口gpio口复用功能配置问题

STM32中怎样读取GPIOA口的高8位或低8位数据?怎样向GPIOA的高8位或低8位1次性写8位数

STM32寄存器

STM32 GPIO->ODR与IDR是干啥用的?

关于STM32F103 脉冲计数的问题