如何为一组硬件寄存器编写包装类

时间:2013-11-15 11:42:57

标签: c++ hardware

这里有一个带有SPI硬件的Cortex-M4。 SPI支持在特定寄存器(CTARn)中定义的不同传输格式。使用值中的一组位将数据写入SPI缓冲区(CTAR)时定义了传输中使用的PUSHR。具有这些寄存器的结构可能如下所示:

struct SPI_REGS
{
  volatile uint32_t PUSHR;
  volatile uint32_t CTAR0;
  volatile uint32_t CTAR1;
};

我想写一个模板化的类来使用SPI。其中一个模板参数是允许类使用的CTAR的编号:

template<SPI_REGS* spi, uint8_t n>
class usesTheSpi
{
  usesTheSpi()
  {
    spi->CTAR[n] = someSettings;
  }
};

使用下标运算符访问CTAR需要一个提供它的类:

template<SPI_REGS* spi>
class CTARn
{
  volatile uint32_t& operator[](uint8_t n) {return ((volatile uint32_t*)spi->CTAR0)[n];}
};

SPI类需要类型CTARn的成员来提供这种访问,但我无法弄清楚如何在那里获取它。我仍然想在SPI.CTAR0 = 0中使用普通寄存器。


编辑:这和我一样接近。它编译,但main()中的第二行导致分段错误:

#include <stdint.h>

struct SPI_HW_REGS
{
  volatile uint32_t CTAR0;
  volatile uint32_t CTAR1;
  volatile uint32_t PUSHR;
} __attribute__((packed));

template<SPI_HW_REGS* base>
class SPI : public SPI_HW_REGS
{
  class CTARn
  {
    public:
      volatile uint32_t& operator[](const uint8_t& i) const
      {
        return ((volatile uint32_t*)base->CTAR0)[i & 1];
      }
  };
  public:
    CTARn CTAR;
};

SPI_HW_REGS SPI0_REGS; // dummy set of memory mapped registers
SPI<&SPI0_REGS>& SPI0 = *((SPI<&SPI0_REGS>*)&SPI0_REGS);

#include <iostream>

using namespace std;

int main()
{
  SPI0.CTAR0 = 0x55;
  cout << "CTAR[0] = " << hex << "0x" << SPI0.CTAR[0] << endl;
    return 0;
}

我认为这是我使用base->CTAR0返回请求的寄存器的方式,但我不知道如何解决这个问题。我只在笔记本电脑上测试过。我不知道它是否会导致实际硬件出错。

0 个答案:

没有答案