首页 > 其他分享 >《STM32开发:深入解析 TIM2->CCR2 与 TIM2.CCR2 的区别与应用》

《STM32开发:深入解析 TIM2->CCR2 与 TIM2.CCR2 的区别与应用》

时间:2025-01-13 19:58:23浏览次数:3  
标签:TIM2 STM32 访问 CCR2 操作符 寄存器 指针

前言

在最初学习STM32的过程中,由于知识不进脑子,经常边学边忘,并且C语言学习的也比较浅,涉及到指针地址等方面的知识,内心就有点排斥。

第一次遇到 -> 和 . 这两种操作符时,我只是知道按照示例“照着用”,但并不清楚它们之间的具体区别,也没有深入理解它们的内在逻辑。这样的学习方式让我很容易陷入“知道怎么用,却不知道为什么”的状态。

今天在实际开发中再次遇到这两个操作符时,我发现仍旧无法清晰地解释它们的区别和适用场景。于是,我决定花时间好好研究一番。通过梳理这些基础概念,希望不仅能彻底搞清楚 -> 和 . 的用法,还能深化对指针和地址的理解,夯实自己在嵌入式开发中的基础知识。

接下来的文章将通过 TIM2->CCR2 与 TIM2.CCR2 的区别这一实际问题为切入点,详细解析 -> 和 . 两种操作符的用法和应用场景,帮助初学者更直观地理解它们在 STM32 开发中的具体用途和背后的逻辑。


TIM2->CCR2 与 TIM2.CCR2 的区别与对比说明

在 STM32 的开发中,寄存器操作通过定时器的基地址映射和结构体定义实现。两种操作符 ->. 的使用情况需要具体区分,分别应用于不同的环境。以下将详细说明它们的区别、基地址映射的原理,以及应用场景。

概念

. 操作符:用于访问结构体实例的成员。在使用它时,结构体变量必须是直接定义的实例,而不是一个指针。
-> 操作符:用于访问指针指向的结构体的成员。在使用它时,必须有一个结构体指针,该指针指向一个有效的结构体对象或内存区域。


1. 基地址映射原理

在 STM32 中,每个外设(如定时器 TIM2)都有一个固定的基地址,用于唯一标识硬件寄存器的起始地址。为了便于开发,CMSIS(Cortex Microcontroller Software Interface Standard)框架通过结构体定义寄存器布局,并将这些基地址与结构体进行映射。

基地址映射的具体过程
  1. 寄存器基地址的定义

    • 每个外设在芯片手册中都有对应的基地址。例如,TIM2 的基地址为:
      #define TIM2_BASE (APB1PERIPH_BASE + 0x0000)
      
      APB1PERIPH_BASE 是 APB1 总线的基地址,而 0x0000 是 TIM2 的偏移量。
  2. 基地址与结构体的结合

    • 通过将 TIM2 的基地址强制转换为指向 TIM_TypeDef 结构体的指针,实现基地址到寄存器的映射:
      #define TIM2 ((TIM_TypeDef *) TIM2_BASE)
      
    • 这样,TIM2 成为一个指针,指向定时器 2 的寄存器映射区域。
  3. 寄存器结构体的定义

    • TIM_TypeDef 为例,结构体定义了定时器寄存器的布局,每个成员代表一个寄存器,其偏移量按芯片手册的规定排列:
      typedef struct {
          __IO uint32_t CR1;    // Offset: 0x00
          __IO uint32_t CR2;    // Offset: 0x04
          __IO uint32_t SMCR;   // Offset: 0x08
          ...
          __IO uint32_t ARR;    // Offset: 0x2C
          __IO uint32_t CCR2;   // Offset: 0x38
          ...
      } TIM_TypeDef;
      
  4. 访问寄存器的地址计算

    • 例如,访问 TIM2->CCR2 实际等价于访问物理地址:
      TIM2_BASE + 0x38
      
      注意
      TIM2->ARR 的值不是一个指针,而是寄存器地址的直接映射
      直接用于赋值操作即可。不需要 *(TIM2->ARR) = 1000;
    • 编译器会根据 TIM2->ARR = ARR_Value;
      翻译成对具体硬件地址的写操作。
    • 翻译前
      TIM2->ARR = ARR_Value; 
      
    • 编译器将翻译为:
      *(TIM2_BASE + 0x2C) = ARR_Value;
      

2. TIM2->CCR2 的应用

