为什么在下面的代码中使用了 CAN_TypeDef 类型的指针?

Why pointer of type CAN_TypeDef is being used in following code?

我正在尝试理解代码,我担心为什么在下面的代码中使用"CAN_TypeDef",我可以简单地使用整数类型的指针吗,整数指针会有什么不良后果?

以下代码属于stm32f discovery board的CAN(controller area network)库代码

在文件名中 can.c

void CAN_setup (uint32_t ctrl)  {
  CAN_TypeDef *pCAN = (ctrl == 1) ? CAN1 : CAN2;
  uint32_t brp;

当我去定义 CAN_Typedef 时,它把我扔到这里。

typedef struct
{
  __IO uint32_t              MCR;                 /*!< CAN master control register,         Address offset: 0x00          */
  __IO uint32_t              MSR;                 /*!< CAN master status register,          Address offset: 0x04          */
  __IO uint32_t              TSR;                 /*!< CAN transmit status register,        Address offset: 0x08          */
  __IO uint32_t              RF0R;                /*!< CAN receive FIFO 0 register,         Address offset: 0x0C          */
  __IO uint32_t              RF1R;                /*!< CAN receive FIFO 1 register,         Address offset: 0x10          */
  __IO uint32_t              IER;                 /*!< CAN interrupt enable register,       Address offset: 0x14          */
  __IO uint32_t              ESR;                 /*!< CAN error status register,           Address offset: 0x18          */
  __IO uint32_t              BTR;                 /*!< CAN bit timing register,             Address offset: 0x1C          */
  uint32_t                   RESERVED0[88];       /*!< Reserved, 0x020 - 0x17F                                            */
  CAN_TxMailBox_TypeDef      sTxMailBox[3];       /*!< CAN Tx MailBox,                      Address offset: 0x180 - 0x1AC */
  CAN_FIFOMailBox_TypeDef    sFIFOMailBox[2];     /*!< CAN FIFO MailBox,                    Address offset: 0x1B0 - 0x1CC */
  uint32_t                   RESERVED1[12];       /*!< Reserved, 0x1D0 - 0x1FF                                            */
  __IO uint32_t              FMR;                 /*!< CAN filter master register,          Address offset: 0x200         */
  __IO uint32_t              FM1R;                /*!< CAN filter mode register,            Address offset: 0x204         */
  uint32_t                   RESERVED2;           /*!< Reserved, 0x208                                                    */
  __IO uint32_t              FS1R;                /*!< CAN filter scale register,           Address offset: 0x20C         */
  uint32_t                   RESERVED3;           /*!< Reserved, 0x210                                                    */
  __IO uint32_t              FFA1R;               /*!< CAN filter FIFO assignment register, Address offset: 0x214         */
  uint32_t                   RESERVED4;           /*!< Reserved, 0x218                                                    */
  __IO uint32_t              FA1R;                /*!< CAN filter activation register,      Address offset: 0x21C         */
  uint32_t                   RESERVED5[8];        /*!< Reserved, 0x220-0x23F                                              */ 
  CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register,                 Address offset: 0x240-0x31C   */
} CAN_TypeDef;

我不明白为什么 typedef ..我有 CAN 的基地址和不同寄存器的偏移量,我没有发现上述代码与我的目的有任何关联。

我正在尝试这样申请

/*=========================CAN基地址=============== */

#define CAN1_BASE 0x40006800
#define CAN2_BASE  0x40006400

/======================================= ===================/

#define CAN1_MCR (CAN1_BASE+ 0x00)
#define CAN2_MCR (CAN2_BASE+ 0x00)  // 0x00 is offset for MCR

#define DEMO(X) (*(unsigned int*)(X)) // 将使用它来类型转换和引用,访问寄存器。

DEMO(CAN1_MCR) =  (CAN_MCR_INRQ   |   CAN_MCR_NART    ); // CAN_MCR_INRQ and CAN_MCR_NART has hexadecimal vale pointing to specific bit in MCR register

关键词是重用。说

#define CAN1_MCR (CAN1_BASE+ 0x00)
#define CAN2_MCR (CAN2_BASE+ 0x00) 

意味着您必须定义布局两次(所有双重维护问题)。结构方法允许定义一次,并为每个总线使用相同的定义。

是的...您可以使用整数指针并继续使用您使用的方法。 但是你会错过 "Code Readability" 和 "Structured Code".

使用 typedef 结构,访问寄存器非常容易,代码也很容易 read/understand。
没有别的!!