详细页面:http://alanzjl.sinaapp.com/2015/02/gpio_brr_bsrr_odr/
BRR、BSRR、ODR都是用来控制16位针脚的。
其中,BRR和ODR高16位都不可用(Reserved),使用低16位控制针脚,而BSRR高16位和低16位皆可用,都用来控制16位针脚。
BRR与BSRR使用方法
BRR和BSRR的最显著用处就是可以只改变某一个或某几个针脚的值而不改变其他。
1.BRR:如果程序对其某针脚赋值0,则该针脚维持原值不变,比如BRR的位0本来为1,则GPIOx->BRR=0x0语句之后该位值还为1。若对其赋值1,则该位值变为0(即复位值),比如BRR的位0本来为1,则GPIOx->BRR=0x01语句之后该位值为0。
2.BSRR:对于高16位,与BRR相同。对于低16位,如果程序对其某针脚赋值0,则该针脚维持原值不变。若对其赋值1,则该位值变为1,比如BSRR的位0本来为0,则GPIOx->BRR=0x01语句之后该位值为1。
举个例子,GPIOx->BRR=0x01与GPIOx->BSRR=0x01<<16相同,后者为通过0x01左移16位来控制高16位。
BRR、BSRR都可以做到假如只想改变位0的值,则不论其他位为何值,用一个等号就可以完成。
而ODR改变时则是全部改变。
比如16位本来为1010101010101010,经过GPIOx->BSRR=0x01后变为1010101010101011,而经过GPIOx->ODR=0x01后变为0000000000000001。
借用之前看到的一个例子,
GPIOE->BSRR = 0x80; // 置’1'
GPIOE->BRR = 0x80; // 置'0'
如果使用常规'读-改-写'的方法:
GPIOE->ODR = GPIOE->ODR | 0x80; // 置’1'
GPIOE->ODR = GPIOE->ODR & 0xFF7F; // 置’0'
二者作用相同。
附上官网手册截图:
关键字:STM32 GPIO BRR BSRR ODR 寄存器
引用地址:
STM32 通用输入输出端口GPIO BRR、BSRR、ODR寄存器详解
推荐阅读最新更新时间:2024-03-16 15:39
STM32 启动代码分析详解
1、堆栈存储器 堆栈存储区是在片上存储器中的SRAM(或RAM)中由用户自行开辟的一片数据存储区域,并且堆栈区的大小可根据用户的需要任意指定(只要不超过SRAM或RAM的大小),而堆栈区的位置由编译器指定分配。 Cortex-M3/M4处理器的堆栈指针SP是“满递减,空递增”,呈现向下逆生长的特点。 堆栈区数据的存储特点是“先进后出,后进先出”。 这种特点是由堆栈指针的移动方式决定的,先入栈的数据对应的指针值比较大,后入栈的数据对应的指针值比较小,而出栈时堆栈指针的值是递增的,所以指针值大的数据当然后出栈。 堆栈的作用: 局部变量的存储、函数调用时函数或子程序间数据的传递(形参的保存,其实函数调用一旦结束被
[单片机]
基于ESP8266和STM32单片机的程序代码编写
ESP8266模块在STM32上做Server时,外部对其端口进行收发数据的程序,大部分代码都备注了说明。 因为是从client代码改来的,所以函数名不去改它了。 #include“sta_tcpclent_test.h” #include “SysTick.h” #include “usart.h” #include “esp8266_drive.h” #include #include volaTIle u8 TcpClosedFlag = 0;//定义失去连接标志 void ESP8266_STA_TCPClient_Test(void) { u8 res; u32 ul=0; char str[100]={0},*
[单片机]
STM32串口发送不正常
很早就知道了这个问题,在串口写入时的速度和发送速度不一样,写入过快会丢失一部分,导致控制不正常。 为此每次写入前个检查USART_FLAG_TXE位是否为空,下次发送前检查USART_FLAG_TC位是否发送完。 程序可修改如下 USART_SendData(USART1,0xFF); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET);//是否为空 USART_SendData(USART1,0xFF); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);//是否发送完
[单片机]
对STM32的CAN1模块的总结
从12月中旬到现在一直都在调试板子,把F107上的CAN1(PD0,PD1)转移到F105上的CAN1(PB8, PB9),本来以为会是很简单的进行重映射就行了,但是生活处处是 充满“惊喜”啊! 在进行了重映射后发现CAN进不了中断,很郁闷!仔细检查了两个端点CAN的连接口后发现是没错的,但还是进 不了中断。那只能进行单步调试了,最后发现是在CAN的初始化模式成功后要进入正常模式时失败了,CAN的处理工 程是: 初始化模式:设置CAN_MCR 寄存器的INRQ 位为’1’ ,请求bxCAN进入初始化模式,然后等待硬件对CAN_MSR 寄存器的INAK 位置’1’ 来进行确认。当bxCAN处于初始化模式时,禁止报文的接收和发送,并
[单片机]
STM32学习4 复位
STM32F10XX支持三种复位形式,分别为系统复位,上电复位,备份区域复位。 当发生以下任一事件时,产生一个系统复位: 1,NRST引脚上的低电平复位 2,窗口看门狗计数终止(WWDG复位) 3,独立看门狗计数终止(IWDG复位) 4,软件复位(SW复位) 5,低功耗管理复位 三种不同的时钟源可被用来驱动系统时钟: 1,HSI振荡器时钟 2,HSE振荡器时钟 3,PLL时钟 AHB和APB2域的最大频率是72MHZ,APB1域的最大允许频率是36MHZ。SDIO接口的时钟频率固定为HCLK/2. 外部晶体/陶瓷谐振器:为4~16MHZ外部振荡器可为系统提供更为精确的主时钟。 内部PLL可以用来倍频HSI RC的输
[单片机]
stm32电机驱动与测速
通过实验发现,定时器的一个通道控制一个pwm信号。 PWM驱动电机不需要中断。 ① timer.h: #ifndef __TIMER_H #define __TIMER_H #include “sys.h” void TIM3_PWM_Init(u16 arr,u16 psc); #endif ② timer.c: #include “timer.h” #include “led.h” void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitT
[单片机]
STM32自锁如何解锁?(解锁方法)
在芯片锁住的时候,我们首先要查看是那种错误, 正常情况下,你在Keil下载时遇到错误应该是这样的 找不到Cortex™-M内核 Flash下载失败 打开J-Link-Commander 如果是正常,则是可以找到Cortex-M3/M4内核, 如果芯片自锁之后,会发现先是JTAG方式查找,之后SWD方式查找,最后找不到任何内核 以下问题为J-LINK能找到芯片时的异常错误: BOOT脚配置问题:对于STM32往往都有些BOOT配置脚。因为BOOT脚的焊接或接触不良或者BOOT引脚没有配置正确**,导致很多问题。这种情况多表现在芯片功能时好时坏,或者部分芯片正常,部分芯片异常。 启动文件问题:经常因为选错了启动文件,导
[单片机]
STM32 复用 与 重映射(USART Remap)
大家好,从今天开始.本人将自己在工作中遇到的问题 和学习体会 跟大家一起分享并探讨.下面跟大家说一下STM32单片机的端口重映射,因为是以自己为实例.这里是以USART1的重映射为例.. 因为我要一个TFT_LCD屏的主控板,考虑到FSMC 我选用了STM32F103VCT6 型号的CPU,一不小心串口接到USART1上了.因为在调程序时才发现错了,没得办法,只能通过端口重映射来解决.但是以前没用过端口重映射,只闻其名,未用其身,所以..呵呵 ...只能从头去看了. STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的
[单片机]