TIM2->CCR2 是标准的寄存器访问方式,用于裸机开发环境。特点如下:

语法和功能:
  • TIM2 是一个指针,指向 TIM_TypeDef 结构体。
  • -> 是指针成员访问操作符,用于访问指针指向的结构体成员。
  • TIM2->CCR2 直接访问硬件的捕获/比较寄存器 2。
示例代码:
TIM2->CCR2 = 200;           // 设置捕获/比较寄存器 2 的值为 200
uint32_t value = TIM2->CCR2; // 读取捕获/比较寄存器 2 的值
底层工作机制:
  • TIM2->CCR2 实际上访问的是寄存器的物理地址 TIM2_BASE + 0x38
适用场景:
  • 裸机开发中直接操作寄存器,例如配置 PWM 信号的占空比。

3. TIM2.CCR2 的应用

TIM2.CCR2 使用点操作符 .,用于非指针的结构体实例。与 TIM2->CCR2 相比,它不能直接应用于裸机开发环境,但在以下情况中可能使用:

语法和功能:
  • . 是结构体实例的成员访问操作符,用于访问结构体的成员。
  • 适用于非指针结构体变量的场景。
示例代码:
TIM_TypeDef tim2_instance;     // 创建一个结构体实例
tim2_instance.CCR2 = 200;      // 设置实例的 CCR2 值为 200
uint32_t value = tim2_instance.CCR2; // 读取实例的 CCR2 值
注意事项:
  • 在裸机开发中,TIM2 是一个指针而非结构体实例,因此不能使用点操作符。
  • TIM2.CCR2 会导致编译器报错:
    error: request for member 'CCR2' in something not a structure or union
    
适用场景:
  • 模拟外设寄存器的逻辑测试环境(非硬件环境)。
  • 某些高级抽象层(如 HAL 或 LL 库)可能会间接使用结构体实例。

4. TIM2->CCR2 与 TIM2.CCR2 的对比

特性TIM2->CCR2TIM2.CCR2
语法合法性合法,标准用法非法,裸机开发中不能使用
定义要求TIM2 是指针(TIM_TypeDef *TIM2 是非指针结构体实例
适用场景裸机开发,直接操作寄存器模拟环境或高级封装的测试
访问方式通过基地址指针访问寄存器(直接与硬件交互)通过结构体实例访问(不直接与硬件交互)
效率高效,直接访问硬件寄存器不适用裸机寄存器访问

5. 扩展说明:HAL 与 LL 库的封装

在实际开发中,为了简化寄存器操作,STM32 提供了 HAL 和 LL 库,对寄存器访问进行了封装。例如:

HAL 封装:

HAL 使用定时器句柄间接访问寄存器:

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 200); // 设置捕获/比较寄存器 2 的值
uint32_t value = __HAL_TIM_GET_COMPARE(&htim2, TIM_CHANNEL_2); // 获取捕获/比较值
LL 封装:

LL 库提供更接近寄存器的访问方式:

LL_TIM_OC_SetCompareCH2(TIM2, 200); // 设置捕获/比较寄存器 2 的值
uint32_t value = LL_TIM_OC_GetCompareCH2(TIM2); // 获取捕获/比较值

尽管封装简化了开发,但底层依然依赖于 TIM2->CCR2 的直接操作。


6. 结论

  • TIM2->CCR2 是裸机开发中的合法写法,直接操作硬件寄存器,是高效的寄存器访问方式。

  • TIM2.CCR2 是非法的,因为 TIM2 是指针,不能用点操作符访问其成员。

  • 高级开发中可以通过 HAL 或 LL 库封装间接访问寄存器,但最终仍依赖于 TIM2->CCR2 的底层实现。

  • 了解基地址映射和操作符的使用区别,有助于在不同开发场景中选择合适的方式。

  • 选择操作符的原则:
  • 使用 .:当操作的是一个普通的结构体变量时。

  • 使用 ->:当操作的是一个结构体指针时。

嵌入式开发中的推荐:
  • 寄存器访问:绝大部分场景下需要通过指针进行访问,推荐使用 -> 操作符。
  • 模拟或测试:在非硬件场景中,可以使用普通结构体变量和 . 操作符。

通过正确选择 .-> 操作符,可以有效避免语法错误,提升代码的可读性与可靠性。特别是在嵌入式开发中,理解这两种操作符的区别和适用场景是入门开发的重要一步。

