stm32f103c8t6外部中断服务函数多次进入
时间: 2023-06-27 14:03:38 浏览: 186
外部中断服务函数多次进入可能是因为中断触发信号不稳定或者中断处理函数执行时间过长导致的。为了解决这个问题,可以采取以下措施:
1. 确保中断触发信号稳定:检查外部信号的电气特性,如电平、斜率、噪声等,确保中断触发信号稳定。
2. 优化中断处理函数:中断处理函数应尽量简洁,避免使用复杂的数据结构和算法。同时,中断处理函数中不能使用延时函数、阻塞函数等会导致中断响应时间过长的函数。
3. 使用优先级抢占机制:优先级抢占机制可以确保高优先级的中断可以打断低优先级的中断,从而避免中断嵌套的问题。在编写中断处理函数时,应根据中断优先级的不同,合理设置中断优先级。
4. 禁止中断嵌套:有些情况下,可能需要禁止中断嵌套,避免中断处理函数被重复调用。可以通过在中断处理函数中设置标志位的方式来实现禁止中断嵌套。
相关问题
stm32f103c8t6外部中断服务函数
### STM32F103C8T6 外部中断 EXTI 中断服务函数 示例代码
STM32F103C8T6 微控制器支持多达 68 个可屏蔽中断通道,其中包括外部中断 (EXTI)[^1]。外部中断可以通过配置 GPIO 引脚来实现,在检测到引脚状态变化时触发中断事件[^2]。
以下是基于 HAL 库的 STM32F103C8T6 外部中断 EXTI 的典型初始化和中断服务函数示例:
#### 初始化代码
```c
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_exti.h"
void GPIO_EXTI_Config(void) {
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
// 启用 GPIOA 和 AFIO 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
// 配置 PA5 作为输入模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮动输入
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 连接 PA5 到 EXTI Line 5
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
// 配置 EXTI Line 5
EXTI_InitStruct.EXTI_Line = EXTI_Line5;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 设置为中断模式
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
// 配置 NVIC 来使能 EXTI 线中断
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00; // 抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00; // 子优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
```
#### 中断服务函数
在 `stm32f10x_it.c` 文件中定义 EXTI 中断服务函数:
```c
void EXTI9_5_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line5) != RESET) { // 检查是否是 EXTI Line 5 触发
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET) {
// 执行下降沿触发后的逻辑操作
// ...
}
// 清除中断标志位
EXTI_ClearITPendingBit(EXTI_Line5);
}
}
```
如果使用 HAL 库,则可以利用回调函数简化开发流程[^5]:
```c
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if (GPIO_Pin == GPIO_PIN_5) { // 如果是 PA5 引发的中断
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET) {
// 插入具体的业务逻辑
// ...
}
// 可选:清除中断标志位(部分情况下 HAL 自动完成)
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_5);
}
}
```
---
### 关键点说明
- **中断线映射**: STM32 将 GPIO 引脚与 EXTI 线关联起来,例如 PA5 映射至 EXTI Line 5。
- **中断触发方式**: 支持上升沿、下降沿或双边沿触发[^3]。
- **中断优先级配置**: 使用 NVIC 编程接口设置抢占优先级和子优先级[^4]。
- **中断标志清除**: 在 ISR 或回调函数中务必调用相应 API 清楚中断挂起位。
---
stm32f103c8t6外部中断
引用中的代码是一个示例,展示了在STM32中使用外部中断的方式。外部中断在STM32F103C8T6中可以通过配置外部中断线(EXTI)和相应的中断处理函数来实现。
引用[2]中的代码是一个具体的中断处理函数示例,用来处理EXTI14引脚的中断。在中断处理函数中,首先判断是否是EXTI14引发的中断,然后清除中断标志位,以确保程序可以正常返回。
在STM32F103C8T6中,外部中断的优先级可以通过NVIC寄存器进行配置。当多个中断源同时申请中断时,CPU会根据中断源的优先级进行响应,优先处理优先级更高的中断源。
外部中断还支持嵌套中断的功能。当一个中断程序正在运行时,如果有更高优先级的中断源申请中断,CPU会暂停当前中断程序,转而处理更高优先级的中断,处理完成后再依次返回处理原来的中断。
因此,STM32F103C8T6可以通过配置外部中断线和相应的中断处理函数来实现外部中断的功能,并可以通过配置中断优先级和支持中断嵌套来灵活处理多个中断源。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [STM32F103C8T6的学习(4)——外部中断](https://blog.csdn.net/ashun1234/article/details/128432217)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
阅读全文
相关推荐













