2016-07-12 26 views
0

Ich versuche, den Code zu verstehen, ist meine Sorge, warum in unten Code "CAN_TypeDef" verwendet wird, kann ich einfach Zeiger des Typs Ganzzahl verwenden, was werden die negativen Folgen der Integer-Zeiger sein?Warum wird der Zeiger vom Typ CAN_TypeDef im folgenden Code verwendet?

Der Code unten gehört, kann zu (Controller Area Network) Bibliothekscode von STM32F Entdeckung Board

in Dateinamen can.c

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

Als ich nach Definition von CAN_Typedef ging es mir hier wirft.

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; 

Ich verstehe nicht, warum typedef .. Ich Basisadresse von CAN habe und verschiedene Register versetzt, ich hatte keine Relevanz von oben Code für meine Zwecke.

Ich versuche, auf diese Weise ADDRESS

/* ========================= CAN BASE anzuwenden ===== ========== */

#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)) // wird diese verwenden Besetzung und Ehrerbietung zu geben, Zugriff auf das Register.

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 
+0

Der Strukturtyp bietet eine Zuordnung für das Layout einer adressierbaren Multiport-Hardware-Schnittstelle. Ein Zeiger auf diesen Typ stellt somit einen Zeiger auf eine bestimmte Gesamtschnittstelle dar, und Sie können leicht und eindeutig auf einen bestimmten Port dieser Schnittstelle über einen solchen Zeiger, namentlich, zugreifen. Es gibt keinen besonderen Grund, warum Sie es so machen müssen, aber ich empfehle es Ihnen als eine gute Idee, dies zu tun, besonders wenn Sie sich auf eine Bibliothek verlassen, die das tut. –

+0

@JohnBollinger Herr, ich bin versucht, meine eigene Implementierung von generischen Bibliothek inspiriert, kann ich einfach Zeiger des Typs Ganzzahl verwenden, was wird die negativen Folgen der Integer-Zeiger sein? – user143252

+0

Die Verwendung eines separaten Zeigers direkt zu jedem Port ist unordentlicher und weniger klar. Es ist wahrscheinlich schwieriger, Ihren Code auf diese Weise zu erstellen und zu pflegen, aber ich sehe keinen Grund, warum Sie das nicht tun könnten. –

Antwort

0

Ja ... Sie können einen Integer-Zeiger verwenden und mit der von Ihnen verwendeten Methode fortfahren. Aber Sie werden auf "Code Readability" und "Strukturierter Code" vermissen.

Mit der Typedef-Struktur ist es sehr einfach auf die Register zuzugreifen und der Code ist einfach zu lesen/zu verstehen.
Nichts anderes !!

0

Das Schlüsselwort ist Wiederverwendung.

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

sagen, bedeutet, dass Sie zweimal das Layout definieren müssten (mit allen Doppelwartungsprobleme). Der Strukturansatz erlaubt es, ihn einmal zu definieren und für jeden Bus dieselbe Definition zu verwenden.