单片机外设快速入门篇(六)——中断篇

一.中断系统的组成

​1. 中断源
触发中断的事件来源,分为 ​外部中断 和 ​内部中断:
​外部中断:按键、传感器信号、通信接口(如UART接收完成)。
​内部中断:定时器溢出、ADC转换完成、PWM周期结束。
​2. 中断向量表
存储中断服务函数(ISR)入口地址的表格,每个中断源对应唯一的中断向量号。
​3. 中断优先级
​抢占优先级:高优先级中断可打断低优先级中断。
​子优先级:相同抢占优先级的中断按顺序处理。
​优先级分组:通过寄存器设置优先级位数(如STM32的NVIC分组)。
​4. 中断控制寄存器
​使能/禁用中断:控制某个中断源是否可触发。
​触发条件设置:上升沿、下降沿、电平触发等。
​标志位管理:记录中断是否发生(需手动清除)。

二.中断处理流程

​中断触发
事件发生(如按键按下) → 中断标志位置1 → 若中断已使能,向CPU发送请求。

​中断响应
CPU完成当前指令 → 保存现场(PC、状态寄存器等) → 跳转到中断向量表指定的ISR入口。

​执行中断服务函数(ISR)​
清除中断标志位(部分单片机自动清除)。
执行事件处理逻辑(如读取传感器数据)。
避免耗时操作(如延时、复杂计算)。

​中断返回
恢复现场 → CPU继续执行原任务。

中断的配置步骤(以STM32外部中断为例)​
​配置GPIO引脚为中断模式

c
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0; // 选择引脚
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 上升沿触发中断
GPIO_InitStruct.Pull = GPIO_PULLDOWN; // 下拉电阻
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA
​配置中断优先级

c
HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0); // 设置中断抢占优先级2,子优先级0
HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 使能中断
​编写中断服务函数(ISR)​

c
void EXTI0_IRQHandler(void) {
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) { // 检查中断标志位
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); // 清除标志位
// 处理逻辑(如翻转LED)
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
}
}

三.配置流程

​选择中断源​(如外部按键、定时器、串口等)。
​配置中断触发条件​(边沿触发、电平触发等)。
​设置中断优先级​(抢占优先级和子优先级)。
​使能中断​(全局中断 + 特定中断源)。
​编写中断服务函数(ISR)​。
​清除中断标志位​(部分单片机需手动清除)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值