zoukankan      html  css  js  c++  java
  • STM32 GPIO寄存器 IDR ODR BSRR BRR

    IDR是查看引脚电平状态用的寄存器,ODR是引脚电平输出的寄存器

    下面内容的原文:http://m646208823.blog.163.com/blog/static/166902953201293132522237/

    使用BRR和BSRR寄存器可以方便地快速地实现对端口某些特定位的操作,而不影响其它位的状态。

    比如希望快速地对GPIOE的位7进行翻转,则可以:

    GPIOE->BSRR = 0x80; // 置'1'
    GPIOE->BRR = 0x80; // 置'0'

    如果使用常规'读-改-写'的方法:

    GPIOE->ODR = GPIOE->ODR | 0x80; // 置'1'
    GPIOE->ODR = GPIOE->ODR & 0xFF7F; // 置'0'

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

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

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

    规则:

    一、置GPIOD->BSRR低16位的某位为'1',则对应的I/O端口置'1';而置GPIOD->BSRR低16位

    的某位为'0',则对应的I/O端口不变。

    二、置GPIOD->BSRR高16位的某位为'1',则对应的I/O端口置'0';而置GPIOD->BSRR高16位

    的某位为'0',则对应的I/O端口不变。

    三、置GPIOD->BRR低16位的某位为'1',则对应的I/O端口置'0';而置GPIOD->BRR低16位的

    某位为'0',则对应的I/O端口不变。

    例如:

    1)要设置D0、D5、D10、D11为高,而保持其它I/O口不变,只需一行语句:

      GPIOD->BSRR = 0x0C21;// 使用规则一

    2)要设置D1、D3、D14、D15为低,而保持其它I/O口不变,只需一行语句:

      GPIOD->BRR = 0xC00A;// 使用规则三

    3)要同时设置D0、D5、D10、D11为高,设置D1、D3、D14、D15为低,而保持其它I/O口不变

    ,也只需一行语句:

      GPIOD->BSRR = 0xC00A0C21;// 使用规则一和规则二

    如果中断中要对IO口设置,最好使用BSRR和BRR操作,而不要用ODR .

  • 相关阅读:
    asp.net core abp 视频教程1
    一种简单、易用的顶尖学习法——费曼学习法
    WPF附加属性
    WPF popup被截断的原因和修改方法
    cefsharp 在anycpu下运行
    XP系统运行wpf程序出现透明现象的解决
    Visual studio 2017 Installer 打包.netframework
    WPF Datagrid横向排列
    “App.exe 以附加有调试器,但没有将该调试器配置为调试此未经处理的异常。”
    Head First Python学习笔记4——处理数据
  • 原文地址:https://www.cnblogs.com/cj2014/p/3782650.html
Copyright © 2011-2022 走看看