c - ((Port *)0x41004400UL) 在这里是什么意思?

标签 c arm embedded atmel atmelstudio

我正在开发一个开发板,上面有一个基于 ARM 的 32 位微 Controller (即该板是 Atmel SAM D21J18A)。我仍处于学习阶段,还有很多路要走,但我真的很喜欢嵌入式系统。

我有一些 C 语言的背景。但是,这显然是不够的。我正在查看 Atmel 的一个示例项目的代码,但我并没有真正理解其中的某些部分。这是其中之一:

    #define PORT              ((Port     *)0x41004400UL) /**< \brief (PORT) APB Base Address */

端口定义为:

    typedef struct {
        PortGroup             Group[2];    /**< \brief Offset: 0x00 PortGroup groups [GROUPS] */
    } Port;

端口组定义为:

typedef struct {
    __IO PORT_DIR_Type             DIR;         /**< \brief Offset: 0x00 (R/W 32) Data Direction */
    __IO PORT_DIRCLR_Type          DIRCLR;      /**< \brief Offset: 0x04 (R/W 32) Data Direction Clear */
    __IO PORT_DIRSET_Type          DIRSET;      /**< \brief Offset: 0x08 (R/W 32) Data Direction Set */
    __IO PORT_DIRTGL_Type          DIRTGL;      /**< \brief Offset: 0x0C (R/W 32) Data Direction Toggle */
    __IO PORT_OUT_Type             OUT;         /**< \brief Offset: 0x10 (R/W 32) Data Output Value */
    __IO PORT_OUTCLR_Type          OUTCLR;      /**< \brief Offset: 0x14 (R/W 32) Data Output Value Clear */
    __IO PORT_OUTSET_Type          OUTSET;      /**< \brief Offset: 0x18 (R/W 32) Data Output Value Set */
    __IO PORT_OUTTGL_Type          OUTTGL;      /**< \brief Offset: 0x1C (R/W 32) Data Output Value Toggle */
    __I  PORT_IN_Type              IN;          /**< \brief Offset: 0x20 (R/  32) Data Input Value */
    __IO PORT_CTRL_Type            CTRL;        /**< \brief Offset: 0x24 (R/W 32) Control */
    __O  PORT_WRCONFIG_Type        WRCONFIG;    /**< \brief Offset: 0x28 ( /W 32) Write Configuration */
    RoReg8                         Reserved1[0x4];
    __IO PORT_PMUX_Type            PMUX[16];    /**< \brief Offset: 0x30 (R/W  8) Peripheral Multiplexing n */
    __IO PORT_PINCFG_Type          PINCFG[32];  /**< \brief Offset: 0x40 (R/W  8) Pin Configuration n */
    RoReg8                         Reserved2[0x20];
} PortGroup;

所以在这里,我们正在查看地址 0x41004400UL,从那里获取数据,然后会发生什么?

我查找了这个但找不到任何有用的东西。如果您有任何建议(教程、书籍等),请告诉我。

最佳答案

什么都没有发生,因为你只提供了一些声明。我不完全确定问题到底是什么,但简要解释一下该代码:

  • 0x41004400UL 显然是 I/O 空间(不是常规内存)中端口开始的地址(一组 I/O 寄存器)

  • 此端口由两组具有类似排列的单个寄存器组成

  • struct PortGroup 完全按照硬件上的布局对这些寄存器进行建模

要了解寄存器的含义,请查看硬件文档。

关于c - ((Port *)0x41004400UL) 在这里是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31262865/

相关文章:

c - 父进程如何找到导致其子进程死亡的进程的pid?

c++ - 在 ARM NEON 中有效地结合面具

ubuntu - MPJ Express 挂起

security - 保护嵌入式设备中的敏感数据?

embedded - 在嵌入式工作中使用模型驱动开发的好工具是什么?

c++ - 嵌入式项目资源

c - 覆盖 TreeView 中使用的图标

c - 使用 extern 从源文件访问结构时出错

c - 从 Tuple 解析 JSON 数组

c - 向部分添加变量是否提供静态性?