STM32入门-区别ORD,BSRR,BRR寄存器

2023-11-01

(转本文的目的是想说明配置GPIO的值如果用ODR寄存器,就会有读改写的过程,不利于任务间同步,即要考虑线程安全问题。如果BSRR可以直接设置某位,比ODR快)

基础知识
ORD,BSRR,BRR寄存器的作用是对已经初始化后的 IO 口输出高、低电平。

ODR寄存器可读可写,32位,既能控制管脚为高电平,也能控制管脚为低电平。GPIO管脚对于位写1为高电平,写 0 为低电平。(低 16 位用于设置 GPIO 口对应位输出高/低电平。高 16 位保留地址,读写无效。)

BSRR寄存器 称为端口位设置/清除寄存器,只写寄存器,32位, 既能控制管脚为高电平,也能控制管脚为低电平,对寄存器高 16位 写1 对应管脚为低电平,对寄存器低16位写1对应管脚为高电平。写 0 ,无动作

BRR寄存器称为端口位清除寄存器,只写寄存器,32位, 只能改变管脚状态为低电平,寄存器管脚对应位写 1 相应管脚会变为低电平。写 0 无动作。(BRR低 16 位用于设置 GPIO 口对应位输出低电平。高 16 位保留地址,读写无效。)

所以理论上来讲,BRR 寄存器的功能(低16位)和 BSRR 寄存器高 16 位的功能是一样的。

BSRR、BRR、 ODR 之间的关系
配置 BSRR , BRR 是为了对端口输出进行配置,而 ODR 寄存器也是用于输出数据的寄存器,一个 ODR 寄存器控制了一组(16位)的 GPIO 输出。因此,对 ODR 进行修改也可以到达对 IO 口输出进行配置。
由于对 ODR 寄存器的读写操作必须以 16 位的形式进行。因此,如果使用 ODR 改写数据以控制输出时,须采用“读-改-写”的形式进行。
BRR、BSRR都可以做到假如只想改变位0的值,则不论其他位为何值,用一个等号就可以完成。
而ODR改变时则是全部改变。
比如16位本来为1010101010101010,经过GPIOx->BSRR=0x01后变为1010101010101011,而经过GPIOx->ODR=0x01后变为0000000000000001

实例分析
实例1
经常会看到类似如下的宏定义语句,用于对已经初始化后的 IO 口输出高、低电平。
#define SET_BL_HIGH() GPIOA->BSRR=GPIO_Pin_5
#define SET_BL_LOW() GPIOA->BRR=GPIO_Pin_010
其作用类似于如下两个库函数,
void GPIO_SetBits(GPIO_Typedef* GPIOx, uint16_t GPIO_Pin)
void GPIO_ResetBits(GPIO_Typedef* GPIOx, uint16_t GPIO_Pin)
而且实际上这两个库函数就是通过修改BSRR,BRR寄存器的值来实现对 IO 口设置的
因此,使用宏或者库函数本质上都是一样的。区别在于使用宏更快,而使用函数更灵活。

实例2
在使用寄存器BSRR 和寄存器BRR时,使用规则总结如下:
1、置GPIOD->BSRR低16位的某位为’1’,则对应的I/O端口置’1’;而置GPIOD->BSRR低16位的某位为’0’,则对应的I/O端口不变。
2、置GPIOD->BSRR高16位的某位为’1’,则对应的I/O端口置’0’;而置GPIOD->BSRR高16位的某位为’0’,则对应的I/O端口不变。
3、置GPIOD->BRR低16位的某位为’1’,则对应的I/O端口置’0’;而置GPIOD->BRR低16位的某位为’0’,则对应的I/O端口不变。

使用场合举例如下:
1)要设置D0、D5、D10、D11为高,而保持其它I/O口不变,只需一行语句:
GPIOD->BSRR = 0x0C21;// 使用规则1
2)要设置D1、D3、D14、D15为低,而保持其它I/O口不变,只需一行语句:
GPIOD->BRR = 0xC00A;// 使用规则三
3)要同时设置D0、D5、D10、D11为高,设置D1、D3、D14、D15为低,而保持其它I/O口不变,也只需一行语句:
GPIOD->BSRR = 0xC00A0C21;// 使用规则一和规则二

实例3
假设需要对 GPIOA_Pin_6 输出高电平。采用改写 ODR 寄存器的方式时,使用“读-改-写”操作,代码如下:
uint32_t temp;
temp = GPIOA->ODR;
temp = temp | GPIO_Pin_4;
GPIOA->ODR = temp;
而使用改写 BSRR 寄存器时,仅需要使用如下语句:
GPIOA->BSRR = GPIO_Pin_6;
在修改 ODR 时,为了确保对端口 6 的修改不会影响到其他端口的输出,需要对端口的原始数据进行保存,之后再对端口 6 的值进行修改,最后再写入寄存器(即读-改-写形式改变位的状态)。而对 BSRR 的操作,是写 1 有效,写 0 不改变原状态,因此可以对端口 6 置 1,其他位保持为 0。BSRR 为 1 的位,会修改相应的 ODR 位,从而控制输出电平。
因此,在设置单个 IO 口输出时,使用 BSRR 进行操作会更加方便。
————————————————
版权声明:本文为CSDN博主「爱学习的大喵喵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44188050/article/details/104036639

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32入门-区别ORD,BSRR,BRR寄存器 的相关文章

  • 神经网络_第一篇 种类(2)_NARX

    NARX神经网络 1 NARX概念 2 NARX神经网络结构模型 3 NARX神经网络的特点 1 NARX概念 NARX神经网络 Based on the nonlinear autoregressive with exogeneous i

