历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2018年08月26日 | STM32 BSRR BRR ODR 寄存器解析

发布者:mlgb999 来源: eefocus关键字:STM32  BSRR  BRR  ODR  寄存器 手机看文章 扫描二维码
随时随地手机看文章

一、用法


经常会看到类似如下的宏定义语句,用于对已经初始化后的 IO 口输出高、低电平


#define SET_BL_HIGH()           GPIOA->BSRR=GPIO_Pin_0 

#define SET_BL_LOW()            GPIOA->BRR=GPIO_Pin_0


其作用类似于如下两个库函数,


void GPIO_SetBits(GPIO_Typedef* GPIOx, uint16_t GPIO_Pin)

void GPIO_ResetBits(GPIO_Typedef* GPIOx, uint16_t GPIO_Pin)  


而且实际上这两个库函数就是通过修改BSRR,BRR寄存器的值来实现对 IO 口设置的。如下便是输出高电平的函数体:


void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN(GPIO_Pin));


  GPIOx->BSRR = GPIO_Pin;

}


因此,使用宏或者库函数本质上都是一样的。区别在于使用宏更快,而使用函数更灵活。


二、解释


BSRR 和 BRR 都是 STM32 系列 MCU 中 GPIO 的寄存器。 BSRR 称为端口位设置/清楚寄存器,BRR称为端口位清除寄存器。


BSRR 低 16 位用于设置 GPIO 口对应位输出高电平,高 16 位用于设置 GPIO 口对应位输出低电平。


BRR 低 16 位用于设置 GPIO 口对应位输出低电平。高 16 位为保留地址,读写无效。


所以理论上来讲,BRR 寄存器的功能和 BSRR 寄存器高 16 位的功能是一样的。也就是说,输出低电平的宏语句,可以有如下两种写法。


#define SET_BL_LOW()            GPIOA->BRR=GPIO_Pin_0

等价于

#define SET_BL_LOW()            GPIOA->BSRR=GPIO_Pin_0 << 16 


这么来看的话,其实 BRR 寄存器是比较多余的。而实际上,在最新的 STM32F4 系列 MCU 的 GPIO 寄存器中,已经找不到 BRR 寄存器了,仅保留了 BSRR 寄存器用于实现端口输出高低电平。因此,在 STM32F4 系列 MCU 的库函数中,对 GPIO 口输出高低电平的函数为如下形式:


void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

{

  /* Check the parameters */

  assert_param(IS_GPIO_PIN(GPIO_Pin));

  assert_param(IS_GPIO_PIN_ACTION(PinState));


  if(PinState != GPIO_PIN_RESET)

  {

    GPIOx->BSRR = GPIO_Pin;

  }

  else

  {

    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U;

  }

}


可见,不管是输出高还是输出低,都是对 BSRR 寄存器的操作。


三、BSRR、BRR、 ODR 之间的关系


配置 BSRR , BRR 是为了对端口输出进行配置,而 ODR 寄存器也是用于输出数据的寄存器,一个 ODR 寄存器控制了一组(16位)的 GPIO 输出。因此,对 ODR 进行修改也可以到达对 IO 口输出进行配置。


但是,由于对 ODR 寄存器的读写操作必须以 16 位的形式进行。因此,如果使用 ODR 改写数据以控制输出时,须采用“读-改-写”的形式进行。


假设需要对 GPIOA_Pin_6 输出高电平。采用改写 ODR 寄存器的方式时,使用“读-改-写”操作,代码如下:


uint32_t temp;

temp = GPIOA->ODR;

temp = temp | GPIO_Pin_6;

GPIOA->ODR = temp;


而使用改写 BSRR 寄存器时,仅需要使用如下语句:


GPIOA->BSRR = GPIO_Pin_6;


这是因为在修改 ODR 时,为了确保对端口 6 的修改不会影响到其他端口的输出,需要对端口的原始数据进行保存,之后再对端口 6 的值进行修改,最后再写入寄存器。而对 BSRR 的操作,是写 1 有效,写 0 不改变原状态,因此可以对端口 6 置 1,其他位保持为 0。BSRR 为 1 的位,会修改相应的 ODR 位,从而控制输出电平。


对 BSRR 的操作可以实现原子操作。因此在设置单个 IO 口输出时,使用 BSRR 进行操作会更加方便。


但也有例外的时候,在需要对单个IO口进行 Toggle 操作时(即对当前输出取反输出,当前输出为高则输出低,当前输出低则输出高),官方的库函数就是直接对 ODR 寄存器进行操作的。代码如下:


void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  /* Check the parameters */

  assert_param(IS_GPIO_PIN(GPIO_Pin));


  GPIOx->ODR ^= GPIO_Pin;

}


这是因为,0 和 1 与 1 进行异或操作被取反,0 和 1 与 0 进行异或操作保持原值。如下:


0 ^ 1 = 1

1 ^ 1 = 0


0 ^ 0 = 0

1 ^ 0 = 1


关键字:STM32  BSRR  BRR  ODR  寄存器 引用地址:STM32 BSRR BRR ODR 寄存器解析

上一篇:STM32学习笔记——GPIO之从库函数到寄存器
下一篇:stm32之GPIO的理解

