
本文共 2463 字,大约阅读时间需要 8 分钟。
文章目录
- 前言
- 一、中断の概念
- 术语解释
- 个人理解
- 二、中断相关的寄存器及其设置方法 -寄存器概述 -中断优先级 -中断嵌套
- 三、配置中断的步骤及其库函数 -配置步骤 -中断服务函数 -编写中断配置函数
- 四、中断配置的模板
前言
中断是单片机处理程序运行中出现的“紧急事件”整个过程,程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,单片机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序中断。
中断可分为可屏蔽中断和不可屏蔽中断两类:可由程序控制其屏蔽的中断称为可屏蔽中断,屏蔽时,单片机将不接受中断(即不进入中断服务程序),反之,不能由程序控制其屏蔽,单片机一定要立即处理的中断称为不可屏蔽中断。
一、中断の概念
术语解释
中断可分为可屏蔽中断和不可屏蔽中断两类:可由程序控制其屏蔽的中断称为可屏蔽中断,屏蔽时,单片机将不接受中断(即不进入中断服务程序),反之,不能由程序控制其屏蔽,单片机一定要立即处理的中断称为不可屏蔽中断。
个人理解
通过对比学习法,中断可以类比委托式事件处理:为单片机的特定组件指定中断的触发条件,编写中断服务函数处理发生的中断,这样编写单片机程序时即可站得高,望得远,把握主流程,从细枝末节中抽身。
二、中断相关的寄存器及其设置方法
寄存器概述
在 core_cm3.h
中定义了 NVIC_Type
结构体,包含多个寄存器:
ISER
:中断使能寄存器ICER
:中断清除寄存器ISPR
:中断使能悬起寄存器ICPR
:中断清除悬起寄存器IABR
:中断有效位寄存器IP
:中断优先级寄存器STIR
:软件触发中断寄存器
在配置中断时,通常只需使用 ISER
、ICER
和 IP
三个寄存器。
中断优先级
中断优先级由 NVIC_IPRx
寄存器控制,宽度为 8bit,每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。
中断优先级分为抢占优先级(主优先级)和子优先级。为了管理优先级组,STM32F103系列支持四种优先级组:
- NVIC_PriorityGroup_0:0 bits for pre-emption priority,4 bits for subpriority
- NVIC_PriorityGroup_1:1 bits for pre-emption priority,3 bits for subpriority
- NVIC_PriorityGroup_2:2 bits for pre-emption priority,2 bits for subpriority
- NVIC_PriorityGroup_3:3 bits for pre-emption priority,1 bits for subpriority
- NVIC_PriorityGroup_4:4 bits for pre-emption priority,0 bits for subpriority
通常选择 NVIC_PriorityGroup_2
作为默认优先级组。
中断嵌套
中断嵌套是指单片机正在执行中断1的服务函数过程中,接收到中断2的请求。中断2的主优先级如果低于中断1的主优先级,单片机会暂停中断1的服务函数,进入中断2的服务函数。若中断2的主优先级高于中断1的主优先级,则必须等待中断1的服务函数执行完毕才能响应中断2。
三、配置中断的步骤及其库函数
配置步骤
确定中断源:根据外设类型确定中断源。例如,I2C、SPI、USART 等外设的发送完成、中断、接收完成中断,GPIO 的上升沿、下降沿中断,定时器的计时中断等。
初始化 NVIC:使用 NVIC_InitTypeDef
结构体配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求。
编写中断服务函数:在 stm32f10x_it.c
中编写中断服务函数,确保函数名与启动文件预先设置的一致。
使能外设中断:调用外设相关的中断使能函数。
中断服务函数
中断服务函数的实现步骤如下:
// 示例中断服务函数void外设名_IRQHandler(void) { if ((外设名_GetITStatus(中断标志位) != RESET) { // 依据具体外设处理中断 外设名_ClearITPendingBit(中断标志位); // 做不耗时操作 }}
四、中断配置的模板
以下是一个中断配置的示例模板:
/** 配置嵌套向量中断控制器NVIC */static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; // 配置为优先级组2 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断源 NVIC_InitStructure.NVIC_IRQChannel = 中断源; // 设置抢占优先级 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 设置子优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 使能中断通道 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);}
总结
本文总结了 STM32F103 系列单片机中断的相关知识,包括中断的概念、寄存器配置方法、配置步骤以及中断服务函数的编写。通过本文,读者可以掌握中断的设置方法,并能够在实际项目中灵活应用。