EXTI外部中断

rain 发布于 2022-08-16 868 次阅读


概述

什么是中断,那么简单打个比方:你当前在做饭,切菜的时候不小心将手指伤了,你会停止切菜,去处理好伤口后再回来继续做饭。你伤到手后去处理伤口就是中断,处理好后又继续回来做饭。

先让我们大概来了解以下stm32的中断工作原理

在程序中工作流程简单来说就是:EXTI中断-->中断向量表-->偏移入口地址-->中端服务函数

中断向量表,基本上所有的外设,都有中断。所以中断很重要属于外部中断的线共有16条,引脚数量多于16,所以引脚要共用外部中断线。

CubeMX配置外部中断

我们仍配置按键为外部中断输入源,所以把引脚PA1配置为外部中断。然后设置为高电平触发。

配置中断优先级

在NVIC中使能外部中断,并分配优先级

生成的代码及详解

1.设置优先级分组,在HAL_Init()函数里面设置一次即可

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
优先级分组AIRCR[10: 8]bit[7: 4]分配情况分配结果
01110: 40 位抢占优先级, 4 位响应优先级
11101: 31 位抢占优先级, 3 位响应优先级
21012: 22 位抢占优先级, 2 位响应优先级
31003: 13 位抢占优先级, 1 位响应优先级
40114: 04 位抢占优先级, 0 位响应优先级

抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。

2.使能对应 GPIO 口时钟。


3. 设置 GPIO 工作模式,触发条件,开启 AFIO 时钟,设置 IO 口与中断线的映射关系。
这些步骤 HAL 库全部封装在 HAL_GPIO_Init 函数里面,我们只需要设置好对应的参数,
再调用 HAL_GPIO_Init 函数即可完成配置

4.设置中断优先级

HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0);

5.使能中断

HAL_NVIC_EnableIRQ(EXTI1_IRQn);

6.编写中断函数

  GPIO_InitTypeDef GPIO_InitStruct;

/*开启按键GPIO口的时钟*/
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

/* 选择按键1的引脚 */
  GPIO_InitStruct.Pin = GPIO_PIN_1;

/* 设置引脚为输入模式 */ 
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

/* 设置引脚不上拉也不下拉 */
  GPIO_InitStruct.Pull = GPIO_NOPULL;

/* 使用上面的结构体初始化按键 */
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/* 配置 EXTI 中断源 到key1 引脚、配置中断优先级*/
  HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0);

/* 使能中断 */
  HAL_NVIC_EnableIRQ(EXTI1_IRQn);

生成的中断处理函数在stm32f1xx_it.c文件中

void EXTI1_IRQHandler(void)
{
//确保是否产生了EXTI Line中断
	if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_1) != RESET) 
	{
		// 红色LED亮		
		LED_R_ON;;
    //清除中断标志位,不清除中断的话就会一直产生中断
		__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);     
	}  
}
  • alipay_img
  • wechat_img
想法不去做终究就只是想法
最后更新于 2022-08-16