关于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;这样写对吗?的主要内容,如果未能解决你的问题,请参考以下文章
STM32F407单片机UART串口gpio口复用功能配置问题