请教STM32知识点:GPIOA->BSRR 与GPIOA->BRR两个管脚寄存器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教STM32知识点:GPIOA->BSRR 与GPIOA->BRR两个管脚寄存器相关的知识,希望对你有一定的参考价值。

GPIOA->BSRR = cmd & 0XFF; //GPIOA[7:0]为输出数据端口,1:设置对应的ODRy为1
GPIOA->BRR = (~cmd) & 0XFF; //GPIOA[7:0]为输出数据端口;1:设置对应的ODRy为0
是不是功能一样的语句?急急急

BSRR写1的位置1,BRR写1的位置0;这两个命令是不同的,一个用于清零,一个用于置1;这两句话等同与GPIOA->ODR = GPIOA->(ODR&0xff00)|cmd;追问

GPIOA->ODR = (GPIOA->ODR & 0xff00)| cmd;

这条语句是将GPIOA口的低8位清零后,再将cmd写入低8位?(高8位保持不变)

追答

........,那你自己想你那两句话是不是就是为了把低八位写成cmd,我也不知道你在哪看的程序,根本就是在炫耀技能,其实一点用都没。cmd & 0XFF,(~cmd) & 0XFF,都是瞎子戴眼镜多余的圈圈。

,

参考技术A 是针对同一个功能但是状态不同,BSRR是置GPIOA为高对应于一个模式,BRR清除这个模式追问

能不能只写一个呢?写代码时,两个必须同时出现吗?顺序也不变吗?
BSRR居然设置了一个模式,BRR为什么还要清除该模式呢?

追答

可能是我记错了,BSRR应该是先清除这个模式,然后置位,一般都是这么写,你直接置为用第二句也行。

追问

1、端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E)

             地址偏移:0x10 复位值:0x0000 0000

     注:对GPIOx_BSRR(x = A…E),可以分别地对各个ODR位进行独立的设置/清除。

stm32中GPIOx_BSRR和 GPIO_xBRR寄存允许对任何GPIOx进行读\更改的独立访问;

这样在读或更改之间产生的IRQ时不会发生危险。这是什么意思呀,各位帮忙理解一下,谢谢呀。

一般情况下控制控制IO口高低电平就直接控制GPIOx->ODR寄存器即可。
而控制GPIOx->BSRR和GPIOx->BRR就等于间接控制GPIOx->ODR寄存器,而且手册也说了,BSRR、BRR是只写寄存器,写1有效写0无影响,这是什么意思呢;就是对BSRR和BRR寄存器写1就是对相应的IO口电平操作,写0的话IO口电平不变,这样就达到了上面所说的:允许对任何GPIOx进行读、更改的独立访问。
比如我要让GPA0变为高电平,可以有两种做法:
1、GPIOA->ODR|=GPIO_Pin_0;
2、GPIOA->BSRR=GPIO_Pin_0;
比如我要让GPA0变为低电平,可以有两种做法:
1、GPIOA->ODR&=~GPIO_Pin_0;
2、GPIOA->BSRR=GPIO_Pin_0;
可以看到都是只改变一个IO口电平的时候,明显第2中方法要更加简单一些。
参考技术A 比如我要让GPIOA变为高电平,可以有两种做法:
1、GPIOA->ODR|=GPIO_Pin_0;
2、GPIOA->BSRR=GPIO_Pin_0;
比如我要让GPIOA变为低电平,可以有两种做法:
1、GPIOA->ODR&=~GPIO_Pin_0;
2、GPIOA->BRR=GPIO_Pin_0;
总结和纠正一下前面大佬的错别字,本人也是在学习过程中,感谢各位大佬的回答
参考技术B 需要帮你做设计吗 参考技术C 这句话出自何处/?来个完整的看看追问

完整的就是上面加下面的话,因为上面有字数限定,这句话来自刘凯stm32视频GPIO的手册,不太明白,帮忙看一下怎样理解,谢了

追答

就当他放屁了吧,我从来没遇到过什么危险的事情一直用32呢,我进行io口操作的时候来中断的话cpu也会保护现场的

以上是关于请教STM32知识点:GPIOA->BSRR 与GPIOA->BRR两个管脚寄存器的主要内容,如果未能解决你的问题,请参考以下文章

PA1=GPIOA->BSRR PA1=0x01 问题: PA1是一个引脚,为啥能把0x01赋给一个引脚,引脚不是一位的吗?

c语言中GPIOA->BSRR=1<<9啥意思

关于STM32 GPIO->BSRR GPIO->BRR的问题

stm32端口复用与重映射

stm32中GPIOB->BSRR这句话是啥意思?是否跟GPIOB.BSRR意思一样?一定采纳

stm32中“GPIOB->BSRR”这句话是啥意思?