STM32F1之中断

1.中断是什么以及作用

以下摘自百度百科

中断指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。

中断处理:

        从查询式的传输过程可以看出,它的优点是硬件开销小,使用起来比较简单。但在此方式下,CPU要不断地查询外设的状态,当外设未准备好时,CPU就只能循环等待,不能执行其它程序,这样就浪费了CPU的大量时间,降低了主机的利用率。 为了解决这个矛盾,我们提出了中断传送方式,即当CPU进行主程序操作时,外设的数据已存入输入端口的数据寄存器;或端口的数据输出寄存器已空,由外设通过接口电路向CPU发出中断请求信号,CPU在满足一定的条件下,暂停执行当前正在执行的主程序,转入执行相应能够进行输入/输出操作的子程序,待输入/输出操作执行完毕之后CPU即返回继续执行原来被中断的主程序。这样CPU就避免了把大量时间耗费在等待、查询状态信号的操作上,使其工作效率得以大大地提高。 能够向CPU发出中断请求的设备或事件称为中断源。而对其的处理方式即中断处理.即当CPU(中央处理器)执行一条现行指令的时候,如果外设向CPU发出中断请求,那么CPU在满足响应的情况下,将发出中断响应信号,与此同时关闭中断,表示CPU不在受理另外一个设备的中断。这时,CPU将寻找中断请求源是哪一个设备,并保存CPU自己的程序计数器(PC)的内容。然后,他将转移到处理该中断源的中断服务程序。CPU在保存现场信息,设备服务(如交换数据)以后,将恢复现场信息。在这些动作完成以后,开放中断,并返回到原来被中断的主程序的下一条指令。

2.中断的基本知识

以下摘自STM32开发手册

CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。而我们常用的就是这 68 个可屏蔽中断,但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个(在 107 系列才有 68 个)。

        中断优先级控制的寄存器组:IPR[15]:全称是: Interrupt Priority Registers,这个寄存器组非常重要! STM32 的中断分组与这个寄存器组密切相关。因为 STM32 的中断多达 60 多个,所以 STM32 采用中断分组的办法来确定中断的优先级。 IPR 寄存器组由 15 个 32bit 的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 15*4=60 个可屏蔽中断。刚好和 STM32的可屏蔽中断数相等。 IPR[0]的[31~24], [23~16], [15~8], [7~0]分别对应中中断 3~0,依次类推,总共对应 60 个外部中断。而每个可屏蔽中断占用的 8bit 并没有全部使用,而是 只用了高4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中中断分组的设置来决定。这里简单介绍一下 STM32 的中断分组: STM32 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。具体的分配关系如表 4.5.1 所示:


STM32F1之中断_第1张图片

        通过这个表,我们就可以清楚的看到组 0~4 对应的配置关系,例如组设置为 3,那么此时所有的 60 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级。每个中断,你可以设置抢占优先级为 0~7,响应优先级为 1 或 0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。这里需要注意两点:第一,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

结合实例说明一下:假定设置中断优先级组为 2,然后设置中断 3(RTC 中断)的抢占优先级为 2,响应优先级为 1。中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。中断 7(外部中断 1)的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为:中断 7>中断 3>中断 6。

中断优先级设置的步骤:
1) 系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和子优先级的分配位数。调用函数为 NVIC_PriorityGroupConfig();
2)设置所用到的中断的中断优先级别。对每个中断调用函数为 NVIC_Init();

STM32 IO 口中断的一些基础概念

STM32 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 的强大之处。普通IO口作为中断使用时需要指定中断线,即EXTI接口。 STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 STM32F103 的19 个外部中断为:
线 0~15:对应外部 IO 口的输入中断。
线 16:连接到 PVD 输出。
线 17:连接到 RTC 闹钟事件。
线 18:连接到 USB 唤醒事件。
从上面可以看出, STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一一对应起来的呢?于是 STM32 就这样设计, GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E, F,G)分别对应中断线 15~0。这样每个中断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、 GPIOB.0、 GPIOC.0、 GPIOD.0、GPIOE.0、 GPIOF.0、 GPIOG.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上了。

STM32F1之中断_第2张图片

3.中断的使用方法

        1) 开启按键外围时钟以及按键的相关配置。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG,ENABLE);

模式一般使用GPIO_Mode_IPU,上拉输入

2)初始化LED的相关配置。

3)开启复用时钟(外部中断,需要使能AFIO时钟)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

4)指定中断线(以PG8为例)-----4)5)步是设置中断线和 GPIO 映射关系,然后设置好了中断的触发模式等初始化参数

GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource8);

5)中断初始化配置

EXTI_InitStructer.EXTI_Line=EXTI_Line8;//中断线8
EXTI_InitStructer.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式触发
XTI_InitStructer.EXTI_Trigger=EXTI_Trigger_Rising_Falling;//任意方式触发
EXTI_InitStructer.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructer);

6)既然是中断,就有中断通道(中断的处理函数),中断优先级,STM32 的 IO 口外部中断函数只有 6 个,

分别为:
EXPORT EXTI0_IRQHandler
EXPORT EXTI1_IRQHandler
EXPORT EXTI2_IRQHandler
EXPORT EXTI3_IRQHandler
EXPORT EXTI4_IRQHandler
EXPORT EXTI9_5_IRQHandler
EXPORT EXTI15_10_IRQHandler
中断线 0-4 每个中断线对应一个中断函数,中断线 5-9 共用中断函数 EXTI9_5_IRQHandler,中断线 10-15 共用中断函数 EXTI15_10_IRQHandler

NVIC_InitStructer.NVIC_IRQChannel=EXTI9_5_IRQn;//PG8中断线为EXTI8,对应EXTI9_5_IRQn
NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructer.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructer);

 7)编辑中断处理函数,void EXTI9_5_IRQHandler(void)

在此函数中先判断某个中断线是否产生了中断,if(EXTI_GetITStatus(EXTI_Line8)!=RESET)

如果发生了,在做相应的逻辑处理。

最后必须要清除某个中断线上的中断标志位,EXTI_ClearITPendingBit(EXTI_Line8);



你可能感兴趣的:(STM32)