单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8342|回复: 10
收起左侧

STM32入门篇HAL库GPIO使用注意事项

[复制链接]
luner 发表于 2018-4-16 09:41 | 显示全部楼层 |阅读模式
stm32资料
STM32l05x HAL库使用注意事项
主讲人:成冲

一、STM32L0xx_HAL_GPIO
(一)、引脚初始化函数 void  HAL_GPIO_Init(GPIO_TypeDef  *GPIOx,
GPIO_InitTypeDef *GPIO_Init);
    1、功能
①.对STM32中的某端口上的引脚进行初始化(设置引脚输入输出的连接关系)。
②.函数名(HAL_GPIO_Init ):HAL——硬件抽象层;GPIO——通用I/O口;Init——初始化。
③.参数1(GPIO_TypeDef  *GPIOx ):GPIO_TypeDef——包含I/O口所有寄存器的结构体名;*GPIOx——指向x I/O口的地址。
④.参数2(GPIO_InitTypeDef *GPIO_Init)
GPIO_InitTypeDef——包含I/O口所有参数的结构体名;*GPIO_Init——指向I/O口所有参数的地址。

2、GPIO_TypeDef结构体成员
typedef struct
{
  __IO uint32_t MODER; //模式寄存器
  __IO uint32_t OTYPER; //输出类型寄存器
  __IO uint32_t OSPEEDR; //输出速度寄存器
  __IO uint32_t PUPDR; //上拉/下拉寄存器
  __IO uint32_t IDR;  //输入数据寄存器
  __IO uint32_t ODR;  //输出数据寄存器
  __IO uint32_t BSRR; //置位/清除寄存器
  __IO uint32_t LCKR; //配置锁定寄存器
  __IO uint32_t AFR[2]; //端口复用功能寄存器
  __IO uint32_t BRR;  //复位寄存器
}GPIO_TypeDef;
3、*GPIOx指向GPIO口的地址参数为:
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)
    4、GPIO_InitTypeDef结构体成员
typedef struct
{
  uint32_t Pin; //①选定将被配置的GPIO引脚
  uint32_t Mode;   //②指定选定的引脚运行模式
  uint32_t Pull; //③指定选定的引脚上拉或下拉
  uint32_t Speed; //④指定选定的引脚速度
  uint32_t Alternate; //⑤复用功能连通选定的引脚
}GPIO_InitTypeDef;
     ①参数可以为:
#define GPIO_PIN_0                 //Pin 0 selected   
#define GPIO_PIN_1                 //Pin 1 selected
……
#define GPIO_PIN_15                //Pin 15 selected   
#define GPIO_PIN_All               //All pins selected
②参数可以为
#define  GPIO_MODE_INPUT        //浮空输入模式
#define  GPIO_MODE_OUTPUT_PP    //通用推挽输出模式
#define  GPIO_MODE_OUTPUT_OD    //通用开漏输出模式
#define  GPIO_MODE_AF_PP        //复用功能推挽模式
#define  GPIO_MODE_AF_OD       //复用功能开漏模式
③参数可为:
#define  GPIO_NOPULL        //无上位或下拉  
#define  GPIO_PULLUP        //上拉                  
#define  GPIO_PULLDOWN      //下拉
④参数可为:
#define  GPIO_SPEED_FREQ_LOW             //最大速度0.4MHz
#define  GPIO_SPEED_FREQ_MEDIUM        //最大速度2MHz   
#define  GPIO_SPEED_FREQ_HIGH             //最大速度10MHz
#define  GPIO_SPEED_FREQ_VERY_HIGH //最大速度35MHz
    ⑤参数可为:
#define GPIO_AF0_EVENTOUT      // EVENTOUT 复用功能映射
#define GPIO_AF0_TIM21         // TIM21 复用功能映射   
#define GPIO_AF0_SPI1          // SPI1 复用功能映射     
#define GPIO_AF0_USART2        // USART2 复用功能映射   
#define GPIO_AF0_MCO           // MCO 复用功能映射      
#define GPIO_AF0_SWDIO         // SWDIO 复用功能映射   
#define GPIO_AF0_SWCLK         // SWCLK 复用功能映射
5、*GPIO_Init指向GPIO参数的地址
6、用法举例
要求:将STM32引脚A0、A2端口设置为推挽输出模式、输出速度
10MHz。
HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef   GPIO_InitStruct; //定义一个结构体变量
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE(); //打开A端口时钟
  /*Configure GPIO pin : PA0 PA2*/
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2; //选择引脚
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //引脚工作模式
  GPIO_InitStruct.Pull = GPIO_NOPULL; //引脚上下拉电阻
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //引脚输出速度
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //调用引脚初始化程序
}
7、注意事项
        ①.输出频率高,噪声大,功耗高,电磁干扰强;输出频率低,噪声小,功耗低,电磁干扰弱;提高系统EMI(电磁干扰)性能;
        ②.上拉下拉选择一定要根据外围设备来选择。
