前言
在最初学习STM32的过程中,由于知识不进脑子,经常边学边忘,并且C语言学习的也比较浅,涉及到指针地址等方面的知识,内心就有点排斥。
第一次遇到 -> 和 . 这两种操作符时,我只是知道按照示例“照着用”,但并不清楚它们之间的具体区别,也没有深入理解它们的内在逻辑。这样的学习方式让我很容易陷入“知道怎么用,却不知道为什么”的状态。
今天在实际开发中再次遇到这两个操作符时,我发现仍旧无法清晰地解释它们的区别和适用场景。于是,我决定花时间好好研究一番。通过梳理这些基础概念,希望不仅能彻底搞清楚 -> 和 . 的用法,还能深化对指针和地址的理解,夯实自己在嵌入式开发中的基础知识。
接下来的文章将通过 TIM2->CCR2 与 TIM2.CCR2 的区别这一实际问题为切入点,详细解析 -> 和 . 两种操作符的用法和应用场景,帮助初学者更直观地理解它们在 STM32 开发中的具体用途和背后的逻辑。
TIM2->CCR2 与 TIM2.CCR2 的区别与对比说明
在 STM32 的开发中,寄存器操作通过定时器的基地址映射和结构体定义实现。两种操作符 ->
和 .
的使用情况需要具体区分,分别应用于不同的环境。以下将详细说明它们的区别、基地址映射的原理,以及应用场景。
概念
. 操作符:用于访问结构体实例
的成员。在使用它时,结构体变量必须是直接定义的实例,而不是一个指针。
-> 操作符:用于访问指针指向的结构体的成员。在使用它时,必须有一个结构体指针
,该指针指向一个有效的结构体对象或内存区域。
1. 基地址映射原理
在 STM32 中,每个外设(如定时器 TIM2)都有一个固定的基地址,用于唯一标识硬件寄存器的起始地址。为了便于开发,CMSIS(Cortex Microcontroller Software Interface Standard)框架通过结构体定义寄存器布局,并将这些基地址与结构体进行映射。
基地址映射的具体过程
-
寄存器基地址的定义:
- 每个外设在芯片手册中都有对应的基地址。例如,TIM2 的基地址为:
#define TIM2_BASE (APB1PERIPH_BASE + 0x0000)
APB1PERIPH_BASE
是 APB1 总线的基地址,而0x0000
是 TIM2 的偏移量。
- 每个外设在芯片手册中都有对应的基地址。例如,TIM2 的基地址为:
-
基地址与结构体的结合:
- 通过将 TIM2 的基地址强制转换为指向
TIM_TypeDef
结构体的指针,实现基地址到寄存器的映射:#define TIM2
- 通过将 TIM2 的基地址强制转换为指向