标签:TIM2,STM32,访问,CCR2,操作符,寄存器,指针
From: https://blog.csdn.net/weixin_74352771/article/details/145121504

相关文章

  • STM32之LWIP网络通讯设计-下(十五)
    STM32F407系列文章-ETH-LWIP(十五)目录前言一、软件设计二、CubeMX实现1.配置前准备2.CubeMX配置1.ETH模块配置2.时钟模块配置3.中断模块配置4.RCC及SYS配置5.LWIP模块配置3.生成代码1.main文件2.用户层源文件3.用户层头文件4.效果演示三、移植实现总结......
  • 基于STM32F103标准库实现FFT,并实现音乐频谱绘制
    整个工程文件是在江科大的OLED显示屏OLED-V2.0版本IIC四针脚接口UTF-8的工程上编写的,在屏幕显示过程中,只用到了OLED显示屏的绘制直线和绘制像素点两个函数(注意,显示屏的绘制函数坐标可以任意指定,而不是按页写入。任一屏幕只要有上述两个函数均可使用。工程接线:STM32F103C8T6......
  • 【江协STM32】11-1 SPI通信协议
    SPI(SerialPeripheralInterface)是由Motorola公司开发的一种通用数据总线四根通信线:SCK(SerialClock)、MOSI(MasterOutputSlaveInput)、MISO(MasterInputSlaveOutput)、SS(SlaveSelect)同步,全双工支持总线挂载多设备(一主多从)         1. 硬件电路所有SPI设......
  • STM32 HAL库函数入门指南:从原理到实践
    1STM32HAL库概述STM32HAL(HardwareAbstractionLayer)库是ST公司专门为STM32系列微控制器开发的一套硬件抽象层函数库。它的核心设计理念是在应用层与硬件层之间建立一个抽象层,这个抽象层屏蔽了底层硬件的具体实现细节,为开发者提供了一套统一的、标准化的应用程序接口(API)......
  • STM32中的内存映射
     STM32中的内存映射在STM32中,内存映射通常如下:Flash:存储.text段(代码)、.rodata段(只读数据)和.data段的初始值。RAM:存储.data段(运行时)、.bss段、栈和堆。4. 程序启动过程在STM32中,程序启动时会发生以下操作:从Flash中加载.data段的初始值到RAM。将.bss......
  • 【STM32】利用SysTick定时器定时1s
    1.SysTick简单介绍SysTick定时器是一个24位的倒计数定时器,当计数到0时,将从RELOAD寄存器中自动重装载定时初值,开始新一轮计数。SysTick定时器用于在每隔一定的时间产生一个中断,即使在系统睡眠模式下也能工作。关于SysTick详细说明,请查看该文章:STM32—delay和操作系统共用Sys......
  • STM32之LWIP网络通讯设计-上(十四)
    STM32F407系列文章-LWIP-Network(十四)目录前言一、以太网简介二、网络协议简介1.OSI模型2.TCP/IP协议3.协议层报文间的封装与拆封4.lwIP1.lwIP特性2.lwIP开源网址3.lwIP参考书籍三、通讯连接示意四、STM32内部ETH 1.内部MAC2.内部DMA五、PHY驱动芯片1.功......
  • SENT协议深度解析-----使用STM32发送SENT信号
    一、SENT信号的结构在上一期中,我们介绍了SENT信号的接收,这一期我们来讲解一下SENT信号的发送,在讲解之前,我们需要先了解一下SENT信号的结构,SENT信号分为两种类型:快速通道类型、慢速通道类型,慢速通道分为短串行数据、增强串行数据,一共三种信号结构发送方式,在汽车MCU领域中,SEN......
  • 【STM32】MCU运行多段代码,Flash程序更新的实现方式之一
    【STM32】MCU运行多段代码,Flash程序更新的实现方式之一文章目录BootLeader跳转到BootLeader跳转到Flash其他位置MCU运行多段代码其他程序更新烧录方式附录:Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时......
  • STM32垃圾分类系统设计与实现
    引言垃圾分类作为现代环保和资源回收的重要环节,已经成为了各地政府和环保组织高度关注的议题。合理的垃圾分类不仅能够有效减少垃圾的填埋量,还能提高资源的回收利用率,减少环境污染。随着物联网技术的发展,智能垃圾分类系统的设计和实现成为了当前研究的热点。本文将介绍如......