[hc32f460填坑] DMA寄存器通过位段访问的值与实际寄存器值不一样

发布时间 2023-05-23 22:39:21作者: 恒一v

我的芯片型号是hc32f460jeua,使用的库为HC32F460_DDL_Rev3.1.0,keil包为HDSC.HC32F460.1.0.10。

发现问题:使用DMA中断,中断向量方法三(32个中断源共享一个中断向量),库的hc32f460_ll_interrupts_share.c文件中都用的位段方式判断中断是否使能。但使能中断后,if条件不成立。改成寄存器访问后if条件可以成立。

原因:hc32f460.h文件的15209行的bCM_DMA_TypeDef定义错误

解决方法:bCM_DMA_TypeDef改为

typedef struct {
stc_dma_en_bit_t EN_b;
stc_dma_intstat0_bit_t INTSTAT0_b;
stc_dma_intstat1_bit_t INTSTAT1_b;
stc_dma_intmask0_bit_t INTMASK0_b;
stc_dma_intmask1_bit_t INTMASK1_b;
stc_dma_intclr0_bit_t INTCLR0_b;
stc_dma_intclr1_bit_t INTCLR1_b;
stc_dma_chen_bit_t CHEN_b;
stc_dma_reqstat_bit_t REQSTAT_b;
stc_dma_chstat_bit_t CHSTAT_b;
uint32_t RESERVED0[32];
stc_dma_rcfgctl_bit_t RCFGCTL_b;
uint32_t RESERVED1[224];
stc_dma_rptb_bit_t RPTB0_b;
// uint32_t RESERVED2[32];
stc_dma_snseqctlb_bit_t SNSEQCTLB0_b;
// uint32_t RESERVED3[32];
stc_dma_dnseqctlb_bit_t DNSEQCTLB0_b;
uint32_t RESERVED4[32];
stc_dma_chctl_bit_t CHCTL0_b;
uint32_t RESERVED5[352];
stc_dma_rptb_bit_t RPTB1_b;
// uint32_t RESERVED6[32];
stc_dma_snseqctlb_bit_t SNSEQCTLB1_b;
// uint32_t RESERVED7[32];
stc_dma_dnseqctlb_bit_t DNSEQCTLB1_b;
uint32_t RESERVED8[32];
stc_dma_chctl_bit_t CHCTL1_b;
uint32_t RESERVED9[352];
stc_dma_rptb_bit_t RPTB2_b;
// uint32_t RESERVED10[32];
stc_dma_snseqctlb_bit_t SNSEQCTLB2_b;
// uint32_t RESERVED11[32];
stc_dma_dnseqctlb_bit_t DNSEQCTLB2_b;
uint32_t RESERVED12[32];
stc_dma_chctl_bit_t CHCTL2_b;
uint32_t RESERVED13[352];
stc_dma_rptb_bit_t RPTB3_b;
// uint32_t RESERVED14[32];
stc_dma_snseqctlb_bit_t SNSEQCTLB3_b;
// uint32_t RESERVED15[32];
stc_dma_dnseqctlb_bit_t DNSEQCTLB3_b;
uint32_t RESERVED16[32];
stc_dma_chctl_bit_t CHCTL3_b;
} bCM_DMA_TypeDef;