stm32的这两个寄存器有冲突吗

 我来答
774051719a
2014-12-24 · TA获得超过1231个赞
知道小有建树答主
回答量:113
采纳率:100%
帮助的人:149万
展开全部
你指的冲突是他们的地址冲突还是同时使用发生冲突?

他们是没有冲突的,简单的你可以这么理解:对GPIOx_BSRR和GPIOx_BRR寄存器的操作就等同于对GPIOx_ODR寄存器进行操作。
GPIOx_BRR是16位复位寄存器,GPIOx_BSRR是32位置为/复位寄存器,对于GPIOx_BSRR寄存器我们一般只用它的置位功能,就算要用它的复位功能也不会和BRR寄存器冲突。
比如下面的代码:
GPIOA->BRR = GPIO_Pin_0|GPIO_Pin_1;
GPIOA->BSRR = GPIO_Pin0|GPIO_Pin_1;
就等同于下面的代码:
GPIOA->ODR &= ~(GPIO_Pin_0|GPIO_Pin_1);
GPIOA->ODR |= (GPIO_Pin_0|GPIO_Pin_1);
并不会发生什么冲突。
追问
我只是感觉他们功能上有重复,BSRR一个不就可以搞定置位复位吗?
“GPIOA->BSRR = GPIO_Pin0|GPIO_Pin_1;
”这句能看出来是把0 1脚置位还是复位吗?还有->这个符号的使用是怎么样的是不是和他相似的是".",我用库写的,寄存器还不会操作
追答
GPIOA->BSRR = GPIO_Pin0|GPIO_Pin_1;是把0 、1脚置位。

文档上面的意思可以这么理解:GPIOx_BSRR是32位寄存器,这个寄存器的高16位搞定复位功能,低16位搞定置位功能。但我们从习惯上(注意:是习惯上不是必须)会只用这个寄存器的置位功能,这样的话就能把IO口的置位和复位功能分摊到BSRR和BRR两个寄存器中来,在编程时候就能让你很清晰,但是你非得只只用BSRR一个去搞定置位和复位,那我也不能去说什么。
学习过C语言应该只要"->"是结构体指针的用法,也就是说这个GPIOA这是个结构体指针变量,它在系统中已经定义好了并且指向A组IO口相关寄存器空间;用“.”这个符号是对应结构体的实体来使用,比如:
GPIO_InitTypeDef temp; //temp是结构体
GPIO_InitTypeDef *p = &temp; //p是结构体指针,并令它指向temp这个结构体实体的地址
temp.GPIO_Pin =GPIO_Pin_0; //结构体实体变量赋值,结果和下面的等效
p->GPIO_Pin = GPIO_Pin_0; //指针指向结构体实体变量赋值,结果和上面的等效
如果对于结构体和指针方面你还有点模糊的话最好是去恶补一下C语言。STM32与51单片机的编程相比,C语言的知识量可不再一个级别上。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式