精华内容
下载资源
问答
  • STM32寄存器ODRBSRR和BRR

    千次阅读 2019-07-25 19:13:28
    可能很多朋友对GPIO_TypeDef里的各个寄存器还不太了解,更会疑惑为何有了ODR,还要使用BSRR和BRR,下面我就我的认识,做一下简单的说明 ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。管脚对于位...

    可能很多朋友对GPIO_TypeDef里的各个寄存器还不太了解,更会疑惑为何有了ODR,还要使用BSRR和BRR,下面我就我的认识,做一下简单的说明
    ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。管脚对于位写1 gpio 管脚为高电平,写 0 为低电平
    ·缺点:会因中断而打断,关闭中断明显会延迟或丢失一事件的捕获,所以控制GPIO的状态最好还是用BSRR和BRR
    BSRR 只写寄存器:既能控制管脚为高电平,也能控制管脚为低电平。
    寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。简记为高低低高写 0 ,无动作
    BRR 只写寄存器:只能改变管脚状态为低电平,对寄存器 管脚对于位写 1 相应管脚会为低电平。写 0 无动作


    另一方面

    注:GPIO_Pin为(0..15)中任意接口
    有了GPIOx->BRR清除寄存器,并且与GPIOx->BSRR高16为功能相同,有人问是否BSRR的高16位是多余 的,请看下面的例子:
    假如你想在一个操作中对GPIOE的位1置'1',位15置'0',则使用BSRR非常方便:
    GPIOE->BSRR = 0x80000002;
    低16位中的0002将位1置‘1’,高16位中的8000将位15置清零,一步就可以做到。
    如果没有BSRR的高16位,则要分2次操作,结果造成位1和位15的变化不同步!
    GPIOE->BSRR = 0x02;
    GPIOE->BRR = 0x8000;
    
    展开全文
  • GPIO 配置之ODR, BSRR, BRR 详解

    万次阅读 多人点赞 2019-04-03 15:34:41
    STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。 管脚对于位写1 ...

    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 无动作。

    BRR、BSRR、ODR都是用来控制16位针脚的。

    其中,BRR和ODR高16位都不可用(Reserved),使用低16位控制针脚,而BSRR高16位和低16位皆可用,都用来控制16位针脚。

    关于写0无效的意义:

    举个例子,GPIOx->BRR=0x01与GPIOx->BSRR=0x01<<16相同,后者为通过0x01左移16位来控制高16位。

    BRR、BSRR都可以做到假如只想改变位0的值,则不论其他位为何值,用一个等号就可以完成。

    而ODR改变时则是全部改变。

    比如16位本来为1010101010101010,经过GPIOx->BSRR=0x01后变为1010101010101011,而经过GPIOx->ODR=0x01后变为0000000000000001。


    --------------------- 
    作者:alanzjl 
    来源:CSDN 
    原文:https://blog.csdn.net/alanzjl/article/details/43857963 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    但是BSRR高16bit怎么设置高电平呢……写0没用啊……我会继续找确切的答案,如果有大佬知道的话麻烦留言帮助一下,谢谢。


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

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

    对于问题 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个端口位的同时修改操作。

    http://www.cnblogs.com/shangdawei/p/4723941.html

    展开全文
  • 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。 管脚对于位写1 gpio 管脚为高电平,写 0 为低电平 BSRR 只写...
  • STM32GPIO寄存器的ODRBSRR、BRR 端口输出数据寄存器(GPIOx_ODR)一般不用不知道为什么? 等知道之后再添加。 在输出模式下 端口位设置/清除寄存器(GPIOx_BSRR) 高8位为1使相应的Pin脚清零。 低8位为1使相应的Pin脚...

    STM32GPIO寄存器的ODR、BSRR、BRR

    端口输出数据寄存器(GPIOx_ODR)一般不用不知道为什么?
    等知道之后再添加。
    在输出模式下

    端口位设置/清除寄存器(GPIOx_BSRR)

    高8位为1使相应的Pin脚清零。
    低8位为1使相应的Pin脚置一。
    例:从固件库里面抄来,使相应Pin脚输出1。

    void GPIO_SetBits(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
    {
    	GPIOx->BSRR  |= GPIO_Pin;
    }`
    

    从固件库里面抄来,置相应Pin脚的位。高8位没有相应的例子等以后添加,但是网上有人说是可以同时操作多个Pin脚时使用,当有中断来时,如果一位一位的操作会打断操作影响输出,没经历过。

    端口位清除寄存器(GPIOx_BRR)

    低8位为1,使相应的Pin脚清零。
    例:从固件库里面抄来,使相应Pin脚输出0。

    void GPIO_ResetBits(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
    {
    	GPIOx->BRR  |= GPIO_Pin;
    }`
    

    在输入模式下BSRR、BRR起的作用

    上拉,下拉

    // 判断是否为下拉输入模式
    if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
    {
    	// 下拉输入模式,引脚默认置0,对BRR寄存器写1可对引脚置0
    	GPIOx->BRR = (((uint32_t)0x01) << pinpos);
    }				
    else
    {
    	// 判断是否为上拉输入模式
    	if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
    	{
    		// 上拉输入模式,引脚默认值为1,对BSRR寄存器写1可对引脚置1
    		GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
    	}
    }
    

    在这里插入图片描述

    如图所示
    BSRR的低16位控制PMOS使其导通,则此时IO口为高电平。
    BSRR的高16或者是BRR的低8位控制NMOS使其导通,则此时IO口为低电平。
    BSRR的高16和BRR的低16位是同一个地址,看寄存器手册的地址偏移量
    GPIOx_BSRR 地址偏移:0x10
    GPIOx_BRR 地址偏移:0x14
    &GPIOx_BRR-&GPIOx_BSRR == 0x04 刚好为16位。

    展开全文
  • ODR, BSRR, BRR的差别

    万次阅读 多人点赞 2018-05-07 19:41:05
    ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。管脚对于位写1 gpio 管脚为高电平,写 0 为低电平BSRR 只写寄存器:[color=Red]既能控制管脚为高电平,也能控制管脚为低电平。对寄存器高 16bit 写...

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

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

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

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


    ODR 能控制管脚高低电平为什么还需要BSRR和SRR寄存器的原因是

    This way, there is no risk that an IRQ occurs between the read and the modify access.

    用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险。也就不需要关闭中断

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


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

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


    展开全文
  • STM32中控制GPIO状态的一共有7个寄存器,分别是CRL、CRH、IDR、ODRBSRR、BRR、LCKR。 调用即可看到选项
  • 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。管脚对于位写1 gpio 管脚为高电平,写 0 为低电平 BSRR 只...
  • stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。 管脚对于位写1 gpio 管脚为高电平,写 0 为低电平 BSRR 只...
  • 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。 管脚对于位写1 gpio 管脚为高电平,写 0 为低电平 BSRR ...
  • STM32 GPIO寄存器ODR BSRR BRR

    千次阅读 2017-04-11 19:25:57
    STM32 GPIO寄存器ODR BSRR BRR 使用BRR和BSRR寄存器可以方便地快速地实现对端口某些特定位的操作,而不影响其它位的状态。 比如希望快速地对GPIOE的位7进行翻转,则可以: GPIOE->BSRR = 0x80; // ...
  • IDR是查看引脚电平状态用的寄存器,ODR是引脚电平输出的...使用BRR和BSRR寄存器可以方便地快速地实现对端口某些特定位的操作,而不影响其它位的状态。 比如希望快速地对GPIOE的位7进行翻转,则可以: GPIOE-&g...
  • GPIO 有3个管脚控制寄存器: ODR寄存器, 控制管脚的高/低电平, 只有低16位, 置1 为高电平,置0为低电平; BSRR寄存器, 控制管脚的高/低电平, 低16位:写入1为...特别的: F1F4系列都有 ODR和BSRR, 但F4取消了BRR, 为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,021
精华内容 808
关键字:

odr和bsrr