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

发布者:sdlg668最新更新时间:2018-08-26 来源: eefocus关键字: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个端口位的同时修改操作。


关键字:STM32  GPIO  ODR  BSRR  BRR 引用地址:STM32 GPIO 配置之ODR, BSRR, BRR 详解

上一篇:关于STM32_GPIO的BSRR和BRR寄存器
下一篇:STM32学习笔记——GPIO之从库函数到寄存器

推荐阅读最新更新时间:2024-03-16 16:12

精简通俗易懂的STM32时钟系统小结
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择
[单片机]
STM32-触摸屏实验
void Touch_Init(void);//初始化 u8 Read_ADS(u16 *x,u16 *y); //带舍弃的双方向读取 u8 Read_ADS2(u16 *x,u16 *y); //带加强滤波的双方向坐标读取 u16 ADS_Read_XY(u8 xy); //带滤波的坐标读取(单方向) u16 ADS_Read_AD(u8 CMD); //读取AD转换值 void ADS_Write_Byte(u8 num); //向控制芯片写入一个数据 void Drow_Touch_Point(u8 x,u16 y);//画一个坐标叫准点 void Draw_Big_Point(u8 x,u16 y); //画一个大点 voi
[单片机]
STM32F429I-DISO探索第一篇 --GPIO(2)
上一篇写了GPIO简单的流水灯测试,看着有点单调,习惯了串口调试,板子上没有串口 那就另想办法吧,看着LCD突然有了个想法,为什么不把调试信息输出到LCD上,以前在做2416 WINCE开发的时候就经常这样干非常直观,那说干就干。 STM32F429I-DISO SDK里已经把开发包做好,那就直接拿过来用吧。 #define MESSAGE1 STM32F429I-Discoverry //提示信息 #define MESSAGE1_1 GPIO TEST #define MESSAGE2 LED3 LED4 #define MESSAGE2_1 ^-^ #def
[单片机]
stm32 rcc 时钟
STM32中在使用任何一个外设都必须打开相应的时钟,所以我从STM32的时钟学起。 RCC时钟 iframe id="iframe_0.2786969253793359" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://hiphotos.baidu.com/%25B4%25D3%25D0%25A1%25BE%25CD%25BA%25DC%25CB%25A5/pic/item/481cde3e541abeaad5622588.jpg?_=2634063%22%20style=%22border:none;max-width:1397px%
[单片机]
<font color='red'>stm32</font> rcc 时钟
stm32 TIM2 重映射
stm32的TIM2的端口使用组合有下面四种: 1.当不重映射时,默认TIM2四个的IO口是PA0、PA1、PA2、PA3 2.要使用PA15、PB3、PA2、PA3的端口组合,要调用下面的语句进行部分重映射: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //重映射必须要开AFIO时钟 GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); 3.要使用PA0、PA1、PB10、PB11的端口组合,要调用下面的语句进行部分重映射: RCC_APB2PeriphClockCmd(RCC_APB2Perip
[单片机]
<font color='red'>stm32</font> TIM2 重映射
STM32-使用函数指针时莫名复位问题原因
程序莫名复位,经检查是如下原因引起,访问了未知的空间! 这个1不应该加,改正后就没有复位了,所以在编程和测试中,一定要注意边界条件。
[单片机]
STM32-使用函数指针时莫名复位问题原因
基于STM32的三轴数字罗盘HMC5883L模块的测试方案
  最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内。连续测量模式下,最快测量、输出速率可达75hz,模块每次测量完毕并将数据更新至寄存器后,其DRDY引脚便产生一个低电平脉冲(可以配置一个外部中断捕获DRDY引脚的下降沿,并在中断服务程序中读取数据),在STM32中可以设置一个下降沿触发的外部中断,并在中断服务程序中调用角度数据读取函数。以下为操作该模块的主要步骤。   一、IIC协议相关操作(单片机作为主机控制时钟线)   宏定义:   //这里用到了STM32的位带区操作,方便实现对一个位的操作   //PB13配置为OD输出,同时外部给上拉电阻,这样既可输出信号给从机,也能   //在PB1
[单片机]
基于<font color='red'>STM32</font>的三轴数字罗盘HMC5883L模块的测试方案
ST 发布新STM32G0微控制器,增加USB和CAN接口和更大存储器
意法半导体发布新STM32G0微控制器,增加USB-C全速双模端口、CAN FD接口和更大容量的存储器 中国,2021年7月8日——意法半导体 STM32G0* 系列Arm® Cortex®-M0+ 微控制器 (MCU)新增多款产品和更多新功能,例如,双区闪存、CAN FD接口和无晶振USB全速数据/主机支持功能。 对于注重预算的应用,新的STM32G050超值产品线、STM32G051和STM32G061主流产品线增加了丰富的模拟功能和最大容量18KB 的 RAM存储器,以及多达 48 引脚且售价极具竞争力的封装。 此外,STM32G0B0 超值产品线、STM32G0B1和STM32G0C1主流产品线给STM3
[单片机]
ST 发布新STM32G0微控制器,增加USB和CAN接口和更大存储器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved