【STM32】HAL库学习 1—hal & hal_gpio

目录

1 LED闪烁

        HAL_GPIO_TogglePin

        HAL_Delay

2 按键控制

        HAL_GPIO_ReadPin 

        HAL_GPIO_WritePin 

3 EXIT中断

        HAL_GPIO_EXTI_IRQHandler

        HAL_GPIO_EXTI_Callback


1 LED闪烁

        HAL_GPIO_TogglePin

 /**
  * @brief 翻转指定的GPIO引脚
  * @param GPIOx 其中x可以是(A..K)选择STM32F429X器件的GPIO外设,或者x可以是(A..I)选择STM32F40XX和STM32F427X器件的GPIO外设
  * @param GPIO_Pin 指定要翻转的引脚。
  * @retval 无
  */

        Definition at line 433 of file stm32f4xx_hal_gpio.c.

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  uint32_t odr;

  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));

  /* get current Output Data Register value */
  odr = GPIOx->ODR;

  /* Set selected pins that were at low level, and reset ones that were high */
  GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
}
#define LED2_Pin GPIO_PIN_6
#define LED2_GPIO_Port GPIOA

        eg1. HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); 

        eg2. HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_6); 

        HAL_Delay

/**
  * @brief 这个函数提供基于变量增量的最小延迟(以毫秒为单位)。
  * @note 在默认实现中,SysTick定时器是时间基础的来源。
  * 它用于在uwTick被递增的定期时间间隔内产生中断。
  * @note 这个函数被声明为__weak,以便在用户文件中的其他实现的情况下被覆盖。
  * @param Delay 指定延迟时间长度,单位是毫秒。
  * @retval 无
  */ 

        Definition at line 389 of file stm32f4xx_hal.c. 

__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

  while((HAL_GetTick() - tickstart) < wait)
  {
  }
}

2 按键控制

        HAL_GPIO_ReadPin 

 /**
  * @brief 读取指定的输入端口引脚
  * @param GPIOx 其中x可以是(A...K)来选择STM32F429X器件的GPIO外设,或x可以是(A...I)来选择STM32F40XX和STM32F427X器件的GPIO外设
  * @param GPIO_Pin 指定要读取的端口位
  *这个参数可以是GPIO_PIN_x,其中x可以是(0...15)
  * @retval 输入端口引脚的值。
  */

         Definition at line 375 of file stm32f4xx_hal_gpio.c.

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  GPIO_PinState bitstatus;

  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));

  if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
  {
    bitstatus = GPIO_PIN_SET;
  }
  else
  {
    bitstatus = GPIO_PIN_RESET;
  }
  return bitstatus;
}
#define KEY1_Pin GPIO_PIN_3
#define KEY1_GPIO_Port GPIOE

        eg: if(0 == HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin))

        HAL_GPIO_WritePin 

/**
  * @brief 设置或清除选定的数据端口位。
  *
  * @注意 这个函数使用GPIOx_BSRR寄存器来允许原子式的读/修改访问。这样,在读取和修改访问之间就不会有IRQ发生的风险。
  *
  * GPIOx可以是(A...K),用于选择STM32F429X器件的GPIO外设;也可以是(A...I),用于选择STM32F40XX和STM32F427X器件的GPIO外设。
  * @param GPIO_Pin 指定要写入的端口位
  * 这个参数可以是GPIO_PIN_x中的一个,其中x可以是(0...15)。
  * @param PinState 指定要写到所选位的值。
  * 这个参数可以是GPIO_PinState的一个枚举值。
  * @arg GPIO_PIN_RESET: 用于清除端口引脚
  * @arg GPIO_PIN_SET: 设置端口引脚。
  * @retval 无
  */

        Definition at line 410 of file stm32f4xx_hal_gpio.c. 

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if(PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U;
  }
}

        eg: HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET); 

 

3 EXIT中断

        HAL_GPIO_EXTI_IRQHandler

/**
  * @brief 这个函数处理EXTI中断请求
  * @param GPIO_Pin 指定连接EXTI线的引脚
  * @retval 无
  */ 

        Definition at line 492 of file stm32f4xx_hal_gpio.c.

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

        HAL_GPIO_EXTI_Callback

/**
  * @brief  EXTI线路检测的回调函数
  * @param GPIO_Pin 指定连接EXTI线的引脚。
  * @retval 无
  */

        Definition at line 507 of file stm32f4xx_hal_gpio.c. 

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}

 eg:

#define KEY1_Pin GPIO_PIN_3
#define KEY1_GPIO_Port GPIOE
#define KEY1_EXTI_IRQn EXTI3_IRQn
#define KEY2_Pin GPIO_PIN_4
#define KEY2_GPIO_Port GPIOE
#define KEY2_EXTI_IRQn EXTI4_IRQn
#define LED_Pin GPIO_PIN_6
#define LED_GPIO_Port GPIOA


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	/* 判断哪个引脚触发了中断 */
	switch(GPIO_Pin)
	{
		case GPIO_PIN_3:
			/* 处理GPIO2发生的中断 */
			//点亮LED
			HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
			break;
		case GPIO_PIN_4:
			/* 处理GPIO3发生的中断 */
			//熄灭LED
			HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
			break;
		default:
			break;
	}
}

你可能感兴趣的:(HAL库函数学习,stm32,学习)