0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

既然ODR能控制管脚高低电平,为什么还需要BSRR寄存器呢?

工程师邓生 来源:未知 作者:刘芹 2023-10-24 11:49 次阅读

既然ODR能控制管脚高低电平,为什么还需要BSRR寄存器呢?

为什么需要BSRR寄存器

单片机中,为了控制端口的输出状态,我们需要使用特定的寄存器。其中,ODR寄存器负责直接控制端口输出电平,但是在某些情况下,我们需要更高效、更精准的控制电平状态,这时就需要使用BSRR寄存器了。

BSRR寄存器全称Bit Set/Reset Register,中文名称为位设置/重置寄存器,其作用是能够快速切换输入输出引脚的电平状态。通过BSRR寄存器的配置,我们可以简单、高效地设置或者重置对应的引脚电平,而无需进行其他操作。

BSRR寄存器的结构

BSRR寄存器总共32位,其中前16位是用于设置对应引脚的高电平,后16位是用于设置对应引脚的低电平。

在BSRR寄存器的低16位中,每4位对应一个引脚,以16进制的形式表示。例如:低16位的0号位(LSB)至3号位分别对应的引脚号为0~3,以此类推。对于高16位,它们与低16位的区别在于,它们控制对应引脚的低电平状态,即为清零操作。

例如,如果要使引脚1变为高电平,那么我们可以给BSRR寄存器的第17位(低16位的1号位)写入1,这将会把引脚1设置为高电平。如果想要将引脚1的电平设置为低电平,我们只需要给BSRR寄存器的第33位(高16位的1号位)写入1,即可实现。

BSRR寄存器与ODR寄存器的区别

虽然ODR和BSRR都可以控制引脚的电平状态,但是它们在实现上还是有一些区别的。

首先,ODR寄存器的写入操作是瞬时的,即写入后立即生效。而BSRR寄存器的写入操作是有延迟的,需要在CPU时钟上升沿时才能够生效,因此,如果需要精准地控制电平状态,我们需要根据CPU主频等因素,精确地计算出延迟时间。

其次,在使用BSRR寄存器时,我们可以直接通过对应电平位的写入操作,来实现针对某一位的设置或重置操作。这样,在高频率操作时,会比使用ODR寄存器更具有优势,不仅可以提高效率,还能保证电平状态的准确性。

还有一个重要区别是,在使用BSRR寄存器时,如果想要对某个引脚进行设置或重置,我们只需要对对应的位进行操作即可,而使用ODR寄存器时,我们需要同时对所有引脚进行设置或重置,这样会导致效率降低。

综上所述,BSRR寄存器与ODR寄存器相比,更加灵活高效,能够更好地满足实际需求,特别是在高频率控制电平情况下更为显著。

结语

在单片机的开发中,对端口的输入输出状态控制是一项非常基础的操作,因此理解和掌握相关的寄存器是非常重要的。在实际应用中,根据不同的场景需求,选择合适的寄存器会使我们的开发更加方便、高效。

BSRR寄存器虽然只是一个小小的寄存器,但是在高频率作业中,能够发挥出强大的功能和优势。因此,对于端口输出状态的控制需求得到了更好的满足。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117719
  • odr
    odr
    +关注

    关注

    0

    文章

    5

    浏览量

    3466
  • bsrr
    +关注

    关注

    0

    文章

    2

    浏览量

    1210
