STM32 HAL库学习系列第9篇---NVIC按键外部中断函数

**

针对HAL库的中断操作,使用按键实例进行说下,以供参考
---------------------------

**
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//回调函数
{
  if(GPIO_Pin==KEY1_GPIO_PIN)
  {
    HAL_Delay(20);// 延时一小段时间,消除抖动 
    if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)//按键1判断
    {
      BEEP_TOGGLE;
      LED1_ON;
      LED2_ON;
      LED3_ON;
    }
    __HAL_GPIO_EXTI_CLEAR_IT(KEY1_GPIO_PIN);
  }
  else if(GPIO_Pin==KEY2_GPIO_PIN)
  {
    HAL_Delay(20);// 延时一小段时间,消除抖动 
    if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)//按键2判断
    {
      BEEP_TOGGLE;
      LED1_OFF;
      LED2_OFF;
      LED3_OFF;
    }
    __HAL_GPIO_EXTI_CLEAR_IT(KEY2_GPIO_PIN);
  }
}

中断时间配置

1.开启中断,配置中断 HAL_TIM_Base_Start_IT( &htim6);//开启基本定时器中断模式计数
2.回调处理(中断处理)
STM32 HAL库学习系列第9篇---NVIC按键外部中断函数_第1张图片

在it.c中的中断函数基本不处理内容,回调函数的中断配置
void TIM2_IRQHandler(void)
{
  /* USER CODE BEGIN TIM2_IRQn 0 */

  /* USER CODE END TIM2_IRQn 0 */
  HAL_TIM_IRQHandler(&htim2);
  /* USER CODE BEGIN TIM2_IRQn 1 */

  /* USER CODE END TIM2_IRQn 1 */
}

真正的处理在
main.c中的
        void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
        {
                //if(htim == (&htim1))
                if(TIM1 == htim->Instance)
                {


                 }

                     if (htim->Instance == htim3.Instance)
                {
                }

        }

计数模式:
定时器有如下三种计数模式
递增计数模式:计数器从 0 计数到自动重载值,然后重新从 0 开始计数并生成计数器上溢事件。
递减计数模式:计数器从自动重载值开始递减到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。
中心对齐模式:计数器从 0 开始计数到自动重载值 – 1 ,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从0 开始重新计数。

ETR外部脉冲计数器, 标准库获取计数器值用TIM_GetCounter函数,HAL函数中,直接调用值即可配置
在这里插入图片描述

/* USER CODE BEGIN 2 */
    HAL_TIM_Base_Start(&htim1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,(GPIO_PinState)!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0));
 HAL_Delay(500);
 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,(GPIO_PinState)!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0));
        
 printf("num=%d\r\n",htim1.Instance->CNT);
  }
  /* USER CODE END 3 */

定时功能:

int main(void)
{ 
  HAL_Init();
  SystemClock_Config();
  LED_GPIO_Init();
  BASIC_TIMx_Init();
  HAL_TIM_Base_Start_IT(&htimx);
  /* 无限循环 */
  while (1)
  {
    if(timer_count==1000)
    {
      timer_count=0;
      LED1_TOGGLE;
      LED2_TOGGLE;
      LED3_TOGGLE;
    }
  }
}

/**
  * 函数功能: 非阻塞模式下定时器的回调函数
  * 输入参数: htim:定时器句柄
  * 返 回 值: 无
  * 说    明: 无
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  timer_count++;
}

微信搜索“Allen5G” 或者扫描下面二维码、关注,获取更多干货!
STM32 HAL库学习系列第9篇---NVIC按键外部中断函数_第2张图片

你可能感兴趣的:(STM32深入剖析实践)