STM32 BSRR BRR ODR 寄存器解析(F4系列已经去掉BRR寄存器了)

news2024/11/13 19:47:19

STM32 BSRR BRR ODR 寄存器解析(F4系列已经去掉BRR寄存器了)

  • 一、用法
  • 二、解释
  • 三、BSRR、BRR、 ODR 之间的关系


G0x0系列GPIO寄存器
在这里插入图片描述

F4系列GPIO寄存器(没有BRR寄存器了)
在这里插入图片描述

一、用法

经常会看到类似如下的宏定义语句,用于对已经初始化后的 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;
}

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

注意:在要求速度/时序的更快更严格的场合(模拟I2C,模拟SPI,Σ-∆ADC中DOUT/RDRY同一引脚等情况的),建议使用宏定义操作IO口对应的引脚。
在这里插入图片描述

#define IN1()  {GPIOA->MODER&=0XFF3FFFFF;} //PA11
#define OUT1() {GPIOA->MODER&=0XFF3FFFFF;GPIOA->MODER|=0X00400000;}

#define IN2()  {GPIOA->MODER&=0XFFF3FFFF;}//PA9
#define OUT2() {GPIOA->MODER&=0XFFF3FFFF;GPIOA->MODER|=0X00040000;}


#define	DRDY1   (GPIOA->IDR)&(uint16_t)0x0800
#define	DRDY2   (GPIOA->IDR)&(uint16_t)0x0200

二、解释

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 的 HAL 库函数中,对 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;
  }
}

而早期 ST 的标准库 std 中,关于 GPIO 口输出高低电平的函数为如下形式,里面通过两个16位的指针分别指向 BSRR 的高16位和低16位。

typedef struct
{
  __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
  __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
  __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
  __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
  __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
  __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
  __IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
  __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */
  __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
  __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */
} GPIO_TypeDef;
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->BSRRL = GPIO_Pin;
}
void GPIO_ResetBits(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->BSRRH = GPIO_Pin;
}

可见,不管是输出高还是输出低,都是对 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;

这是因为在修改 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;
}

原文链接:https://blog.csdn.net/u011303443/article/details/76514537

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tomcat出现中文乱码原因和解决办法(简单快捷易懂)

一、遇到问题 双击打开tomcat中的bin目录下的startup.bat会出现乱码问题 或者cmd里面打开也是乱码的问题 二、出现这个问题的原因 这是因为windows下的默认编码是GBK编码&#xff0c;tomcat默认编码是UTF-8编码 解决思路&#xff1a;那就把tomacat的默认编码改为和windows下…

HTML5-框架-计算机应用2115-2022年11月17日13:57:13

目录 HTML栅格化布局框架 2、demo演示 栅格化理论&#xff1a; 栅格化系统&#xff1a; 网页栅格化&#xff1a; 重点掌握内容&#xff1a; 练习目标: HTML栅格化布局框架 1、将整个HTML浏览器的宽度设为单位1&#xff0c;那么为了操作栅格化方便&#xff0c;我们拆分…

最简单的java工具(JDK+IDEA)安装教程

一、安装包的准备 安装 java 开发者工具的话&#xff0c;分为 JDK IDEA 的安装&#xff0c;网上有很多版本是需要手动配置环境变量的&#xff0c;对大多数新手朋友来说&#xff0c;并不是很友好,下面我分享一种最快捷的安装方法&#xff1a; JDK 官网下载地址&#xff1a;htt…

服务器——SSL/TLS协议信息泄露漏洞(CVE-2016-2183)修复办法

前言&#xff1a;近期某台Windows Server服务器的远程连接端口(3389)被扫出了SSL/TLS协议信息泄露漏洞(CVE-2016-2183),尝试了网上很多复制来复制去的"解决方法",直接导致堡垒机连不上服务器,每次连不上服务器又得去找服务器提供方,真的非常麻烦,在此不得不吐槽一下某…

anaconda+pytorch安装+pycharm环境配置

首先安装anaconda 网址&#xff1a;Anaconda Installers and Packages 我根据需要选择最新的windows-x86版&#xff0c;其他根据需要选择windows和linux,mac系统版本 安装正常安装&#xff0c;安装路径要记住&#xff0c;没有没配置环境变量要用到&#xff0c;安装后运行如果…

字节三面“凉凉”了,面试题与细节回顾,Java程序员的我太难了

面试字节&#xff0c;目前还记得一些细节&#xff0c;暂时先写一篇面经回顾一下吧~文末会有面试资料分享 字节跳动一面 HashTable、Hashmap. Hashtree的区别线程池相关,线程池的流程&#xff0c;参数线程池alivetime存活时间怎么控制cas讲一下redis讲-下,项目里怎么用redis的分…

Linux实用操作-----软件的安装

教程推荐&#xff1a;Linux零基础快速入门到精通 1、Linux系统的应用商店 操作系统安装软件有许多种方式&#xff0c;一般分为&#xff1a; •下载安装包自行安装 •如win系统使用exe文件、msi文件等 •如mac系统使用dmg文件、pkg文件等 •系统的应用商店内安装 •如win…

图算法介绍

