STM32 GPIO 配置之ODR, BSRR, BRR 详解

用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态.

ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。

管脚对于位写1 gpio 管脚为高电平,写 0 为低电平

BSRR 只写寄存器:[color=Red]既能控制管脚为高电平,也能控制管脚为低电平。
对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。写 0 ,无动作

BRR 只写寄存器:只能改变管脚状态为低电平,对寄存器 管脚对于位写 1 相应管脚会为低电平。写 0 无动作。

刚开始或许你跟我一样有以下疑惑:

1.既然ODR 能控制管脚高低电平为什么还需要BSRR和SRR寄存器?
2.既然BSRR能实现BRR的全部功能,为什么还需要SRR寄存器?

对于问题 1 ------ 意法半导体给的答案是---

“This way, there is no risk that an IRQ occurs between the read and the modify access.”
什么意思呢?就就是你用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险。也就不需要关闭中断。

用ODR操作GPIO的伪代码如下:

disable_irq()
save_gpio_pin_sate = read_gpio_pin_state();
save_gpio_pin_sate = xxxx;
chang_gpio_pin_state(save_gpio_pin_sate);
enable_irq();

关闭中断明显会延迟或丢失一事件的捕获,所以控制GPIO的状态最好还是用SBRR和BRR

对于问题 2 ------- 个人经验判断意法半导体仅仅是为了程序员操作方便估计做么做的。

因为BSRR的 低 16bsts 恰好是set操作,而高16bit是 reset 操作 而BRR 低 16bits 是reset 操作。

简单地说GPIOx_BSRR的高16位称作清除寄存器,而GPIOx_BSRR的低16位称作设置寄存器。

另一个寄存器GPIOx_BRR只有低16位有效,与GPIOx_BSRR的高16位具有相同功能。

举个例子说明如何使用这两个寄存器和所体现的优势。

例如GPIOE的16个IO都被设置成输出,而每次操作仅需要

改变低8位的数据而保持高8位不变,假设新的8位数据在变量Newdata中,

这个要求可以通过操作这两个寄存器实现,STM32的固件库中有两个函数

GPIO_SetBits()和GPIO_ResetBits()使用了这两个寄存器操作端口。

上述要求可以这样实现:

GPIO_SetBits(GPIOE, Newdata & 0xff);
GPIO_ResetBits(GPIOE, (~Newdata & 0xff));

也可以直接操作这两个寄存器:

GPIOE->BSRR = Newdata & 0xff;
GPIOE->BRR = ~Newdata & 0xff;

当然还可以一次完成对8位的操作:

GPIOE->BSRR = (Newdata & 0xff) | ( (~Newdata & 0xff)<<16 );

当然还可以一次完成对16位的操作:

GPIOE->BSRR = (Newdata & 0xffff) | ( (~Newdata )<<16 );

从最后这个操作可以看出使用BSRR寄存器,可以实现8个端口位的同时修改操作。

有人问是否BSRR的高16位是多余的,请看下面这个例子:

假如你想在一个操作中对GPIOE的位7置'1',位6置'0',则使用BSRR非常方便: 
  GPIOE->BSRR = 0x400080;

如果没有BSRR的高16位,则要分2次操作,结果造成位7和位6的变化不同步! 
  GPIOE->BSRR = 0x80; 
  GPIOE->BRR = 0x40;

BSRR还有一个特点,就是Set比Reset的级别高,

就是说同一个bit又做Set又做Reset,最后结果是Set

要同步变化只要简单的 GPIOx->BSRR = 0xFFFF0000 | PATTEN;

即可,不用考虑哪些需要置1,哪些需要清零

从最后这个操作可以看出使用BSRR寄存器,可以实现8个端口位的同时修改操作。

(0)

