STM32库函数中GPIO_Init的理解

发布者:阳关三迭最新更新时间:2017-11-01 来源: eefocus关键字:STM32  库函数  GPIO_Init 手机看文章 扫描二维码
随时随地手机看文章

STM32中GPIO的配置风格和以往研究的MCU有很大的不同,研究了好一段时间才搞通。

 

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;

配置一个引脚只需要4位寄存器,而上面却定义了8位,仔细研究GPIO_Init()函数后,确定为ST开发人员加上去的标识位。0x1_ 的是输出标识,其他则为输入模式。

下面看一下GPIO_Init()这个函数:

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)); 
 
/*---------------------------- GPIO Mode Configuration -----------------------
  currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);//屏蔽高半个字节的标识位
  if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)//判断是否为输出,0x1_
  {
    /* Check the parameters 
    assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
    /* Output mode 
    currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;//如果是输出,则加上相关的速度标志
  }
/*---------------------------- GPIO CRL Configuration ------------------------
  /* Configure the eight low port pins 
  if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)//判断引脚是否有效
  {
    tmpreg = GPIOx->CRL; //读出CRL寄存器中的值,并保存
    for (pinpos = 0x00; pinpos < 0x08; pinpos++)
    {
      pos = ((uint32_t)0x01) << pinpos;
      /* Get the port pins position  找出引脚的位置
      currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
      if (currentpin == pos)
      {
        pos = pinpos << 2; //pos*4,因为每个引脚配置占4位
        /* Clear the corresponding low control register bits 
        pinmask = ((uint32_t)0x0F) << pos;
        tmpreg &= ~pinmask; //把需要配置引脚的4位清0,其位不变
        /* Write the mode configuration in the corresponding bits 
        tmpreg |= (currentmode << pos); //把配置数据写入tmpreg
        /* Reset the corresponding ODR bit //如果是下拉输入或者上拉输入,则还需要配置PxODR位
        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
        {
          GPIOx->BRR = (((uint32_t)0x01) << pinpos); //如果下拉,清除对应ODRy为0
        }
        else
        {
          /* Set the corresponding ODR bit 
          if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
          {
            GPIOx->BSRR = (((uint32_t)0x01) << pinpos); //如果上拉,设置对应的ODRy为1
          }
        }
      }
    }
    GPIOx->CRL = tmpreg; //把配置好的数值写入寄存器
  }


关键字:STM32  库函数  GPIO_Init 引用地址:STM32库函数中GPIO_Init的理解

上一篇:在Keil5中新建stm32寄存器工程
下一篇:单片机外部模块供电问题

推荐阅读最新更新时间:2024-03-16 15:42

TCRT5000+STM32红外循迹小车程序
用正点原子的精英版作为主控,红外循迹用TCRT5000芯片。 单片机源程序如下: /* Includes ------------------------------------------------------------------*/ #include stm32f10x.h #include stm32f10x_tim.h #include stm32f10x_flash.h #include stm32f10x_exti.h #include stm32f10x_rcc.h #include systick.h #include stdio.h #include misc.h #define in
[单片机]
意法半导体STM32 USB PD MCU 现支持 UCSI 规范,加快Type-C供电广泛应用
2023 年 7 月 24 日,中国 —— 意法半导体STM32 微控制器 (MCU)软件生态系统 STM32Cube新增一个USB Type-C® 连接器系统接口(UCSI)软件库,加快USB-C供电(PD)应用的开发。 X-CUBE-UCSI是一款UCSI 认证的总包整体方案,组件包含即用型硬件和使用STM32 MCU充当UCSI PD控制器实现标准化通信的固件示例。 客户可以直接复制粘贴这些参考设计,并从优化的物料清单(BoM)成本中受益。 该软件允许 MCU 连接系统主处理器,使用 UCSI 协议与操作系统交换信息,同时控制 USB-C 连接和 PD 协议。主处理器可以是系统芯片(SoC)、应用处理器或 S
[单片机]
意法半导体<font color='red'>STM32</font> USB PD MCU 现支持 UCSI 规范,加快Type-C供电广泛应用
Stm32作为主设备使用DMA接收SPI数据
DMA发送中断和DMA接收中断必须都打开,如果接受中断不开,貌似只能接收一次成功。同时DMA接收比发送优先级要高,这条没有测试过!!! 以下代码在stm32f407上测试通过 #include spi_dma.h #include stm32f4xx_dma.h #include stm32f4xx.h #include spi.h #include SRAM.h #include data_process.h #include stdio.h #define DMA2_TX_STREAM DMA2_Stream3 #define DMA2_TX_CHANNEL DMA_Channel_3 #def
[单片机]
STM32HAL库ADC实验(三)——中断查询法
(模式:连续模式 非扫描模式) 使能ADC全局中断 参考视频 【STM32】超简单的开发方法-基础篇(ADC模数转换) https://player.bilibili.com/player.html?aid=715022775 参考文章:https://blog.csdn.net/as480133937/article/details/99627062 设置定时 可以看我这篇文章 配置玩定时器之后 配置ADC 使能ADC中断 基本函数: • HAL_ADC_Start_IT(&hadcx);       //中断轮询模式开启ADC • HAL_ADC_Stop_IT() //中断轮询模式停
[单片机]
STM32HAL库ADC实验(三)——中断查询法
STM32串口发送十六进制的数组
通过串口发送十六进制的数组的方法有很多种,这里我介绍一种最简单也最使用的一种方法。 我这里使用的板子是STM32F103RCT6,使用串口2,usart2.c的代码如下: #include delay.h #include usart2.h #include stdarg.h #include stdio.h #include string.h #include timer.h //串口接受缓存区 u8 USART2_RX_BUF ; //接受数据缓冲,最大为USART2_MAX_RECV_LEN个字节 u8 USART2_TX_BUF ; //发送数据缓冲,最大为USART2
[单片机]
STM32 HAL 详述串口收发的所有方式
串口收发方式 串口收发的使用无外乎下面这些使用方式 串口发送 轮询发送 HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)轮询发送函数,根据TXE标志一字节一字节的将数据传输到移位寄存器,再根据TC标志判断发送完成。 中断发送 HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)中断发送函数,首先将要发送的数据及大小赋值给串口句柄的发送缓存,然后开启发送数据寄存器为空(TXE)中断,每传
[单片机]
STM32 CAN模块使用详解
STM32 CAN模块使用详解.重点介绍以STM32F103E系列芯片为基础介绍CAN 总线的使用方法。CAN 总线在控制领域使用的非常广泛,如今大多数CPU芯片外围都扩展CAN接口。 1. 硬件基础 CAN总线工作需要两根数据线,RX和TX,即为输入总线和输出总线。一般CPU与外界通信需要接一个驱动芯片(这点很像UART接口),常用的CAN芯片主要有:SN65VHD230、PCA82C250T等,本系统使用SN65VHD230作为CAN接口芯片。而CPU提供的CAN接口为CAN_L和CAN_H。 2. 软件设计 在进行软件设计时,我们首先来看这样的一个结构体: typedef struct { uint32_t StdId;
[单片机]
意法半导体:低功耗策略的延伸
“现在低功耗看起来是个非常热门的词,但实际上我们04年左右就已经制定这个策略了。”意法半导体大中国区微控制器市场经理James表示。伴随着云计算概念的普及,智能家居再一次被人们所关注,而意法半导体显然不愿意错过终端处理器市场。 STM32L低功耗处理器发布 STM32L处理器是意法半导体最新发布的一款基于Cortex-M3 32位内核的低功耗处理器,与之前的STM32其他系列产品相比,最大的特点是采用了EnergyLite超低功耗平台。 究竟何为EnergyLite呢?意法半导体单片机部市场经理张军辉解释道,“EnergyLite包含两部分,一个是意法半导体独创的130nm技术的抄底漏电流工艺,另外则是与S
[单片机]
意法半导体:低功耗策略的延伸
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved