这里有一个带有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
返回请求的寄存器的方式,但我不知道如何解决这个问题。我只在笔记本电脑上测试过。我不知道它是否会导致实际硬件出错。