Структуры могут быть разные, в том числе заданные извне, всячески
запутанные. Полезно быть уверенным, что смена компилятора не
поломала всякое. /** 
* @brief TIMER 
*/ 
typedef struct 
{ 
    union { 
        __IO uint32_t CR; 
        struct { 
            __IO uint8_t CTRL_MOD; /*!< Timer Mode Setting Register, Address offset: 0x00 */ 
            __IO uint8_t CTRL_DMA; /*!< DMA Control Register, Address offset: 0x01 */ 
            __IO uint8_t INTER_EN; /*!< Interrupt Enable Register, Address offset: 0x02 */ 
            __IO uint8_t RSVD_03; 
        }; 
    }; 
    union { 
        __IO uint32_t SR; 
        struct { 
            __IO uint8_t RSVD_04; 
            __IO uint8_t RSVD_05; 
            __IO uint8_t INT_FLAG; /*!< Interrupt Status Register, Address offset: 0x06 */ 
            __IO uint8_t FIFO_COUNT; /*!< FIFO Count Register, Address offset: 0x07 */ 
        }; 
    }; 
    union { 
        __IO uint32_t CNT; 
        __IO uint32_t COUNT; /*!< Current Counter Register, Address offset: 0x08 */ 
    }; 
    union { 
        __IO uint32_t TOP; 
        __IO uint32_t CNT_END; /*!< Counting End Register, Address offset: 0x0C */ 
    }; 
    __IO uint32_t FIFO; /*!< FIFO Data Register, Address offset: 0x10 */ 
    union { 
        __IO uint32_t DMAPTR; 
        struct { 
            __IO uint16_t DMA_NOW; /*!< DMA Current Buffer Register, Address offset: 0x14 */ 
            __IO uint16_t RSVD_16; 
        }; 
    }; 
    union { 
        __IO uint32_t DMASTART; 
        struct { 
            __IO uint16_t DMA_BEG; /*!< DMA Start Buffer Register, Address offset: 0x18 */ 
            __IO uint16_t RSVD_1A; 
        }; 
    }; 
    union { 
        __IO uint32_t DMAEND; 
        struct { 
            __IO uint16_t DMA_END; /*!< DMA End Buffer Register, Address offset: 0x1C */ 
            __IO uint16_t RSVD_1E; 
        }; 
    }; 
} TMR_Type; 
/* Check correct structure packing */ 
STATIC_ASSERT((sizeof(TMR_Type) == 0x20), TMR_Type);