再学GPIO(三)

GPIOx_BRR

寄存器作用

GPIOx_BRR(Bit Reset Register)是 STM32 中专门用于 原子操作清除 GPIO 引脚输出电平(即置低)的寄存器。其核心功能包括:

  • 单引脚或多引脚快速置低:通过写入对应位为 1,直接拉低指定引脚电平。

  • 原子性操作:无需读-改-写流程,避免多线程或中断环境下的数据竞争。

  • 硬件效率优化:相比直接操作 ODR 或 BSRR,代码更简洁且执行速度更快。

地址偏移:0x14 复位值:0x0000 0000

寄存器结构

位域

    • 低 16 位有效(对应 Pin 0 ~ Pin 15),每位控制一个引脚的清除操作:

      • BRy = 1(Bit Reset for Pin y):对应引脚输出低电平(ODRy = 0)。

      • BRy = 0:无影响。

    • 高 16 位保留(通常写入无效)。

配置模式详解

例1

将 PA6 置低。

GPIOA->BRR = (1 << 6);  // 写入 BR6=1,PA6 输出低电平

例2

将 PB3、PB5、PB7 同时置低。

GPIOB->BRR = (1 << 3) | (1 << 5) | (1 << 7);  
// 等效于 PB3=0, PB5=0, PB7=0

例3

快速切换 PC4 电平(高 → 低 → 高)。

GPIOC->BSRR = (1 << 4);   // PC4 置高(BSRR 低16位)
delay_ms(100);
GPIOC->BRR = (1 << 4);    // PC4 置低
delay_ms(100);

GPIOx_LCKR

寄存器作用

GPIOx_LCKR(Lock Register)用于 锁定 GPIO 端口的配置,防止后续软件意外修改引脚的工作模式(如输入/输出模式、速度、复用功能等)。锁定后,相关配置寄存器(如 GPIOx_CRLGPIOx_CRH)将无法被修改,直到下次系统复位。

  • 保护关键引脚的配置(如安全控制引脚)。

  • 防止多任务环境下配置被意外篡改。

  • 确保实时性要求高的引脚配置稳定。

地址偏移:0x18 复位值:0x0000 0000

 寄存器结构

位域

位域名称描述
LCKKBit 16锁定键:写 1 使能锁定操作,写 0 无效。需按特定顺序写入。
LCKyBit 0~15引脚锁定位:对应 Pin 0~15。写 1 锁定引脚配置,写 0 无影响。

配置模式详解

锁定步骤

  1. 设置目标引脚锁定位(LCKy=1):选择需要锁定的引脚(可同时锁定多个)。

  2. 置位锁定键(LCKK=1):向 LCKK 位写 1

  3. 清零锁定键(LCKK=0):向 LCKK 位写 0

  4. 再次置位锁定键(LCKK=1):向 LCKK 位写 1

  5. 读取锁定键(LCKK)确认:若 LCKK 位为 1,表示锁定成功。

锁定 PA0 和 PA2 的配置

// 步骤1:设置 LCK0 和 LCK2 为 1(锁定 PA0 和 PA2)
GPIOA->LCKR = GPIO_LCKR_LCK0 | GPIO_LCKR_LCK2;

// 步骤2:置位锁定键(LCKK=1)
GPIOA->LCKR = GPIO_LCKR_LCK0 | GPIO_LCKR_LCK2 | GPIO_LCKR_LCKK;

// 步骤3:清零锁定键(LCKK=0)
GPIOA->LCKR = GPIO_LCKR_LCK0 | GPIO_LCKR_LCK2;

// 步骤4:再次置位锁定键(LCKK=1)
GPIOA->LCKR = GPIO_LCKR_LCK0 | GPIO_LCKR_LCK2 | GPIO_LCKR_LCKK;

// 步骤5:读取 LCKK 确认锁定成功
if (GPIOA->LCKR & GPIO_LCKR_LCKK) {
    // 锁定成功
}

实践

实现LED闪烁实验

使用标准库实现

#include "stm32f10x.h"
#include "delay.h"

int main(void)
{
	Delay_Init();
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 开启GPIOC的时钟
	
	GPIO_InitTypeDef GPIO_InitStruct;
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	
	GPIO_Init(GPIOC, &GPIO_InitStruct);
	
	// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
	
	// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
	
	while(1)
	{
		GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); // 亮
		
		Delay(100); 
		
		GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // 灭
		
		Delay(100); 
	}
}

操作GPIO寄存器实现

#include "stm32f10x.h"
#include "delay.h"

int main(void) {
    // 使能GPIOC时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

    // 配置PC13为通用推挽输出模式,最大速度2MHz
    GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13);
    GPIOC->CRH |= GPIO_CRH_MODE13_0;

    while (1)
    {
        // 点亮LED
        GPIOC->BRR = GPIO_Pin_13;
        Delay(100);

        // 熄灭LED
        GPIOC->BSRR = GPIO_Pin_13;
        Delay(100);
    }
}

### STM32 GPIO 习教程 #### 一、GPIO基本概念 STM32中的GPIO(通用输入输出端口)是用于与外部世界交互的重要接口。通过配置不同的模式和属性,可以实现对外部设备的控制或读取其状态[^4]。 #### 二、GPIO引脚配置选项 对于每一个GPIO引脚来说,在实际应用中可以通过设置相应的寄存器来改变它的功能特性。具体而言: - **模式(Mode)**:决定该引脚作为输入还是输出;还可以进一步细分为模拟输入、推挽输出等多种工作方式。 - **速度(Speed)**:当设定为输出时有效,用来指定信号切换的最大频率范围。 - **上下拉电阻**:可以选择是否启用内部上拉/下拉电阻以稳定未驱动状态下电平[^1]。 #### 、实例分析——光敏传感器初始化函数解析 考虑一段针对特定应用场景下的代码片段,即如何利用上述知识点完成对连接于PB13上的光敏元件进行初始化操作: ```c void LightSensor_Init(void) { /* 开启时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* 配置GPIO结构体并调用库函数执行初始化 */ GPIO_InitTypeDef GPIO_InitStructure; // 设置成上拉输入模式 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO📐⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗⚗📐 def(); } ``` 此部分展示了怎样基于之前提到的原则去构建具体的程序逻辑,特别是关于`GPIO_Mode_IPU`的选择以及为何要特别处理PB13这个特殊位置的信息[^2]。 #### 四、常见错误及其解决方案 在编写涉及浮点运算单元(FPU)相关汇编指令的过程中可能会遇到类似于“unknown register name 'vfpcc' in asm”的报错提示。这类问题往往是因为编译工具链版本不匹配或是项目工程配置不当所引起的。建议检查当前使用的IDE版本和支持文档,确保所有组件都处于最新且兼容的状态[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值