【问题标题】:Obtaining register address in STM32STM32中获取寄存器地址
【发布时间】:2021-12-30 18:13:22
【问题描述】:

我有一个简单的代码用于保存和以后使用寄存器地址:

PWMChannel::PWMChannel(TIM_HandleTypeDef *timer, int channel)
{
    switch(channel)
    {
    case 1: ccr = &(timer->Instance->CCR1); break;
    case 2: ccr = &(timer->Instance->CCR2); break;
    case 3: ccr = &(timer->Instance->CCR3); break;
    case 4: ccr = &(timer->Instance->CCR4); break;
    case 5: ccr = &(timer->Instance->CCR5); break;
    case 6: ccr = &(timer->Instance->CCR6); break;
    }
}

其中 ccr 是私有类成员: uint32_t *ccr = nullptr; 它用于像这样改变占空比:*ccr = duty;

前段时间我使用 System Workbench 时,上面的代码运行良好。最近我切换到 CubeIDE。将项目移植到新工具链的唯一问题是这个成员定义 - 它现在需要“volatile”,所以我将其更改为: volatile uint32_t *ccr = nullptr;

但是代码停止工作。调试显示,通道参数=4时,ccr值变为0x40。现在,0x40 是 CCR4 在 TIM_TypeDef 结构中的偏移量(由 Instance 引用),而不是 CCR4 的实际地址。如果这就是它应该的样子,那么为什么它以前可以工作,我该如何更改代码以使其再次工作?

【问题讨论】:

    标签: stm32


    【解决方案1】:

    好的,我想我知道发生了什么。

    有问题的对象是静态初始化的。不知何故,这个初始化发生在我在 System Workbench 下构建时的 MX_TIM1_Init() 调用(在 main.c 中)之后,以及在我在 CubeIDE 下构建的调用之前。 “Instance”字段还没有被调用的时间构造函数初始化,所以它得到了错误的寄存器地址。

    这不是我第一次按顺序进行初始化... :(

    我已经拥有大部分的全局对象,要么是动态分配的,要么是隐藏在单例模式的函数后面。不想为这个小助手对象这样做。

    如果有人认为这个问题没用,请告诉我,我会删除它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 2022-01-07
      • 2018-10-22
      • 2013-03-24
      • 2010-11-18
      相关资源
      最近更新 更多