6、练习题
要求:将STM32引脚B5、B8、C1端口设置为开漏输出模式、输出速度2MHz,引脚B6端口设置为浮空输入模式,引脚B7端口设置为推挽上拉输出模式、输出速度35MHz。

(二)、去掉初始化通用I/O外围寄存器的值,重置为默认值函数, void
HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin)
    1、功能
①.对STM32中的某端口上的引脚重置为默认值(断开引脚输入输出的连接关系)。
②.函数名(HAL_GPIO_DeInit ):HAL——硬件抽象层;GPIO——通用I/O口;DeInit——删除初始化。
③.参数1(GPIO_TypeDef  *GPIOx ):GPIO_TypeDef——包含I/O口所有寄存器的结构体名;*GPIOx——指向x I/O口的地址。
④.参数2(uint32_t GPIO_Pin)GPIO_Pin——选定将被配置的GPIO引脚。
   
2、用法举例
要求:将STM32引脚A0、A2设置为上电初始状态
static void MX_GPIO_DeInit(void)
{
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_2);
}
3、注意事项
        ①.当引脚寄存器配置被锁定后,任何修改寄存器值的操作都无效,只有重新上电后才能重新操作。

(三)、设置或者清除选定的端口引脚数据位,void         
HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,
GPIO_PinState PinState);   
    1、功能
①.在选择的端口引脚上输出高低电平。
②.函数名(HAL_GPIO_WritePin):HAL——硬件抽象层;
GPIO——通用I/O口;WritePin——写引脚。
③.参数1(GPIO_TypeDef  *GPIOx ):GPIO_TypeDef——包含I/O口所有寄存器的结构体名;*GPIOx——指向x I/O口的地址。
④.参数2(uint32_t  GPIO_Pin)GPIO_Pin——选定将被配置的GPIO引脚。
⑤.参数3(GPIO_PinState  PinState)GPIO_PinState——通用I/O引脚状态重定义结构体枚举名;PinState——引脚状态。

2、用法举例
要求:将STM32端口A0引脚输出低电平、A2引脚输出高电平。
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef   GPIO_InitStruct; //定义一个结构体变量
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE(); //打开A端口时钟
  /*Configure GPIO pin : PA0 PA2*/
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2; //选择引脚
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //引脚工作模式
  GPIO_InitStruct.Pull = GPIO_NOPULL; //引脚上下拉电阻
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //引脚输出速度
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //调用引脚初始化程序
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); //设置A2引脚输出高电平
}

(三)、读取选定的端口引脚数据位,GPIO_PinState
HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)   
    1、功能
①.读取选择的端口引脚上电平状态。
②.函数名(HAL_GPIO_ReadPin):HAL——硬件抽象层;GPIO——通用I/O口;ReadPin——读引脚。
③.参数1(GPIO_TypeDef  *GPIOx ):GPIO_TypeDef——包含I/O口所有寄存器的结构体名;*GPIOx——指向x I/O口的地址。
④.参数2(uint32_t  GPIO_Pin)GPIO_Pin——选定读取的GPIO引脚。

完整的pdf格式文档51黑下载地址(共18页):
STM32入门篇GPIO.pdf (295.23 KB, 下载次数: 89)
回复

使用道具 举报

songyuan 发表于 2018-4-26 20:17 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

songyuan 发表于 2018-4-26 20:17 | 显示全部楼层
被扣了黑币,不让下载,伤心

评分

参与人数 1黑币 +50 收起 理由
admin + 50 黑币已补 可能是遇到了高峰期

查看全部评分

回复

使用道具 举报

51dpjdxh 发表于 2018-6-21 09:12 | 显示全部楼层
从哪里找的这个资料啊,还有其他的吗?
回复

使用道具 举报

jjwangxu2008 发表于 2018-9-12 18:16 | 显示全部楼层

从哪里找的这个资料啊,还有其他的吗?
回复

使用道具 举报

qweer 发表于 2018-10-17 02:16 | 显示全部楼层
好资料。我想问一下hal库和标准库可以混用吗
回复

使用道具 举报

chq_yanxue 发表于 2019-2-9 21:49 | 显示全部楼层
谢谢!
回复

使用道具 举报

chq_yanxue 发表于 2019-2-9 21:50 | 显示全部楼层
好资料下载看看!!
回复

使用道具 举报

210033 发表于 2019-4-17 09:38 | 显示全部楼层
謝謝你, 好資料剛好需要
回复

使用道具 举报

好高的一棵草 发表于 2019-4-23 17:51 | 显示全部楼层
谢谢您勒
回复

使用道具 举报

不成佛便成魔 发表于 2019-5-3 20:56 | 显示全部楼层
这真是个好东西
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

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