C语言使用结构体访问寄存器

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; //修改单个域段
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值