使用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 .
关键字:STM32 GPIO BRR BSRR寄存器
引用地址:
STM32 GPIO BRR和BSRR寄存器
推荐阅读最新更新时间:2024-03-16 14:37
关于初学STM32中肯的几点建议
通过观察后台提问的内容来看,关注我的人中STM32初学者占大部分,而且大多处于小白阶段。所以,今天暂且写下几点内容给这些朋友。 1查找资料去官网 许多初学者总是在问:能给我一份xxx手册吗?你有关于xxx的资料吗?同时,我也常在某些“技术群”里看到类似这种“给资料”的对话。 这样说吧,你们向别人获取的“资料”,别人基本上也是从官网下载而来的。而且,别人给你的资料不一定是最新版本。 因此,建议初学者查找资料,寻找资料尽量找官方原版资料,毕竟官方的才具有权威性。 STM32官方整理的资料很多,而且针对每一种型号的MCU都有各种资料。夸一点的说:你想要的都有。 针对你MCU芯片型号,进入对应的网址即可(具体这里就不说过程了): ht
[单片机]
STM32学习笔记之中断向量表,MDK程序启动分析
span style= font-size:18px; ;// h Stack Configuration ;// o Stack Size (in Bytes) 0x0-0xFFFFFFFF:8 ;// /h Stack_Size EQU 0x00000200 ;//定义堆栈大小 AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段 按8字节对齐 Stack_Mem SPACE Stack_Size ;//保留Stack_Size大小的堆栈空间 __initial_
[单片机]
STM32中外部中断与外部事件
这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套。 图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断 挂起请求寄存器 ,最后经过编号4的与门输出到NVIC中断控制器;在这个通道上有4个控制选项,外部的信号首先经过边沿检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。 接下
[单片机]
远程修改STM32 TIMER占空比的方案
现在有人有这样一个需求,他使用STM32F429芯片做开发,其中用到32位的TIM2实现3路PWM输出。 另外有上位机跟STM32的UART接口相连,上位机可能不定期地需要通过UART接口给STM32发送新的占空比参数,而且每次都发送3个比较输出通道的参数【12个字节】。 如何快捷地实现这个功能呢?要求收到数据后尽快修改3个比较通道的参数。 前一篇重点介绍了利用DMAFIFO和UART接收事件触发DMA传输实现了3个CCR寄存器的批量修改。 我们不妨就该话题稍作拓展,不再局限于某个STM32系列,而是从整个STM32的资源上考虑当前需求。上次提到3种实现方案,我想借此机会再给大家介绍另外一种实现方案,以拓宽未来解决
[单片机]
STM32芯片的那些系统级复位功能
我们知道,STM32芯片里有很多系统级的复位,比方上电复位、欠压复位、看门狗复位、软件复位、复位脚电平触发复位等等。这些系统级的复位往往都是针对整个芯片或芯片的绝大部分区域。 其实,我们在实际应用中有时候可能并不需要、甚至不接受总是对整个芯片做大面积的复位。正因为如此,STM32的芯片里除了具备那些系统级复位功能外,还针对各个外设设计了复位功能,即我们可以只需针对某特定外设或特定区域做复位而不影响其它。特定区域一般是指某一块总线驱动的外设集,比方挂在APB1总线的所有外设。 或许有人不了解、或者说没有使用过针对特定外设复位的功能,这里就简单介绍下,抛砖引玉。在STM32各个系列的参考手册里的RCC章节,有关于对外设或局部外
[单片机]
stm32的PWM总结
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。 STM32的定时器除了TIM6和7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这样,STM32最多可以同时产生30路PWM输出! 要使STM32的通用定时器TIMx产生PWM输出,我们会用到3个寄存器来控制PWM。这三个寄存器分别是:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCE
[单片机]
stm32最小系统原理及结构组成
本文为大家带来stm32最小系统原理及结构组成的介绍。 stm32最小系统原理及结构组成----结构组成 1.晶振,至于大小由你单片机时钟周期要求而决定(用于计时,与两个电容并联使用,电容大小由你的晶振决定,一般用22pF) 2.复位电路(用于复位) 3.电源(用于供电,一般用电脑的USB口供电) 4.烧制程序的口(swim或者是jtag都可以,用于调试烧写仿真程序) STM32F103微控制器外部结构 STM32F103总线和存储器结构 stm32最小系统原理及结构组成----原理图
[单片机]
意法STM32系列获ARM RealView微控制器开发工具包支持
ARM公司日前宣布RealView微控制器开发工具包将支持意法半导体基于ARM Cortex-M3处理器的全新STM32F1xx系列器件。 STM32F101(接入行)和STM32F103(性能行)将是意法半导体首个基于ARM Cortex-M3处理器的器件系列,兼具卓越的高性能和低功耗。该系列器件拥有高达72MHz的CPU时钟速度、128Kbyte片上闪存ROM及20Kbyte片上RAM,还包括A/D、CAN、USB、SPI、I2C等众多外设及多达80个GPIO。 RealView微控制器开发工具包3.1可为新器件提供支持。这一最新版本保留了Keil Vision 3集成开发环境(IDE)易于使用的特性,并增加了针对STM3
[焦点新闻]