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

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位的在字节中的位置,这样才能确定写入的是否真确。
菜鸟复古版 回答时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版