B站铁头山羊stm32课程学习笔记——中断

 (目前看过的stm32的最佳教程,推荐大家学习)

1、中断的概念

      中断是stm32单片机很多外设都自带的一种功能(机制)。外设中断被“激活”(使能)后,若stm32单片机接收到突发事件信号,CPU会立即暂停当前运行的程序,转而去执行中断响应函数,在执行完中断响应函数后,继续执行常规程序。

(中断编程基本模型 )

 下面通过一个例子来理解中断编程的优点:

        实现单片机闪灯的同时接收数据,如下图

     单片机在读取Rx引脚收到的数据时,需要先经过两级缓冲,每级缓冲只能存取1个字节。若读取不及时,缓冲中的字节会被后面接收的字节覆盖,导致数据的丢失。如下图,向单片机发送“1 2 3 4 5”五个字节,若不及时读取缓冲中的字节,就会导致缓冲中的‘2 3 4’字节被后来接收到的‘5’覆盖。

     经过计算,串口接收5个字节只需要0.5ms(即5个字节全部进入缓冲的时间) ,但闪灯程序的执行至少需要400ms。若在闪灯程序执行过程中接收到5个字节,单片机此时需要执行完闪灯程序后才能执行读取字节的命令。缓冲中的字节不能及时读取,就会被后来接收到的字节覆盖,导致数据丢失。

                                             

   中断编程可以很好解决上述问题,“激活”(使能)串口的中断功能,单片机就可以在接收到数据时,打断闪灯程序的执行,转而去读取数据。如下图:

 

2、中断优先级 

        在中断优先级这部分涉及三个概念中断优先级分组中断嵌套中断排队

2.1、中断优先级分组 

         中断优先级由4个bit组成,取值范围为0000~1111,即中断优先级取值范围为0~15。中断优先级分组则是将4个bit划分为两组,分为 抢占优先级  子优先级。

        中断优先级值越小,优先成度越高。所以0000为最高优先级,1111为最低优先级。   

             

2.2、抢占优先级与子优先级

          下图展现了如何计算抢占优先级与子优先级。 

           ​​​​​​

2.3、中断排队

         中断排队抢占优先级子优先级都有关。即中断优先级越高,中断排队越靠前。

           

2.4、中断嵌套 

          中断嵌套顾名思义,就是在中断响应函数执行过程中触发新的中断。中断嵌套触法的条件是:新中断的抢占优先级更高。 

        

3、NVIC模块 

        NVIC全称 (Nested Vectored Interrupt Controller)用于管理和控制各个模块的中断。由下图可以看出NVIC模块负责中断优先级分组、使能中断等。

                                                              

    在CubeMax中就是通过NVIC模块使能中断、设置中断优先级分组和设置中断优先级。 

                                                                        

<think>好的,我现在需要帮助用户查找关于STM32外部中断EXTI的教程或笔记,特别是铁头山羊的相关内容。根据用户提供的引用,引用2和3提到了铁头山羊STM32学习笔记,其中引用2是关于中断、NVIC和EXTI的,而引用3是关于GPIO工作模式的。用户的问题主要集中在EXTI中断配置上,所以应该重点参考引用2。 首先,我需要确认用户提到的铁头山羊笔记内容是否涵盖EXTI的配置步骤。根据引用2的标题,确实涉及了中断、NVIC和EXTI,所以这部分内容应该有用。接下来,我需要整理出EXTI配置的关键步骤,包括GPIO初始化、EXTI线路配置、中断优先级设置(NVIC)以及中断服务函数的编写。 用户可能需要的步骤包括: 1. GPIO模式设置:输入模式,如上拉或下拉,根据硬件设计选择。 2. EXTI线路配置:将GPIO引脚连接到EXTI线路,可能需要使用AFIO来重映射。 3. 触发边沿选择:上升沿、下降沿或双边沿触发。 4. NVIC配置:设置中断优先级,启用对应的中断通道。 5. 编写中断服务函数:处理中断事件,清除中断标志位。 另外,用户提供的引用3提到GPIO的内部结构,如施密特触发器和输入/输出寄存器,这些可能影响中断响应的稳定性,所以在配置GPIO时需要注意这些硬件特性。 需要确保步骤中提到的寄存器操作和库函数(如HAL库或标准外设库)的正确性。例如,使用HAL_GPIO_Init函数配置GPIO,以及EXTI_InitTypeDef结构体来设置EXTI参数。同时,中断服务函数的命名需要符合标准,比如EXTI0_IRQHandler对应EXTI线路0的中断。 可能的问题点:用户是否使用特定的开发库(如HAL库或标准库)?不同库的函数名称和配置方法可能不同,但用户提供的引用中没有明确说明,因此可能需要通用步骤,或者指出不同库之间的差异。 最后,生成的相关问题需要围绕EXTI配置的细节、常见问题、应用场景等,帮助用户进一步理解。例如,如何选择触发边沿,如何防止抖动,EXTI与其他中断的优先级处理等。</think>### STM32 EXTI外部中断配置教程 根据铁头山羊STM32学习笔记[^2][^3],STM32的EXTI(外部中断)配置主要涉及GPIO工作模式、中断触发条件及NVIC优先级设置。以下是关键步骤: --- #### **1. GPIO模式配置** - **输入模式选择**:将GPIO设置为**浮空输入(Input floating)**或**上拉/下拉输入**,具体根据硬件电路设计决定。例如,按键通常配置为上拉输入,默认高电平,按下后接地触发低电平[^3]。 - **内部结构影响**:GPIO内部包含施密特触发器,用于信号整形,确保中断触发稳定性。 ```c // 示例:配置PA0为上拉输入(HAL库) GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` --- #### **2. EXTI线路配置** - **映射GPIO到EXTI**:通过AFIO(复用功能IO)将GPIO引脚连接到EXTI线路。例如,PA0对应EXTI0,PB0也对应EXTI0,需通过AFIO选择具体引脚。 - **触发条件设置**:选择**上升沿(Rising Edge)**、**下降沿(Falling Edge)**或双边沿触发。 ```c // 示例:配置PA0为EXTI0,下降沿触发(标准库) EXTI_InitTypeDef EXTI_InitStruct = {0}; EXTI_InitStruct.EXTI_Line = EXTI_Line0; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStruct); ``` --- #### **3. NVIC中断优先级配置** - **启用中断通道**:通过NVIC(嵌套向量中断控制器)设置中断优先级。例如,EXTI0的中断通道为`EXTI0_IRQn`[^2]。 - **优先级分组**:建议使用`HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)`设置优先级分组。 ```c // 示例:配置EXTI0中断优先级(HAL库) HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); ``` --- #### **4. 编写中断服务函数** - **函数命名规则**:中断服务函数需与向量表定义一致,例如EXTI0的中断函数为`EXTI0_IRQHandler`。 - **清除中断标志**:在函数内必须调用`__HAL_GPIO_EXTI_CLEAR_IT()`或手动清除标志位,避免重复触发。 ```c // 示例:EXTI0中断服务函数 void EXTI0_IRQHandler(void) { if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) { // 处理中断事件(如计次) __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); } } ``` --- #### **常见问题** 1. **中断未触发**:检查GPIO模式、EXTI线路映射是否正确,NVIC是否启用。 2. **信号抖动**:硬件添加电容滤波,或软件去抖动(如延时检测)。 3. **多引脚共用EXTI线**:同一EXTI线(如EXTI0)只能处理一个引脚的中断,需避免冲突。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值