首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMSIS寄存器值

CMSIS寄存器值
EN

Stack Overflow用户
提问于 2015-01-28 22:37:40
回答 1查看 521关注 0票数 1

我刚刚开始探索用于ARM控制器的CMSIS。使用它似乎相当方便,但是我想知道实际的寄存器值是在哪里定义的。让我们以GPIOs为例。

有一个由各种成员定义的结构GPIOA_AHB_Type。然后,对于GPIOB,有一个内存(或寄存器?)地址定义,比方说GPIOB_AHB_BASE。然后,将指针设置为GPIOB_AHB_BASE,如下所示:

代码语言:javascript
复制
#define GPIOB_AHB        ((GPIOA_AHB_Type*) GPIOB_AHB_BASE)

例如,GPIOB_AHB的成员变量作为GPIOB_AHB->DIR来设置它的输入或输出。我的问题是,这些成员变量到底是在哪里初始化的?我猜寄存器的实际地址是特定于设备的,所以我试图在设备特定的头中找到它们,但是我找到的只是GPIOB_AHB_BASE定义和成员变量的声明。编译器如何知道,当我输入GPIOB_AHB->DIR时,我想要写入设置端口I/O方向的寄存器中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-28 22:41:20

如果您查看CMSIS标题,您将看到所有的结构定义。下面是我当前项目的一个例子:

代码语言:javascript
复制
typedef struct
{
  __IO uint32_t DATA;              /*!< Port A Data Register                         */
  __IO uint32_t CR;                /*!< Port A Output Control Register               */
  __IO uint32_t FR1;               /*!< Port A Function Register 1                   */
  __IO uint32_t FR2;               /*!< Port A Function Register 2                   */
       uint32_t RESERVED0[6];
  __IO uint32_t OD;                /*!< Port A Open Drain Control Register           */
  __IO uint32_t PUP;               /*!< Port A Pull-up Control Register              */
       uint32_t RESERVED1[2];
  __IO uint32_t IE;                /*!< Port A Input Control Register                */
} TSB_PA_TypeDef;

稍后,定义指向该类型结构的指针:

代码语言:javascript
复制
#define PERI_BASE                  (0x40000000UL)
#define TSB_PA_BASE                (PERI_BASE  + 0x00C0000UL)
#define TSB_PA                     ((     TSB_PA_TypeDef *)    TSB_PA_BASE)

这样你就可以像:

代码语言:javascript
复制
TSB_PA->CR |= (1U << 2);          // make Port A, bit 2 an output
value = TSB_PA->DATA & (1U << 5); // read Port A, bit 5.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28203788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档