收藏 人收藏

    评论

    相关推荐

    STM32的IO口初始化为输入浮空,那管脚是高电平还是低电平

    STM32的IO口初始化为输入浮空,那管脚是高电平还是低电平
    发表于 04-07 07:12

    AD7321的数据转换输出一直是高电平,不工作是为什么?

    AD7321的数据转换输出一直是高电平,前四位正常输出(通道0和通道1转换能在前四位体现出来),后12位数据位全是高电平,让AD7321工作只需要先写范围
    发表于 02-26 06:34

    TLE9854的LIN接口如何配置使其能够向IO口一样输出高低电平

    查询TLE9854的数据手册,发现LIN有个 High Voltage Input / Output Mode (LHVIO) ,这个模式可以控制LIN总线输出高低电平是吗,该怎么配置和使lin输出高低电平
    发表于 02-02 13:53

    AD5522在写入寄存器的时候,busy信号一直为高电平,没有低电平的跳变是为什么?

    之前问了一个问题,没有得到解答。现在,我再描述一下我的问题。 1.我写入AD5522寄存器内的数据,都可以正确的读出来。 2.在写入寄存器的时候,busy信号一直为高电平,没有低电平
    发表于 01-12 07:24

    为什么使用51单片机与ADXL345 SPI通信时,需要自己对SDI,SDO,SCLK进行高低电平的设置?

    传感的值? 我在网上看到的程序都是,在读取三个轴方向的寄存器的值时,都是每次读取一位数据是都需要对SCLK进行高低电平的调整,为什么这么做?
    发表于 01-01 08:09

    数模转换芯片AD7991配置完断电后,还需要再次配置吗?

    这个芯片在使用时,有一些配置寄存器,用于配置芯片的工作方式。这个寄存器,配置完断电后,还需要再次配置吗? 这个芯片有两个型号—0和—1,配置时,地址不一样。在芯片上没看有标识,怎么判断是哪个型号的?
    发表于 12-22 08:06

    AD9269如果直接接高低电平信号能不能正常工作?

    控制,会增加工作量,我想直接接高低电平信号,但是没有在手册上找到在默认状态下,时钟分频内部是如何设置的。如果直接接高低电平信号能不能正常工作?
    发表于 12-20 07:11

    单片机上下拉电阻的作用

    之前始终对维持确定的高低电平状态没有足够深的理解,既然单片机自身是有输出高低电平的能力,为什么还需要在外部上下拉,这不是浪费能量吗?
    的头像 发表于 11-06 15:37 691次阅读
    单片机上下拉电阻的作用

    两个单片机一个输出高低电平,另一个检测高低电平,两个单片机引脚可以直接相连吗?

    两个单片机一个输出高低电平,另一个检测高低电平,两个单片机引脚可以直接相连吗?是否要做隔离 两个单片机一个输出高低电平,另一个检测高低电平
    发表于 11-02 06:14

    为什么直接操作GPIO的BRR与BSRR寄存器不管用?

    我要通过设置GPIOB.5(在战舰V3开发板上连接到了LED的DS0)来产生高低电平从而触发一个从设备的外部中断。但是我在下面程序段中操作寄存器也无法使得PB.5变为高电平(因为LED一直亮,我认为
    发表于 10-20 08:09

    STM32在操作控制IO电平高低输出的时候,直接操作寄存器会比库函数操作更快吗?

    STM32在操作控制IO电平高低输出的时候直接操作寄存器会比库函数操作是不是更快
    发表于 10-12 07:59

    使用变压器变压的电源还需要滤波器吗

    使用变压器变压的电源还需要滤波器吗
    的头像 发表于 08-31 14:03 548次阅读
    使用变压器变压的电源<b class='flag-5'>还需要</b>滤波器吗

    蜂鸟e203的uart为什么没有使寄存器

    1.蜂鸟e203的uart为什么没有使寄存器?按照手册设置了所有寄存器后,uart完全不工作。使用Modelsim仿真后发现,uart的PSEL和PENABLE信号一直是低电平状态。
    发表于 08-12 07:32

    寄存器是什么 掌握使用寄存器做设计需要注意的事项

    既然RTL是以寄存器行为为基础,那么就必须先了解寄存器是什么,并且掌握使用寄存器做设计需要注意的事项。
    的头像 发表于 07-13 15:38 876次阅读
    <b class='flag-5'>寄存器</b>是什么 掌握使用<b class='flag-5'>寄存器</b>做设计<b class='flag-5'>需要</b>注意的事项

    Cortex-M3入门指南(二):寄存器

    第一行是偏移地址。偏移地址指明了这个寄存器相对于外设寄存器区段的位置,从起始地址表中我们可以知道 GPIOA 寄存器区段的起始地址是 0x4001_0800,而 GPIO_BSRR
    的头像 发表于 05-31 17:36 1064次阅读
    Cortex-M3入门指南(二):<b class='flag-5'>寄存器</b>