[hc32f460填坑] DMA寄存器通过位段访问的值与实际寄存器值不一样
我的芯片型号是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;
                    
                
                
            
        
浙公网安备 33010602011771号