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

关于STM32在代码中的而GPIO里面的寄存器(ODR等)不需要宏定义的问题

1.GPIO为什么需要宏定义地址

在 STM32 这样的微控制器中,硬件寄存器的地址是固定的并且特定于每个外设(比如 GPIOA、GPIOB 等)。为了方便代码访问这些硬件寄存器,我们通常会使用宏定义来指定每个外设的基地址。这样做有几个理由:

  • 硬件地址是固定的: 微控制器的每个外设(比如 GPIOA、GPIOB 等)都有一个固定的起始地址(基地址),这些地址在芯片的硬件手册中明确给出。例如,GPIOA 可能有一个固定的基地址,比如 0x40010800

  • 代码便于移植: 使用宏定义可以让代码更加灵活。例如,如果你将代码移植到不同型号的 STM32 设备上,不同型号的设备可能会有不同的外设基地址。通过宏定义,可以方便地修改这些基地址,而不需要修改代码中每个寄存器访问的地方。

  • 简化代码: 使用宏定义可以简化代码的书写和阅读。我们直接使用 GPIOA_BASE 而不是手动输入每个寄存器的地址。

因此,GPIOA 需要宏定义一个地址是因为它是外设的基地址,代码通过这个基地址来访问 GPIOA 外设的寄存器。

你也可以不定义,那就需要输入地址再访问了,比如:

2. 为什么不需要为 BSRR定义宏地址

从下图可以看到,我所查找的的BSRR只是一个宏定义,找不到他的地址值了,为什么呢?

GPIOA->BSRR的访问并不需要为 BSRR寄存器单独定义一个地址,因为:已经包含了所有寄存器字段的偏移量定义。例如,BSRR寄存器的地址会是 GPIOA_BASE + 0x10(这是在硬件手册中定义的)。

  • 结构体的每个字段(例如 ODR)会自动偏移至相应的地址,而不需要为每个字段单独定义一个宏。

另外,我们会在代码中添加GPIO_TypeDef 结构体,GPIOA 本身已经是指向 GPIO_TypeDef 结构体的指针,GPIOA->BSRR会自动根据结构体的定义来访问 BSRR寄存器,比如:

三、为什么GPIOA->BSRR=1不会改变他的地址值

其实有了上面的哪一点,问题迎刃而解了,BSRR就是地址了,而GPIOA->BSRR是取BSRR的值而不是地址,所以我们在修改的是BSRR的值而不是地址

http://www.lryc.cn/news/477909.html

相关文章:

  • 【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十七章 交叉编译QT工程
  • 高效率的快捷回复软件 —— 客服宝聊天助手
  • Node.js + MongoDB + Vue 3 全栈应用项目开发
  • 【云原生开发】如何通过client-go来操作K8S集群
  • CSS基础知识六(浮动的高度塌陷问题及解决方案)
  • 开源模型应用落地-glm模型小试-glm-4-9b-chat-vLLM集成(四)
  • .net为什么要在单独的项目中定义扩展方法?C#
  • 动态规划 —— dp 问题-打家劫舍II
  • Java基础-组件及事件处理(上)
  • Python实例:爱心代码
  • 图解大模型训练系列:序列并行3,Ring Attention
  • pyspark基础准备
  • Netty报错
  • Kafka 之顺序消息
  • Kafka 之批量消息发送消费
  • 【大数据学习 | kafka】kafka的偏移量管理
  • 实景三维赋能森林防灭火指挥调度智慧化
  • 【C++课程学习】:string的模拟实现
  • Linux(VMware + CentOS )设置固定ip
  • 安卓 android studio各版本下载地址(官方)
  • 如何在一个 Docker 容器中运行多个进程 ?
  • poetry 配置多个cuda环境心得
  • 网络编程入门
  • Linux-socket详解
  • SQL Server 2022安装要求(硬件、软件、操作系统等)
  • “众店模式”:创新驱动下的商业新生态
  • 54. 螺旋矩阵
  • 剧本杀小程序,市场发展下的新机遇
  • 【系统架构设计师】论文:论基于 ABSD 的软件开发
  • 为什么OLED透明屏在同类产品中显示效果最好