EXIT外部中断 HAL库+cubeMX

一.cubeMX外部中断配置

EXIT外部中断 HAL库+cubeMX_第1张图片  EXIT外部中断 HAL库+cubeMX_第2张图片

1.系统内核
2.中断管理
3.选择抢占优先级和响应优先级,共有5个等级,在这里就使用库函数编写代码时最常用的2位抢占优先级2位响应优先级。
4.勾选使能选项,后面的两个零,第一个代表抢占优先级的等级,第二个代表子优先级的等级。

二.配置外部中断对应引脚 

EXIT外部中断 HAL库+cubeMX_第3张图片

1.系统内核
2.GPIO相关配置
3.GPIO的模式,由于引脚配置为中断模式,故在当前的GPIO模式下,会显示出6种外部触发模式,分别为:外部中断上升沿触发,外部中断下降沿触发,外部中断上升沿下降沿触发,外部上升沿触发时间,外部下降沿触发事件,外部上升沿下降沿触发事件。
4.由于选择了上升沿触发,为了使上升沿触发更加稳定,故将引脚下拉。

三.生成代码

//stm32f1xx_hal_msp.c里面有 void HAL_MspInit(void),配置中断优先级分组

void HAL_MspInit(void)
{
  /* USER CODE BEGIN MspInit 0 */

  /* USER CODE END MspInit 0 */

  __HAL_RCC_AFIO_CLK_ENABLE();
  __HAL_RCC_PWR_CLK_ENABLE();

  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);

  /* System interrupt init*/

  /** NOJTAG: JTAG-DP Disabled and SW-DP Enabled
  */
  __HAL_AFIO_REMAP_SWJ_NOJTAG();

  /* USER CODE BEGIN MspInit 1 */

  /* USER CODE END MspInit 1 */
}
//GPIO.c里面有配置好的引脚和中断使能

  GPIO_InitStruct.Pin = KEY0_Pin|KEY1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = KEY_UP_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(KEY_UP_GPIO_Port, &GPIO_InitStruct);

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

  HAL_NVIC_SetPriority(EXTI3_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(EXTI3_IRQn);

  HAL_NVIC_SetPriority(EXTI4_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI4_IRQn);
//stm32f1xx_it.c里面有中断服务函数的代码(可以配置各部分的中断服务函数)

void EXTI0_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI0_IRQn 0 */

  /* USER CODE END EXTI0_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  /* USER CODE BEGIN EXTI0_IRQn 1 */
  __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
  /* USER CODE END EXTI0_IRQn 1 */
}

/**
  * @brief This function handles EXTI line3 interrupt.
  */
void EXTI3_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI3_IRQn 0 */

  /* USER CODE END EXTI3_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
  /* USER CODE BEGIN EXTI3_IRQn 1 */
  __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);
  /* USER CODE END EXTI3_IRQn 1 */
}

/**
  * @brief This function handles EXTI line4 interrupt.
  */
void EXTI4_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI4_IRQn 0 */

  /* USER CODE END EXTI4_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
  /* USER CODE BEGIN EXTI4_IRQn 1 */
  __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);
  /* USER CODE END EXTI4_IRQn 1 */
}

四.自己编写

EXIT外部中断 HAL库+cubeMX_第4张图片EXIT外部中断 HAL库+cubeMX_第5张图片

stm32f1xx_hal.c里面设置了中断优先级分组EXIT外部中断 HAL库+cubeMX_第6张图片

void exti_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    __HAL_RCC_GPIOE_CLK_ENABLE();

    gpio_init_struct.Pin = GPIO_PIN_4;
    gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;//设置成中断触发
    gpio_init_struct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOE, &gpio_init_struct);
    
    HAL_NVIC_SetPriority(EXTI4_IRQn, 2, 0);
    HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}

void EXTI4_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    delay_ms(20);
    
    if(GPIO_Pin == GPIO_PIN_4)
    {
        if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)==0)
        {
            HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
        }
    }
}

EXIT外部中断 HAL库+cubeMX_第7张图片

你可能感兴趣的:(HAL库+CubeMX,单片机,嵌入式硬件)