我刚刚开始探索用于ARM控制器的CMSIS。使用它似乎相当方便,但是我想知道实际的寄存器值是在哪里定义的。让我们以GPIOs为例。
有一个由各种成员定义的结构GPIOA_AHB_Type。然后,对于GPIOB,有一个内存(或寄存器?)地址定义,比方说GPIOB_AHB_BASE。然后,将指针设置为GPIOB_AHB_BASE,如下所示:
#define GPIOB_AHB ((GPIOA_AHB_Type*) GPIOB_AHB_BASE)例如,GPIOB_AHB的成员变量作为GPIOB_AHB->DIR来设置它的输入或输出。我的问题是,这些成员变量到底是在哪里初始化的?我猜寄存器的实际地址是特定于设备的,所以我试图在设备特定的头中找到它们,但是我找到的只是GPIOB_AHB_BASE定义和成员变量的声明。编译器如何知道,当我输入GPIOB_AHB->DIR时,我想要写入设置端口I/O方向的寄存器中?
发布于 2015-01-28 22:41:20
如果您查看CMSIS标题,您将看到所有的结构定义。下面是我当前项目的一个例子:
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;稍后,定义指向该类型结构的指针:
#define PERI_BASE (0x40000000UL)
#define TSB_PA_BASE (PERI_BASE + 0x00C0000UL)
#define TSB_PA (( TSB_PA_TypeDef *) TSB_PA_BASE)这样你就可以像:
TSB_PA->CR |= (1U << 2); // make Port A, bit 2 an output
value = TSB_PA->DATA & (1U << 5); // read Port A, bit 5.https://stackoverflow.com/questions/28203788
复制相似问题