当前位置: 首页 > news >正文

再学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为通用推挽输出模式,最大速度2MHzGPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13);GPIOC->CRH |= GPIO_CRH_MODE13_0;while (1){// 点亮LEDGPIOC->BRR = GPIO_Pin_13;Delay(100);// 熄灭LEDGPIOC->BSRR = GPIO_Pin_13;Delay(100);}
}

http://www.xdnf.cn/news/221779.html

相关文章:

  • 系统设计中三高指什么
  • OpenGL学习笔记(PBR)
  • LayerSkip: Enabling Early Exit Inference and Self-Speculative Decoding
  • 大模型与MCP:重塑AI应用的新篇章
  • 手动安装OpenSSL1.1.1
  • 【深度解析】YOLOE登场:CNN路线的开放世界新答卷,超越YOLO-World与Transformer
  • 去哪儿旅行 Bella Pre 分析
  • (003)Excel 在滚动的时候,保持标题栏可见
  • 论文阅读的三个步骤
  • nextcloud私有网盘系统搭建
  • 【AI提示词】第一性原理
  • Laravel基础
  • 基于PLC的图书管理识别系统设计
  • 修复典籍知识问答典籍管理界面典籍不能正确加载的问题
  • IAP远程升级入门讲解
  • 第十五章-PHP文件编程
  • Docker与Vmware网络模式的对别
  • softlockup_panic=1配置方法及区别
  • 天猫店铺代运营公司推荐与服务内容解析
  • 【进程与线程】
  • Linux权限管理进阶:文件归属、特殊权限与ACL详解
  • 力扣面试150题--删除链表的倒数第 N 个结点
  • 代发考试战报:4月份 思科认证,华为认证,考试战报分享
  • 不同类型插槽的声明方法和对应的调用方式
  • 题目:胖达的山头
  • 关于php-fpm的调优和配置
  • 2025年渗透测试面试题总结-拷打题库26(题目+回答)
  • AXPA17388: 4x45W 车用AB类四通道桥式输出音频功率放大器
  • MLOps全链路能力:模型监控、版本回滚与持续训练
  • 欧拉计划 Project Euler60(素数对集合)题解