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
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. –
@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
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. –