C语言使用结构体访问寄存器
一个简单的DMA, 寄存器如下所示;
下面是一种使用结构体的寄存器访问实现:
typedef struct {
union {
struct {
U32 src_addr : 32;
} fields;
U32 value;
} reg_src_addr;
union {
struct {
U32 dst_addr : 32;
} fields;
U32 value;
} reg_dst_addr;
union {
struct {
U32 trans_len : 32;
} fields;
U32 value;
} reg_trans_len;
union {
struct {
U32 dma_start : 1;
U32 reserved : 31;
} fields;
U32 value;
} reg_dma_start;
} DMA_CSR_S;
valatile DMA_CSR_S* gp_dma_csr = 0x20030000; //U32 全局结构体指针,指向寄存器base_addr
int main() {
U32 src_addr = 0x0001fe00;
U32 len = 0x100;
U32 dst_addr = src_addr + len;
gp_dma_csr->reg_src_addr.value = src_addr; //整个寄存器写值
gp_dma_csr->reg_dst_addr.value = dst_addr;
gp_dma_csr->reg_trans_len.value = len;
gp_dma_csr->reg_dst_addr.fields.dma_start = 1; //修改单个域段
}