使用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 .
BSSR:只能写入并只能以字(16位)的形式操作,如果同时设置了高16bit和低16bit,则低16bit起作用。
BRR:只能写入并只能以字(16位)的形式操作
CP理解:总的来说使用BSSR和BRR寄存器针对个别IO的设置更加灵活。
关键字:STM32 GPIO 寄存器
引用地址:
STM32 GPIO几个寄存器的理解
推荐阅读最新更新时间:2024-03-16 16:12
STM8 全局配置寄存器(CFG_GCR)
激活级别 用户可通过对CFG_GCR寄存器中的AL位编程来配置MCU的激活级别。如何使用该位请参考 10.4活动等级/低功耗模式的控制。 禁用SWIM 在STM8 MCU复位后的默认情况下,SWIM引脚被配置为可以通过SWIM协议和外部工具通讯来对CPU 调试或对FLASH/EEPROM编程。当CFG_GCR寄存器的SWD位被置1时,SWIM引脚被配置为 普通I/O口。 全局配置寄存器(CFG_GCR)描述 地址偏移值:0x00 复位值:0x00 全局配置寄存器映射及复位值 CFG_GCR在STM8地址空间的映射如表2。 (表2:STM8 CFG_GCR寄存器映射)
[单片机]
Ubuntu下安装Stm32的Eclipse的开发环境(2)
序 linux的GUI和windos比起来实在逊色,虽然它的终端模式(命令行模式)非常强大。linux发行版ubuntu的GUI相对其他版本要华丽一些,所以最近由redhat转向ubuntu进行linux的学习。曾经一度使用gcc命令行模式来编译、调试C程序,但是我还是渴望一个C/C++集成开发环境可以给我更好的视觉感受和方便的操作,以避免命令行的繁琐操作,所以就尝试着在自己的ubuntu上装一个eclipse的集成开发环境。 eclipse简介 eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标
[单片机]
不可错过的单片机STM32的5个时钟源知识
众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。 其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。 内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号. 高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz
[单片机]
PIC单片机的内部A/D转换
//需求,将板子上电位器接RA0,设置PIC的AD相关寄存器,显示电压 #include pic.h __CONFIG(0x3831);//配置位18323831 #define uint unsigned int #define uchar unsigned char //共阴数码管(板子上用了达林顿管ULN2003,反向器) const unsigned char table ={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f}; //加小数点的共阴数码管显示,非常不错 const uchar table1 ={0xbf,0x86,0xdb,0xcf,0xe6,0xed
[单片机]
STM32F103将JTAG口重映射成为普通GPIO
Mini STM32的初学习者来说为什么用到PB3和PB4时无法控制输出呢? 首先,STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能。有时我们为了充分利用MCU I/O口的资源,会把这些 端口设置为普通I/O口。具体方法如下: 在GPIO_Configuration(); // 配置使用的 GPIO 口: GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); // 改变指定管脚的映射 GPIO_Remap_SWJ_Disable SWJ 完全禁用(JTAG+SW-DP) GPIO_PinRemapConfig(GPIO_Remap
[单片机]
【STM32Cube_03】使用GPIO点亮一个LED
1. 准备工作 硬件准备 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码。 2.生成MDK工程 选择芯片型号 打开STM32CubeMX,打开MCU选择器: 搜索并选中芯片STM32L431RCT6: 配置时钟源 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC; 如果使用默认内部时钟(HSI),这一步可以略过; 这里我都使用外部时钟: 配置GPIO引脚 在原理图上如下: 所以接下来我们选择配置PC13引脚: 配置时钟树 STM32L4的最高主频到80M,所
[单片机]
STM32 之 NVIC(中断向量、优先级) 简述
一、背景 需要使用STM32的CAN进行通信,经过一系列配置后,已可正常收发,还剩下一个CAN通信的错误处理。可错 误中断使能寄存器已经配置使能了,出错后就是无法进入 CAN1_SCE_IRQHandler 中断。(让CAN通信出错的的 办法很简单,将 CAN_H 与 CAN_L 直接短接,然后让其发送数据,正常情况下,就会触发错误中断了,发送错 误寄存器会瞬间加至 128 ,如果继续发,每发一次,发送错误计数器会+8,直到256,然后CAN节点即会进入离 线状态,也就是 Bus off 状态)。 一步一步查,才发现, CAN1_SCE_IRQn 的M3内核中断没有开,也就是NVIC相关配置。对于N
[单片机]
基于STM32编写一个SPI接口例程
引言 SPI是串行外设接口的缩写,是一种高速的,全双工,同步的通信总线。由于SPI高速和同步的特性,使其成为嵌入式系统和小型设备中使用最广泛的几种通信接口之一。本文将详细讲解一下SPI,并且最后基于STM32编写一个例程。 介绍 SPI简介 SPI(Serial Peripheral Interface)是一种串行外设接口,用于在微控制器(MCU)或数字信号处理器(DSP)等主设备与外部设备之间进行通信。SPI的设计旨在实现高速数据传输和简单的硬件实现。 SPI接口通常由一个主设备(Master)和一个或多个从设备(Slave)组成。主设备控制通信的时序和数据传输,而从设备根据主设备的指令进行响应。SPI通信基于全双工传输方式
[单片机]