嵌入式之读写寄存器
方式一:结构体
typedef struct
{
__IO uint32_t CTRLR0;
__IO uint32_t CTRLR1;
__IO uint32_t SSIENR;
__IO uint32_t MWCR;
__IO uint32_t SER;
__IO uint32_t BAUDR;
__IO uint32_t TXFTLR;
__IO uint32_t RXFTLR;
__I uint32_t TXFLR;
__I uint32_t RXFLR;
__I uint32_t SR;
__IO uint32_t IMR;
} SPI_TypeDef;
#define SPI0_BASE 0xffff0000
#define SPIO ((SPI_TypeDef *)SPI0_BASE)
SPI_TypeDef *SPIO;
//写寄存器
SPI0->BAUDR = 0x55;
//读寄存器
int a = SPI0->SER;
这里的SPI0->BAUDR和SPI0->SER,其实就是个变量,只不过他们经过上面的定义后,地址被指定了。
方式二:宏
#define CTRLR0 0xffff0000
#define CTRLR1 0xffff0004
#define SSIENR 0xffff0008
#define OUT(reg, data) ( (*( (volatile unsigned int *) (reg) ) ) = (unsigned int)(data) )
typedef struct
{
__IO uint64_t cr0;
__IO uint64_t cr1;
__IO uint64_t sir;
} SPI_TypeDef;
#define SPI0_BASE 0xffff0000
#define SPIO ((SPI_TypeDef *)SPI0_BASE)
SPI_TypeDef *SPIO;
SPI0->cr0 = CTRLR0;
SPI0->cr1 = CTRLR1;
SPI0->sir = SSIENR;
//写寄存器
OUT(SPI0->cr1, 0x22);
这里,cr0、cr1、sir类型不为long时,会出现警告;OUT第一个参数为常量时,不会出现警告。
reg->data |= 0x5F;该操作不能实现寄存器的读写两个操作;应分别进行操作。