相关推荐

  • STM32的IO口的八种模式

    STM32的IO口可以由软件配置成如下8种模式: 1.输入浮空 2.输入上拉 3.输入下拉 4.模拟输入 5.开漏输出 6.推挽输出 7.推挽式复用功能 8.开漏复用功能 每组IO口包含7个寄存器. ...

  • 从这些知识点入手,学单片机就简单多了

    自从CubeMX等图像配置软件的出现,同学们往往点几下鼠标就解决了单片机的配置问题.对于追求开发速度的业务场景下,使用快速配置软件是合理的,高效的,但对于学生的学习场景下,更为重要的是知其然并知其所以 ...

  • 不得不说,关于 *(unsigned long *) 和 (unsigned long)

    看讨论学知识 @辛昕: 然而我很悲伤地再次郑重声明:我木有错!具体请看我回复 水果君 那难得一见的长回帖的回帖!! 这事情居然还可以从遥远的 2月2号 刚下班放假那天开始. 那天,水群里,水果君弄了个 ...

  • 【嵌入式】STM32学习(3)——GPIO的8种工作方式及相关寄存器说明

    GPIO的8种工作方式 一.GPIO基本结构和工作方式 1.战舰/精英板 2.Min板 3.基本结构 4.工作方式 二.GPIO寄存器说明 1.GPIO相关寄存器 2.端口配置低寄存器(GPIOx_C ...

  • 在SensorTile上使用MicroPython

    前几天终于将SensorTile传感器部分的MicroPython驱动移植成功,因此就想将传感器的基本使用方法和大家讨论一下,顺便也写写MicroPython的移植方法.去年就有网友希望介绍移植方面的 ...

  • STM32+IR2104S的H桥电机驱动电路详解

      电机:俗称"马达",依据电磁感应定律实现电能转换或传递的一种电磁装置.包括:电动机和发电机.   电动机在电路中是用字母M表示,它的主要作用是产生驱动转矩:作为用电器或各种机械 ...

  • STM32的8种GPIO输入输出模式深入详解

    输入模式 -输入浮空(GPIO_Mode_IN_FLOATING) -输入上拉(GPIO_Mode_IPU) -输入下拉(GPIO_Mode_IPD) -模拟输入(GPIO_Mode_AIN) 输出模 ...

  • 施工现场三级电箱如何配置?图示详解,清晰明了!

    源自丨建筑工程鲁班联盟 一般来说,施工现场用电应符合下列规定:1.采用三级配电系统(即总配电柜或箱.分配电箱.开关箱):2.采用TN-S接零保护系统:3.采用三级漏电保护系统(即总配电箱漏电保护器.分 ...

  • AUTOSAR中CAN通信协议栈配置详解

    AUTOSAR的通信协议栈是由BSW通信服务,通信硬件抽象和通信驱动程序组成. 图1 AUTOSAR 通信协议栈的组件 COM模块 AUTOSAR COM是位于RTE和PduR之间的服务层模块,主要用 ...

  • 关于消火栓及灭火器配置、报废、维护等问题详解?

    网友咨询一:为什么消火栓.灭火器不能被阻挡?周围多少距离不能被阻挡?根据<中华人民共和国消防法>第二十八条规定:任何单位.个人不得损坏.挪用或者擅自拆除.停用消防设施.器材,不得埋压.圈占 ...

  • 写了10年的代码,我最怕写Mybatis这些配置,现在有详解了

    在使用 mybatis 过程中, 当手写 JavaBean和XML 写的越来越多的时候, 就越来越同意出错.这种重复性的工作, 我们当然不希望做那么多. 还好, mybatis 为我们提供了强大的代码 ...

  • 植物配置秘籍!植物设计还是“团”起来比较好!多图详解!

    来源 / 生生景观 如有侵权请联系小编删除 但是如何能才能把这个"团"组好,不是个简单的问题.首先你要对植物本身了如指掌,比如植物高度.树形.色彩.季相等等. 在中国,大家都更青睐 ...

  • 华为交换机如何配置?一个视频详解

    前面我们曾发布过关于华为交换机的配置命令,有朋友反映有部分命令不知道怎么使用,本期我们将通过这个视频来帮助大家详细了解,关于华为交换机的基础配置命令,如何实配置?

  • 小花园细部打造技巧及植物配置详解,值得细究

    小花园学问大 通常面积较小, 景观空间展开不易, 各方面制约较多, 设计中更应当多多参考经验数据, 方能做到景观怡人,功能合理. 小花园和外部空间,要适当隔离, 通过地形.矮墙配合植被, 减少噪音,免 ...