OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4249|回复: 3

IO端口初始化中的变量地址

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-12-31
在线时间
0 小时
发表于 2015-1-13 20:43:17 | 显示全部楼层 |阅读模式
5金钱
最近在学习开发板,先从按键试验开始。程序看到LED_Init()   里面的代码
//LED IO初始化
void LED_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); //

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->A.8 配置端口
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //
 GPIO_Init(GPIOA, &GPIO_InitStructure); //
 GPIO_SetBits(GPIOA,GPIO_Pin_8); //
.....................................

对于程序中的GPIO_InitStructure.GPIO_Pin我有点不解。先看一下 GPIO_InitTypeDef
typedef struct
{
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;

再看GPIO_InitStructure.GPIO_Pin代表的是结构体变量中的一个成员,我想知道地址在哪里?怎么能确认对它的赋值就是对寄存器的赋值?哪里表示他就是对应的寄存器?
同样 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP     GPIO_Mode只是一个枚举变量,没有地址。怎么确定它是对相应寄存器赋值?哪里表示他就是对应的寄存器?

同程序中的 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE)里面可以找到
RCC->APB2ENR;它是有地址的!  

兄弟初学者,请多多指教!找了论坛没有相关解答。

最佳答案

查看完整内容[请看2#楼]

关键在GPIO_Init(GPIOA, &GPIO_InitStructure);    你找到 GPIOA的定义  然后打开初始化函数GPIO_Init(GPIOA, &GPIO_InitStructure);   你会明白的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-1-13 20:43:18 | 显示全部楼层
关键在GPIO_Init(GPIOA, &GPIO_InitStructure);   
你找到 GPIOA的定义  然后打开初始化函数GPIO_Init(GPIOA, &GPIO_InitStructure);  
你会明白的
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-1-13 21:26:07 | 显示全部楼层
这是C结构体部分的基础语法知识,建议复习一下。

GPIO_InitStructure是函数的GPIO_InitTypeDef类型局部变量,只在声明GPIO_InitStructure的函数内部有临时地址,是变量不是寄存器。
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-12-31
在线时间
0 小时
 楼主| 发表于 2015-1-13 22:00:46 | 显示全部楼层
回复【2楼】shimengdacs:
---------------------------------
我知道这些是变量,我想问的正是这些变量并没有给出地址,对他们的赋值如何改变相应寄存器中的内容?
很多语句都是将关键字定义为指针,比方说:#define RCC              ((RCC_TypeDef *) RCC_BASE)中的RCC_BASE是有地址的,RCC->APB2ENR |= RCC_APB2Periph;在分配内存后,这个语句就是往RCC_BASE+APB2ENR地址里面的寄存器里面写入数据。
但是GPIO_InitStructure.GPIO_Pin 我通篇找不到它所指的地址在哪里?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 00:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表