为什么要用图算法 图算法有助于我们理解关联数据。理解网络及其内部联系可以为洞察和创新提供不可思议的潜力。 图算法特别适用于理解结构和揭示高度关联的数据集中模式。目前&#xff0c;大数据汇集、混合和动态更新的需求非常强烈&#xff0c;图算法有助于体现数据的关联性…

树结构的实际应用

堆排序 堆排序的介绍 堆排序利用堆这中数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它是不稳定排序堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其它左右孩子节点的值,称为大顶堆,注意:没有要求节点的左孩子和右…

苹果电脑的文件怎么复制到移动硬盘,macbook文件怎么拷贝到移动硬盘

如果我们使用的是Mac电脑&#xff0c;刚好需要将一些文件从Mac复制到NTFS外置硬盘&#xff0c;那么&#xff0c;苹果电脑的文件怎么复制到移动硬盘&#xff1f; 一、如何将文件从Mac电脑上复制到NTFS外置硬盘&#xff1f; 我可以在Mac上正常使用NTFS外置硬盘吗&#xff1f;很多…

Linux【搭建环境与基本指令】

Linux【搭建环境与基本指令】&#x1f34e;一.Linux搭建环境&#x1f352;1.1什么是Linux&#x1f349;1.1.1Linux介绍&#x1f349;1.1.2CentOS 和 RedHat 的关系&#x1f349;1.1.3在Java中应用到Linux的方面&#x1f352;1.2XShell的安装与使用&#x1f349;1.2.1XShell的安…

定时器的使用和线程安全

在linux下如果对定时要求不太精确的话&#xff0c;使用alarm()和signal()就行了&#xff1b; 但是如果想要实现精度较高的定时功能的话&#xff0c;就要使用setitimer函数。 核心api&#xff1a; int setitimer(int which, const struct itimerval *value, struct itimerval *…

【李宏毅】机器学习-RNN

RNN(Recurrent Neural Network) 为什么需要RNN呢&#xff1f; 举例来说&#xff0c;有一个任务需要识别每个单词代表的含义。在下面的句子中&#xff0c;taipei分别表示目的地和出发地&#xff0c;我们希望神经网络能够在不同的句子中&#xff0c;识别出不同的语义&#xff0c;…

3、排序(order by)与分页(limit)多表查询 -mysql

3、排序与分页&多表查询 -mysql排序与分页一、排序 Order By二、分页 Limit多表查询一、一个案例引发的多表连接2、笛卡尔积&#xff08;或交叉连接&#xff09;的理解二、多表查询分类讲解1、等值连接 vs 非等值连接2、自连接 vs 非自连接3、内连接 vs 外连接三、SQL99语法…

pytorch深度学习实战lesson18

第十八课 卷积层 卷积是深度学习最重要的概念之一&#xff0c;下面来学习和回顾一下卷积的基本概念。 目录 理论部分 从全连接层到卷积层 卷积层 实践部分 理论部分 从全连接层到卷积层 还是从一个例子开始&#xff1a;假设我要对猫和狗进行分类。 假设我用一千二百万像…

3年经验,光靠自动化测试基础,你可能连17k的测试岗都找不到,认清现实.....

相信对于每一个求职者来说都有被面试的经历吧&#xff0c;曾经作为一位测试小白的我&#xff0c;每一次面试过后都会各种吐槽面试官的不是&#xff0c;吐槽HR人事的不足&#xff0c;以及自己的有点没有发挥出来&#xff0c;今天我终于体会了一次面试官的心情.... 起因&#xf…

【夯实Kafka知识体系及基本功】分析一下(Broker)服务的可靠性机制分析「原理篇」

副本机制 分布式系统中&#xff0c;为了提高可靠性&#xff0c;最常用、最有效的策略是“副本机制”&#xff0c;Kafka也不例外。 Kafka 为每个 Partition 维护了一个 AR&#xff08;Assigned Replicas&#xff09;列表&#xff0c;由 ISR&#xff08;In-Sync Replicas&#x…

通过瑞利判据对显微镜物镜进行分辨率研究

摘要 通常可以采用瑞利判据理论表征显微镜的分辨率&#xff0c;瑞利判据是1896年由第三代瑞利男爵约翰威廉斯特拉特(John William Strutt)提出的。该理论认为&#xff0c;当一个艾里图样的中心与另一个艾里图样的第一个最小值重叠时&#xff0c;就可以分辨它们。在这个例子中…

力扣(LeetCode)3. 无重复字符的最长子串(C++)

滑动窗口 设置滑动窗口&#xff0c; lll 维护左窗口 &#xff0c; rrr 维护右窗口 &#xff0c;利用哈希表统计字母出现次数。 遍历字符串 sss &#xff0c;lll 循环右移&#xff0c;每次移动 &#xff0c; lll 指向的字母 s[l]s[l]s[l] 出现次数 。如果窗口内 s[l]s[l]s[l] …

NCMMSC 2021丨长短视频多语种多模态识别挑战赛

比赛背景 2021年第十六届全国人机语音通讯学术会议&#xff08;National Conference on Man-Machine Speech Communication&#xff0c;NCMMSC2021&#xff09;将于2021年10月15-18日在江苏徐州举行。本次会议由中国中文信息学会和中国计算机学会联合主办。 针对本次会议&…