gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:59:08 31 4
gpt4 key购买 nike

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

以下代码属于stm32f发现板的CAN( Controller 局域网)库代码

在文件名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

最佳答案

是的...您可以使用整数指针并继续您使用的方法。但您会错过“代码可读性”和“结构化代码”。

使用 typedef 结构,访问寄存器非常容易,并且代码易于阅读/理解。
没有别的了!!

关于c - 为什么下面的代码中使用 CAN_TypeDef 类型的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38333106/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com