STM32HAL库的基本使用(1)- GPIO引脚配置

前言

作者使用的是STM32L431RCT的开发板,Cortex-M4的内核,是大学老师教学用的,原理图如下

dbf62faee43f4e21a05a0a74c24ff7d9.png

原理图下载链接:https://pan.baidu.com/s/1c8WFBO9bPxarzaOKqDrl0Q?pwd=6666 
提取码:6666 

HAL库的优点是可以对STM32快速入门,但是很难深入了解STM32的内部寄存器,后期没事的时候可以尝试基于寄存器的开发,跟C51一样,但是需要手册的辅助,毕竟寄存器太多了,关于GPIO引脚的配置说三种:输入、输出、外部中断;两种配置方法:图形配置、函数配置

输入

e6d8aa3ef05141fa8e842b8744c26e06.png

鼠标选中PA5引脚,就会弹出这些选项,这些选项是该引脚可以配置的功能,现在先不管他,后续的学习和应用可能会用到,到时候再说;这里把PA5引脚配置成输入GPIO_Input

配置好了后该引脚会生成一个其他的配置项,各个意思都在图中标识过了,然后Ctrl+s保存,即可自动生成初始代码

ecda32453ec14369b0176119be416f85.png

 初始化完成后的代码

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin : LED_Pin */
  GPIO_InitStruct.Pin = LED_Pin;         //引脚的自定义命名LED_Pin
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//引脚的模式GPIO_MODE_INPUT输入
  GPIO_InitStruct.Pull = GPIO_NOPULL;    //引脚的上拉或下拉选择
  HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);//引脚初始化的函数,我们在调用时的函数

}

/* USER CODE BEGIN 4 */

输出

与输入类似,鼠标选中PA4引脚,就会弹出这些选项,这些选项是该引脚可以配置的功能,现在先不管他,后续的学习和应用可能会用到,到时候再说;这里把PA4引脚配置成输入GPIO_Output,然后就会生成一些其他的配置项

c5c7dbf65000439ca21a59c61d97fbfc.png

 这里主要说一下引脚模式:推挽输出、开漏输出;推挽输出跟我们平时用的C51的P1差不多;而开漏输出更像C51的P0需要配合上拉电阻使用,适合驱动电流稍微大一点外设。配置好了以后Ctrl+s保存,就可以自动生成初始化代码

f5b60110a2744b908316e91a7d6603c7.png

 

 /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);//引脚的初始电平

  /*Configure GPIO pin : LED3_Pin */
  GPIO_InitStruct.Pin = LED3_Pin;                            //引脚的名字LED_Pin
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;                //引脚的模式
  GPIO_InitStruct.Pull = GPIO_NOPULL;                        //是否选择上拉或下拉电阻
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;                //引脚的频率
  HAL_GPIO_Init(LED3_GPIO_Port, &GPIO_InitStruct);            //引脚初始化的示例

到此引脚的输入、输出初始化完成,做点东西,不然没意思,我们做一个按钮控制灯的开关;因为我们没有采用外部中断,所以只能以查询的方式去检测引脚电平去控制灯,这里我们选择开发板上的LED3,由原理图可以看到,该灯是低电平点亮

da710683ca984f5c8dcd7b8c3c6f16ed.png

 大致思想就是检测PA5的引脚电平,检测到低电平就把LED3灭掉,即把PA4置1;如果检测到PA5为高电平,就把LED3点亮,即把PA4置0;先来看一下HAL库给的GPIO的函数:

HAL_GPIO_Init是一个引脚初始化的函数;对应的HAL_GPIO_DeInit就是一个清空初始化的函数,我们一般不用

HAL_GPIO_ReadPin故名思意就是读取引脚电平;HAL_GPIO_WritePin就是给对应的引脚写入电平

HAL_GPIO_TogglePin意思是引脚电平反转;HAL_GPIO_LockPin是锁住引脚寄存器的状态;

HAL_GPIO_EXTI_IRQHandler是外部中断的判断,并清除中断标识,调用中断回调函数HAL_GPIO_EXTI_Callback;这里需要注意一点,如果不指明中断回调函数的外部中断引脚,那么所有的外部中断函数都要写在这个函数里

/* Initialization and de-initialization functions *****************************/
void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);

/**
  * @}
  */

/** @addtogroup GPIO_Exported_Functions_Group2 IO operation functions
 * @{
 */

/* IO operation functions *****************************************************/
GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void              HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
void              HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

HAL库的GPIO的函数基本就这么多,下面开始写上面提到的控制程序,如下代码实现了开关按下灯灭,开关弹出灯亮的功能,我身边没有按钮,我用杜邦线接3.3V展示效果

if( HAL_GPIO_ReadPin(LED_GPIO_Port,LED_Pin) == GPIO_PIN_SET )
	  {
		  HAL_Delay(10);
		  HAL_GPIO_WritePin(LED_GPIO_Port,LED3_Pin,GPIO_PIN_SET );
	  }
	  else
	  {
		  HAL_Delay(10);
		  HAL_GPIO_WritePin(LED_GPIO_Port,LED3_Pin, GPIO_PIN_RESET);
	  }

 

演示

中断

 关于外部中断的配置跟输入输出相似,多了一个触发方式的配置,可分为两类:中断和事件;每类都有3种触发方式:下降沿触发、上升沿触发、上升沿和下降沿都触发;最后要使能中断,这就好像我们用C51时,开启外部中断一样;最后Ctrl+S保存生成代码

 

b18b5c7d2185405b8b8b6e209604bab5.png

 

a74e40b2eaa94839ad07194a5a598f70.png

 

/*Configure GPIO pin : KEY_Pin */
  GPIO_InitStruct.Pin = KEY_Pin;                 //中断引脚名称
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;    //外部中断触发方式
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;          //是否选择上拉或者下拉电阻
  HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);    //外部中断优先级配置
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);            //外部中断使能

到这里外部中断引脚初始化完成,做个按键控制灯的亮灭程序

先打开外部中断

/* USER CODE BEGIN 2 */
  HAL_GPIO_EXTI_IRQHandler(KEY_Pin);
  /* USER CODE END 2 */

 在写中断回调函数,使其控制LED3的亮灭

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == KEY_Pin)       //需要判断是哪个外部中断
	{
		HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin); //反转LED3的电平
	}

}
/* USER CODE END 4 */

演示效果

演示1

 

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值