我正在阅读有关指针和结构的一些内容,但我只是不理解它: 微控制器的头文件中有这个内容:
#define NVIC_BASE (SCS_BASE + 0x0100) /*< NVIC Base Address */ (1)
#define NVIC ((NVIC_Type *) NVIC_BASE) /*< NVIC configuration struct */ (2)
在后面的代码中,可能有类似的内容:
NVIC->ICER[0] = (1<<4);
这是否(因为定义)对应于:
(NVIC_Type *) NVIC_BASE).ICER[0] = (1<<4);
NVIC_Type只是一个typedefed结构,带有一些用于设置和清除中断的寄存器。很明显,(2)以某种方式管理结构起始地址是NVIC_BASE地址。 但是怎么样?
括号中的结构(NVIC_Type *)后指针(*)是什么?
答案 0 :(得分:3)
NVIC_BASE
是地址。 (NVIC_Type *)
是一个强制转换,这意味着当您引用NVIC
引用时,它将被解释为指向NVIC_Type
结构的指针。
因此,当您编写NVIC->ICER[0]
时,就好像NVIC是声明的结构,但具有恒定的地址。这样,结构的布局与外设存储器映射相匹配,并且通过给定的基址,寄存器排成一行,让您可以操作硬件。
此外,是NVIC->ICER[0] = (1<<4);
与(*(NVIC_Type *) NVIC_BASE).ICER[0] = (1<<4);