你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

GPIO模式配置求助

[复制链接]
cndx100 提问时间:2011-1-20 15:52 /
 
第一次使用STM32有一个关于GPIO模式的问题请教大家。
            GPIO库中这样定义的                                    
                   
  • typedef enum               
  • {                
  •     GPIO_Mode_AIN           = 0x00,               
  •     GPIO_Mode_IN_FLOATING   = 0x04,               
  •     GPIO_Mode_IPD           = 0x28,               
  •     GPIO_Mode_IPU           = 0x48,               
  •     GPIO_Mode_Out_OD        = 0x14,               
  •     GPIO_Mode_Out_PP        = 0x10,               
  •     GPIO_Mode_AF_OD         = 0x1C,               
  •     GPIO_Mode_AF_PP         = 0x18               
  • }GPIOMode_TypeDef;            
            
            复制代码
            从datasheet中看来每一个GPIO中是通过4位,CONF[1:0]和Mode[1:0]的配置来实现的,所以加到一起也就4Bit就能配置一个IO口了,不明白为什么GPIOMode_TypeDef中GPIO_Mode_IPU为什么会是0x48呢?
            
            谢谢!
收藏 评论4 发布时间:2011-1-20 15:52

举报

4个回答
cndx100 回答时间:2011-1-21 08:42:17

RE:GPIO模式配置求助

好像没人气呀!
废鱼 回答时间:2011-1-25 14:54:53

RE:GPIO模式配置求助

你要看这4位的在字节中的位置,这样才能确定写入的是否真确。
net1234599 回答时间:2011-4-28 11:10:01

RE:GPIO模式配置求助

不能光看库,首先要仔细研究一下datasheet!
无薪税绵 回答时间:2018-3-7 16:34:43
MODE是GPIO的输出模式位,只有选择了这个位,才能确定GPIO的输入输出特性。
只有选择为输出模式,才能接下来配置为推挽、开漏、推挽复用、开漏复用模式。
同样,配置为输入模式,才能配置为模拟、浮空、上拉、下拉输入模式。

STM32在上电复位之后,默认的输出模式时 00(也就是输入模式),

STM32库函数中对于GPIO使用的是一种更为精妙的方法。

首先是看一下关于STM32 GPIO结构体内部:

分为三个结构体变量:
GPIO_Pin,
GPIO_Speed,
GPIO_Mode。

其中,GPIO_Speed 和 GPIO_Mode同时也是一个结构体。
分别初始化GPIO引脚的输出速率和模式。

接下来,看一下GPIO_Speed可以选择的取值,
明显发现这个的参数的设置,
就是关于STM32 GPIO引脚的输出速率设置。

typedef enum
{
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz,
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
接下来,看一下GPIO_Mode的取值:

typedef enum
{ GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

在阅读数据手册的时候发现,
如果是直接操作做寄存器,对于GPIO模式的控制位只有2位,
所以,是不会出现0x14,0x10,0x1C,0x18这些取值的。
这里,如果想知道为什么库函数中会这样的设置,就必须接着看GPIO_Init函数。

  currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
  if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
  {
    /* Check the parameters */
    assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
    /* Output mode */
    currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
  }

对于GPIO_Init函数,传递进来的参数,
先通过mode参数,设置了GPIO模式参数,
再接着根据传递的mode的值,
判断此GPIO设置为输入模式还是输出模式,
如果是输出模式,才会进行设置GPIO的速率,
如果是输入模式,忽略掉速率的设置。


资料引用自:对于STM32 GPIO模式不理解造成的问题解释
http://blog.csdn.net/u010307522/article/details/41492107

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版