首先,
typedef struct
{
vu32 CRL;
vu32 CRH;
vu32 IDR;
vu32 ODR;
vu32 BSRR;
vu32 BRR;
vu32 LCKR;
} GPIO_TypeDef;
BSRR和BRR寄存器是32位的。
比较:
1)置GPIOA->BSRR低16位的某位为'1',则对应的I/O端口管脚置'1';
置GPIOA->BSRR低16位的某位为'0',则对应的I/O端口管脚保持不变。
2)置GPIOA->BSRR高16位的某位为'1',则对应的I/O端口管脚置'0';
置GPIOA->BSRR高16位的某位为'0',则对应的I/O端口管脚保持不变。
3)置GPIOA->BRR低16位的某位为'1',则对应的I/O端口管脚置'0';
置GPIOA->BRR低16位的某位为'0',则对应的I/O端口管脚保持不变。
例如:
1)要设置端口A的D0、D5、D10、D11为高,而保持其它I/O口不变,则
GPIOA->BSRR = 0x0C21(0000 1100 0010 0001);
反过头来再好好消化上述第1条特征!!!
2)要设置端口A的D1、D3、D14、D15为低,而保持其它I/O口不变,则
GPIOA->BRR = 0xC00A;
假设有16位data需要写入高8位的数据,则
GPIO_SetBits(GPIOA, data & 0xff00);
GPIO_ResetBits(GPIOA, (~data & 0xff00));
也可以直接操作这两个寄存器:
GPIOA->BSRR = data & 0xff00;
GPIOA->BRR = ~data & 0xff00;
关键字:STM32 GPIO BSRR BRR寄存器
引用地址:
关于STM32_GPIO的BSRR和BRR寄存器
推荐阅读最新更新时间:2024-03-16 16:12
STM32外部中断学习笔记
中断 分类 STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。 STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18: 线0~15:对应外部 IO口的输入中断。 线16:连接到 PVD 输出。 线17:连接到 RTC 闹钟事件。 线18:连接到 USB 唤醒事件。 触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。 外部中断分组:STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0
[单片机]
STM32怎么读取输出口电平
其实你自己在库函数源文件也能找到,以PC13为例: 要是你设置为输入: GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);//读取输入口PC13值 要是你设置为输出: GPIO_ReadOutputDataBit (GPIOC,GPIO_Pin_13); //读取输入口PC13值 我看的原函数,两个读取函数操作区别在于读取的寄存器不一样,分别是: GPIOx- IDR GPIOx- ODR
[单片机]
一步步写STM32 OS【三】PendSV与堆栈操作
一、什么是PendSV PendSV是可悬起异常,如果我们把它配置最低优先级,那么如果同时有多个异常被触发,它会在其他异常执行完毕后再执行,而且任何异常都可以中断它。更详细的内容在《Cortex-M3 权威指南》里有介绍,下面我摘抄了一段。 OS 可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动 作。悬起 PendSV 的方法是:手工往 NVIC的 PendSV悬起寄存器中写 1。悬起后,如果优先级不够 高,则将缓期等待执行。 PendSV的典型使用场合是在上下文切换时(在不同任务之间切换)。例如,一个系统中有两个就绪的任务,上下文切换被触发的场合可以是: 1、执行一个系统调用 2、系统滴答定时器(S
[单片机]
简化和加快最终产品开发速度,STM32 探索套件问市
为了简化物联网节点开发者面临的复杂软件的开发难题,意法半导体推出了B-L4S5I-IOT01A STM32探索套件。新套件包含经过相关标准认证的FreeRTOS™操作系统编程接口,该编程接口完全集成在STM32Cube开发生态系统内,可直连亚马逊云服务Amazon Web Services (AWS)。 硬件工具包括一块STM32L4+微控制器开发板,板载意法半导体的各种MEMS传感器,以及STSAFE-A110安全单元、Bluetooth® 4.2 模块、Wi-Fi®模块,以及用于低功耗上云的有印刷天线的NFC标签。配备了X-CUBE-AWS v2.0 STM32Cube Expansion Pack软件包,该开发套件
[单片机]
STM32 按键扫描方式 使用ST3.0.0库
用到GPIO的操作模式 ======================================================================================== GPIO置1操作: void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 例如: GPIO_SetBits(GPIOC, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5); 这个函数是对一组端口的一些位置1,对PC3 PC4 PC53个引脚一起置1。GPIO_SetBits的作用是对一个端口16个引脚一起赋值。 例如:端口 GPIOC端
[单片机]
semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机
使用ITM机制实现调试stm32单片机,实现printf与scanf。 1. ITM简介 ITM机制是一种调试机制,是新一代调试方式,在这之前,有一种比较出名的调试方式,称为半主机(semihosting)方式。 在pc上编写过C语言的人都知道,printf可以向控制台输出,scanf可以从控制台获取输入,这里的printf/scanf都是标准库函数,利用操作系统的这些函数,我们可以很方便的调试程序。在嵌入式设备上(如stm32单片机平台上)开发工具(如MDK/IAR)也都提供了标准库函,自然也提供了printf/scanf函数,那么这些函数是否可以使用呢? 问题来了,printf向哪里输出呢?并且大部分情况下,也没有键盘,又如何
[单片机]
STM32单片机串口空闲中断接收不定长数据
在使用单片机的串口通信功能时,常用的接收数据方法是通过固定的字节数来判断一帧数是否发送完成,或者是通过固定的结束标志位来表示一帧数据发送完成。但是有时候会遇到发送的数据长度不固定,也没有固定的结束标志,对于这样的数据通常的做法是每隔一段时间查看一下接收数据的长度是否发生了变化,如果指定的一段时间内接收数据长度没有发生变化,就认为是一帧数据发送完成。在STM32单片机中串口提供了一个更好用的功能,就是空闲中断功能。也就是说当一帧数据发送结束后,就会产生一个空闲中断。这样就可以利用这个空闲中断来判断一帧数据接收是否完成。 关于串口空闲检测可以在STM32参考手册上找到相关介绍 通过这个图可以看出来,当第一组数据Data1、Da
[单片机]
STM32裸机编程的基础知识(2)
在前一篇文章中我们已经学习到可以通过直接访问存储地址来读写外设寄存器,下面复习下将 GPIO A3 设为输出模式的代码: * (volatile uint32_t *) (0x40020000 + 0) &= ~(3 6); // CLear bit range 6-7 * (volatile uint32_t *) (0x40020000 + 0) |= 1 6; // Set bit range 6-7 to 1 这段代码有些诡秘,如果不加以注释,很难理解。我们可以把这段代码重写成更易读的形式,方法就是用一个包含 32 位域的结构体来表示整个外设。我们来看一下数据手册 8.4 节中描述的 GPIO 外设的寄存器
[单片机]