随机推荐

  • vue常用组件之confirm

    一些自带的方法 比如alert confirm等 往往由于浏览器不同而展现出不同的样式 为了统一 我们可以自己实现简单封装 下面代码是vue的一个组件 它简单实现了confirm功能 代码如下
  • 云服务器哪家便宜?新手看过来

    根据题主的要求 配置要求不高 便宜就行 如果满足这些条件 再加上稳定 性能好 服务好那就更完美了 那么符合这些条件的云服务商选择哪家呢 今天简单介绍下个人应用过的两家云平台 1 阿里云 目前国内最大的云计算平台 国内最早独立立项的云计算平台
  • [前缀表达式] 逆波兰表达式Python实现

    前缀表达式 逆波兰表达式Python实现 实例 1 2 3 4 5 gt 1 2 3 4 5 1 2 3 4 5 2 3 gt 123 45 2 3 代码实现 def infix to postfix expression operator
  • 无需租云服务器,Linux本地搭建web服务,并内网穿透发布公网访问

    文章目录 前言 1 本地搭建web站点 2 测试局域网访问 3 公开本地web网站 3 1 安装cpolar内网穿透 3 2 创建http隧道 指向本地80端口 3 3 配置后台服务 4 配置固定二级子域名 5 测试使用固定二级子域名访问本
  • 部署golang项目到docker

    先新建一个文件夹 该文件夹命名为项目名称 该项目文件夹下在新建3个文件夹 分别为 bin pkg src 注 bin目录存放项目编译后生成的二进制文件 在Windows平台下就是 exe文件 pkg目录 存放项目所依赖的各种包 src目录
  • Centos7离线安装nginx(简单有效成功)

    tar zxvf nginx 1 20 2 tar gz cd nginx 1 20 2 mkdir usr local nginx configure prefix usr local nginx make make install cd
  • 使用 ansible 角色在 Centos 和 Ubuntu 上编译安装 Nginx

    1 创建 Nginx 角色目录 root centos8 roles pwd data ansible roles root centos8 roles mkdir pv data ansible roles nginx tasks han
  • HashMap<Integer,ArrayList>

    HashMap
  • 使用python进行音频的实时处理,并实现不同的效果,例如:失真、过载等

    使用 Python 进行音频实时处理可以使用音频处理库如 librosa pydub soundfile scipy 等 这些库提供了读取 写入和处理音频数据的功能 举例来说 使用 librosa 实现失真效果可以这样做 import li
  • Linux内核链表移植到应用程序中及使用方法

    Linux内核链表移植到应用程序中及使用方法 目录 Linux内核链表移植到应用程序中及使用方法 使用流程 示例代码 链表移植文件 使用流程 1 创建链表 2 初始化链表 3 常规操作 增加 删除 遍历等操作 示例代码 typedef st
  • 《算法竞赛进阶指南》. 涂满它!搜索IDA*

    IDA 算法 使用连通块之外剩下的颜色个数作为估值函数 每次记录连通块周围颜色 然后改成这个颜色 dfs下去即可 include
  • MATLAB的sum函数

    1 a为向量 b sum a a表示行向量 b表示行向量求和的值 2 a为矩阵 b sum a a表示矩阵 b表示矩阵每列求和得到的行向量 3 设定sum函数的参数列表的参数dim 对矩阵每一列或者每一列求和或每一行求和 得到行向量或者列向
  • TS中的类型之数组、元组、枚举以及类型别名

    数组 数组的类型声明 类型 或者 Array lt 类型 gt string 表示字符串数组 number 表示数值数组 let a number a 1 2 3 let b Array
  • 基于51单片机控制的恒流源设计

    由51单片机作为主控制器实现的恒流源设计 部分程序 include reg52 h stc头文件 include Delay h 延时头文件 设置按键 sbit KEY ADD P3 2 加 sbit KEY DEC P3 3 减 DA s
  • Acwing-860. 染色法判定二分图

    染色法 将所有点分成两个集合 使得所有边只出现在集合之间 就是二分图 二分图 一定不含有奇数环 可能包含长度为偶数的环 不一定是连通图 代码思路 染色可以使用1和2区分不同颜色 用0表示未染色 遍历所有点 每次将未染色的点进行dfs 默认染
  • 译-- Lambda Expressions >=java SE8 (Lambda表达式详解)

    原文地址 http stackoverflow com documentation java 91 lambda expressions t 201701170111285810613 Introduction Lambda表达式用一个表达
  • IO流read方法返回值

    1 byte buf new byte 1024 int length bufferedInputStream read byte 如果传入缓冲数组 内容是存储到缓冲数组中 返回值是存储到缓冲数组中的字节个数 read 从输入流中读取数据的
  • 织梦DEDECMS EXCEL数据批量导入文章插件 2020/07/23更新

    织梦插件介绍 目前本插件售价100元 绿色开源 无限制 充值金币购买下载 本插件为织梦EXCEL导入数据 目前只有UTF版本 GBK版本自行转码 默认只支持普通文章模型 不包括自定义字段 需要另外模型或者添加新字段的可以联系客服收费修改 其
  • 值对于int32太大或太小_从没有一人能将KDJ指标说得这么透彻!(附J值用法)学会了可低买高卖!...

    牢记这9张思维导图 你就是赢家 1 股市导图总纲 2 k线基础 3 均线基础 4 切线基础 5 指标分析 6 统计分析 7 选股方法 8 板块轮动 9 股市中的各色骗局 导图看不清晰 有高清图片 这里会被压缩了 KDJ指标又叫随机指标 由K
  • STM32入门-区别ORD,BSRR,BRR寄存器

    转本文的目的是想说明配置GPIO的值如果用ODR寄存器 就会有读改写的过程 不利于任务间同步 即要考虑线程安全问题 如果BSRR可以直接设置某位 比ODR快 基础知识 ORD BSRR BRR寄存器的作用是对已经初始化后的 IO 口输出高