STM32F103ZETX HAL学习——2.按键开灯(扫描式,中断式)

上一篇成功点亮的LED,本篇将学习GPIO的input和外部中断
说一次引脚的初始化配置
本次是PA4,PA5.各接一个LED,初始化为高电平,设置为低电平时点亮LED。
PA0是设置位外部中断模式,初始化为高电平。下降沿触发。点亮PA4的LED
PA3设置为input模式。初始化为高电平。控制点亮PA5的LED
PA0,PA3各接一个开关,开关另一端接地
STM32F103ZETX HAL学习——2.按键开灯(扫描式,中断式)_第1张图片
初始化函数

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

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

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_SET);

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PA3 */
  GPIO_InitStruct.Pin = GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PA4 PA5 */
  GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI0_IRQn);

}

1.扫描式
原理重复查询input模式的引脚,符合条件即点灯

if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == 0)
    {
      HAL_Delay(10);//防抖延时
      if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == 0)//防抖二次判断
      {
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);
      }
    }

扫描式比较简单不多说。

2.中断式
通过中断服务函数来点亮LED。
初始化由CubeMX生成的MX_GPIO_Init();函数中完成的不需要额外处理
简述一下函数的调用过程,
stm32f1xx_it.c有对应引脚的中断处理函数 void EXTI0_IRQHandler(void),
这个是对应GPIO_PIN_0系列引脚的中断服务函数。

void EXTI0_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI0_IRQn 0 */
  //HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
  /* USER CODE END EXTI0_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  /* USER CODE BEGIN EXTI0_IRQn 1 */

  /* USER CODE END EXTI0_IRQn 1 */
}

里面调用了函数HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);

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

这个函数调用了中断服务函数也是回调函数HAL_GPIO_EXTI_Callback(GPIO_Pin);
也是你要重写的函数,只要在main.c里面重写HAL_GPIO_EXTI_Callback(GPIO_Pin);这个函数就可以实现外部中断电灯

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_0)
  {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);
  }
}

stm32外部中断使用CubeMX生成的工程是十分简单的。

你可能感兴趣的:(STM32HAL库学习)