推荐阅读

#include "stm32f10x.h" #define GPIOA_ODR_A GPIOA_BASE+0X0C#define GPIOA_IDR_A GPIOA_BASE+0X08 #define GPIOB_ODR_A GPIOB_BASE+0X0C#define GPIOB_IDR_A GPIOB_BASE+0X08 #define GPIOC_ODR_A GPIOC_BASE+0X0C#define GPIOC_IDR_A GPIOC_BASE+0X08 #define GPIOD_ODR_A GPIOD_BASE+0X0C#define GPIOD_IDR_A GPIOD_BASE+0X08 #defi...
1984年的某天,罗德尼·布鲁克斯(Rodney Brooks)在泰国的家中感到炎热、无聊、孤独。正是在这种情形之下,他灵光乍现,产生改变机器人技术领域发展的灵感,并最终使Roomba扫地机器人走进数百万个家庭。那一年,布鲁克斯即将步入而立。作为麻省理工学院的一名新成员,他努力使机器人在世界范围内得以应用。如果可以,他可能会希望科幻小说中的场景成为现...
随着汽车产业的快速发展和变革,节能、环保、智能和轻量已成为汽车发展的新方向。采用相同动力系统和传动系统前提下,汽车每减重 100kg,每百公里油耗可降低 0.3-0.6L,二氧化碳排放可减少 5g/km;纯电动汽车整车重量降低 10%,平均续航里程将会增加 5%-8%,同时损耗成本也可相应下降。所以,无论从传统汽车的减排还是新能源汽车增加续航的发...
集成电路是临港新片区“4+2+2”前沿产业集群中的四大核心产业之一,目前已渐具规模。浦东发布消息显示,临港新片区党工委副书记吴晓华表示,近两年,临港新片区已经集聚了积塔、闻泰、格科微、天岳、恒玄等120多家集成电路企业,涉及总投资额超过1500亿元,“十四五”期间能够形成单月芯片产能规模52万片,占到全上海2/3,在国内集成电路集聚区中排在前三...

史海拾趣

问答坊 | AI 解惑

可控硅/最近在做可控硅的东西,借鉴的东西

可控硅是可控硅整流元件的简称,是一种具有三个PN 结的四层结构的大功率半导体器件,一般由两晶闸管反向连接而成.它的功用不仅是整流,还可以用作无触点开关以快速接通或切断电路,实现将直流电变成交流电的逆变,将一种频率的交流电变成另一种频率的 ...…

查看全部问答∨

求教!振荡器设计

大家好,求教大家一个问题.我现在要做一个频率在31.5K占空比在81.5%的方波信号源.有没有什么现成的片子可以利用?想用晶振做.以前用阻容的方法,不是很稳定.我是新手,不太懂.请大家帮帮忙!…

查看全部问答∨

PRL:科学家实现在冷原子气体中成功存储光

向未来广域量子通信网络的最终实现又迈出重要一步 据美国《每日科学》网站报道,美国麻省理工学院科学家在冷原子中量子存储和波动研究领域有了新突破,而这方面的技术正是设计量子信息网络的关键,这使研究向未来广域量子通信网络的最终实现又迈 ...…

查看全部问答∨

液晶监视器的常见故障

监视器作为矩阵控制系统的监视器终端时,为什么在矩阵控制器切换图像是会出现一段时间的不同步现象?     在监控系统中,每路前端设备(如摄像机)等输出的图像信号中的场同步信号如果存在相位差,则矩阵控制器切换各路图像信号时,监视 ...…

查看全部问答∨

前台显示 字符串 为 乱码

EVC 下   这样使用Format 有问题吗 ? void CTestDlg::OnResult() {         UpdateData(true);         m_RESULT.Format(_T("%s"),"123");         Update ...…

查看全部问答∨

关于wince 5.0的sdk 与vs2005的问题

首次安装wince 5.0的开发环境,不知道该如何安装 弱弱的问一下大家是怎么安装wince 5.0的开发环境的? 我装了pb 5.0 Microsoft ActiveSync 4.5 evc 4.0 编译映像后生成sdk。 安装sdk通过evc 将程序下的板子上没有问题。 但要求用vs2005开发软 ...…

查看全部问答∨

如何用mc39i上网

小弟是做软件开发的,对硬件一点不懂,现在要做一个通过gprs和ppp上网的程序,哪位兄弟能给个事例或文档什么的看看,不胜感激…

查看全部问答∨

U盘文件保护问题,高手看过来,急急急急急急!

可以对U盘里的文件进行保护,具有防复制,防剪贴,防删除,防改名功能,但exe文件仍然可以打开运行,这个是不是需要写驱动?要怎么写?…

查看全部问答∨

mcu选择

做仪器需要一款MCU. 可扩展外部总线. 带LCD控制器可驱动彩色TFT带内部12bit AD、DA、目前我只对AT和STM32稍微熟..暂时STM32更适合..可FSMC只有16bit总线.扩展SRAM性能应该会受影响.(如果将变量存到外部SRAM).. 另外FSMC也 ...…

查看全部问答∨

stm8s用晶体确实很差!

                                 但是改用有源晶体有明显改善!…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved