C语言问题?
时间:10-02
整理:3721RD
点击:
以下一段代码是关于32的但是我的问题是关于C语言的:GPIO_TypeDef* GPIOx是一个结构体类型的指针,可为什么在往void GPIO_Init()函数里面写数据时(例如是写 GPIO_Init(GPIOB, &GPIO_InitStructure)),那么为什么第一个参数是写成 GPIOB 而不是写成 &GPIOB 呢?(求赐教,谢谢)
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
uint32_t tmpreg = 0x00, pinmask = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
...
}
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
uint32_t tmpreg = 0x00, pinmask = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
...
}
你看一下GPIOB的define:
“#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)”(这个是我用的一个32的固件库里的头文件stm32f10x.h定义)
GPIOB已经指向GPIOB_BASE,是一个地址,不需要再用取地址了。
我的理解是这样的,GPIOB是底层库里面定义的一个指向B口寄存器的指针,所以就不用再次取址了。不知道对不对
GPIOB本身就被定义为一个地址了,并且定义为GPIO_TypeDef *类型的指针。也就是从GPIOB地址开始往后一块内存单元里被结构化为GPIO_TypeDef 类型的数据。
其实寄存器对我们使用而言就是普通的指针变量,对于单片机而言,他不懂什么是强制类型转换,这些都是编译层次上的。看看你寄存器的定义就明白了。或者仿真的时候看看你的memory映射。现在都讲究模块化设计,所以对这些io操作归类。